опубликован 11-10-2001 17:17 MSK
Решает на C++ методом Ньютона например, просто как дважды два все то же самое только работаешь с комплесными числами, а все это из-за того что есть поддержка в STL работы с комплексными числами.2m_fox: Математики тоже программерами бывают :)
Вот пример на скорую руку:
#include <complex>
using namespace std;
#ifndef _POLINOM_H
#define _POLINOM_H
#define _MAX_POLINOM_POW (100)
#define _EPSILON (1E-12)
typedef struct SPolinom
{
complex <double> mas[_MAX_POLINOM_POW];
int pow;
}*PPolinom,TPolinom;
typedef struct SRoot
{
complex<double> mas[_MAX_POLINOM_POW];
int num;
}*PRoot,TRoot;
inline complex<double> FPol(TPolinom &p,complex<double> &x)
{
int i;
complex<double> tmp= complex<double>(0,0);
for(i=0;i<=p.pow;i++)
tmp=tmp+pow(x,i)*p.mas[i];
return tmp;
}
void FindAllRoot(TPolinom &pp,TRoot &r)
{
int i,j;
complex<double> x1,x0;
TPolinom defp,p;
p=pp;
r.num=p.pow;
for(i=0;i<r.num;i++)
{
defp.pow=p.pow-1;
for (j=0;j<p.pow;j++)
defp.mas[j]=p.mas[j+1]*double(j+1);
x1=complex<double>(1,1);
do
{
x0=x1;
x1=x0-FPol(p,x0)/FPol(defp,x0);
}
while (abs(FPol(p,x1))>_EPSILON);
r.mas[i]=x1;
for(j=p.pow-1;j>=0;j--) p.mas[j]=p.mas[j]+p.mas[j+1]*x1;
for(j=0;j<p.pow;j++) p.mas[j]=p.mas[j+1];
p.pow--;
}
}
#endif //_POLINOM_H