Я пытаюсь приблизить корень многочлена, используя метод Ньютона-Рафсона. Код, который я написал, выглядит следующим образом:
#include <stdio.h>
#include <math.h>
int main (){
double c, nq, nnq, nnnq, v, h, q, o;
o=2;
c=-0.55;
nq=-0.04625;
nnq=-0.55;
nnnq=1;
while(fabs(c-v) > 0.000001)
{
nq=((2*(o-1)+1)*(c)*(nnq)-(o-1)*nnnq)/((o-1)+1);
q=(-o*c*nq+o*nnq)/(1-(c*c));
h=(c-(nq/q));
printf("The better root is %.15lf\n",h);
v=c;
c=h;
}
}
Я знаю, что нет необходимости записывать переменные o, c, nq и т. Д. Sin, я мог бы просто использовать их точные значения. Это часть более крупной проблемы, и мне нужны эти переменные, поэтому игнорируйте это.
Эта программа выводит это:
The better root is -0.578030303030303
The better root is -0.591696792857493
The better root is -0.598609887802599
The better root is -0.602171714355970
The better root is -0.604024260228500
The better root is -0.604992519745332
The better root is -0.605499890229896
The better root is -0.605766110042157
The better root is -0.605905895095070
The better root is -0.605979319651017
The better root is -0.606017894664121
The better root is -0.606038162857992
The better root is -0.606048812800124
The better root is -0.606054408979837
The better root is -0.606057349623975
The better root is -0.606058894866533
The better root is -0.606059706860161
Когда вместо этого он должен сходиться к точке -0.57735026918963. Я знаю, что Ньютон-Рафсон точно сходится, поэтому ошибка должна быть в коде. Я также пытался локализовать проблему с помощью printf, и я думаю, что проблема возникает во второй итерации. Я думаю, что программа не может правильно рассчитать nq, но я не знаю почему.