Re: Корни (нули) полинома...
От: OlegO Россия http://www.mediachase.ru
Дата: 03.12.02 08:16
Оценка: 10 (1)
Здравствуйте, Аноним, Вы писали:

А>Здрасте!

А>Кто нибудь может подкинуть алгоритм нахождения корней полинома типа:
А>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]);
}
С уважением, OlegO.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.