C++用牛顿迭代法求根。方程为ax^3+bx^2+cx+d=0。系数a,b,c,d由主函数输入,求x在1附近的1个实根。

求出的根由主函数输出。
下面的分函数我看不太懂能哪位大神给每句话注释出来一下吗,尤其是在做循环的这一部分,谢谢啦
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double solut(double,double,double,double);
double a,b,c,d;
cout<<"input a,b,c,d:";
cin>>a>>b>>c>>d;
cout<<solut(a,b,c,d)<<endl;
return 0;
}

double solut(double a,double b,double c,double d)
{double x=1,x0,f,f1;
do
{
x0=x;
f=((a*x0+b)*x0+c)*x0+d;
f1=(3*a*x0+2*b)*x0+c;
x=x0-f/f1;
}
while(fabs(x-x0)>1e-5);
return(x);
}

牛顿迭代法的基本原理是,给定一个初始x0,做一条垂线与函数f(x)相交,得到的交点为(x0,y0),过该点在f(x)上作一条切线,得到该切线与x轴的交点为(x1, 0)。之后对(x1, 0)重复上述步骤,直到与x轴的交点的横坐标xn逐渐收敛到f(x)=0的根。也就是对于第i+1次迭代(i>=0),有下列等式


    


再来看代码,

double x=1,x0,f,f1; 
do 
{
    x0=x;
    f=((a*x0+b)*x0+c)*x0+d;
    f1=(3*a*x0+2*b)*x0+c;
    x=x0-f/f1;
} while(fabs(x-x0)>1e-5);

其中

f=((a*x0+b)*x0+c)*x0+d;

是用来求f在第i+1次迭代时的,在xi处的值,这里f(x)是一个3次多项式,即


    

f1=(3*a*x0+2*b)*x0+c;

f1是用来求第i+1次迭代时,f在xi处的导数,而f在x处的导数为


    


而循环结束一般是误差在某个范围内,就认为得到解了,所以是

while(fabs(x-x0)>1e-5);

温馨提示:答案为网友推荐,仅供参考
相似回答