Здравствуйте, Аноним, Вы писали:
А>Здрасте!
А>Кто нибудь может подкинуть алгоритм нахождения корней полинома типа:
А>a0*x^0 + a1*x^1 + a2*x^2 + .... + aN*x^N = 0
В детстве баловалася, идея перекинуть
метод Ньютона на комплексные числа и находим все корни, даже комплексные:
Вроде какой-то Borland C++ под Дос
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <complex.h>
#define NMAX 20
typedef struct SPolinom
{
complex mas[NMAX];
int pow;
}*PPolinom,TPolinom;
typedef struct SRoot
{
complex mas[NMAX];
int num;
}*PRoot,TRoot;
complex FPol(TPolinom &p,complex &x)
{
int i;
complex tmp=complex(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 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]*(j+1);
x1=complex(1,1);
do
{
x0=x1;
x1=x0-FPol(p,x0)/FPol(defp,x0);
}
while (abs(FPol(p,x1))>1e-12);
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--;
}
}
void main(void)
{
int i=0;
TPolinom p;
TRoot r;
p.pow=2;
p.mas[0]=complex(-1,0);
p.mas[1]=complex(0,0);
p.mas[2]=complex(4,0);
p.mas[3]=complex(1,0);
p.mas[4]=complex(0,0);
p.mas[5]=complex(0,0);
p.mas[6]=complex(6,0);
FindAllRoot(p,r);
cout<<"\n Найдено"<<r.num<<" корней, у полинома "<<p.pow<<" степени.";
for(i=0;i<r.num;i++)
cout<<"\nX["<<i+1<<"]/корень/ = "<<real(r.mas[i])<<" + i * "<<imag(r.mas[i]);
}