C++用牛顿迭代法求根。方程为ax^3+bx^2+cx+d=0。系数a,b,c,d由主函数输入,求x在1附近的1个实根。
求出的根由主函数输出。下面的分函数我看不太懂能哪位大神给每句话注释出来一下吗,尤其是在做循环的这一部分,谢谢啦#include<iostream>#include<cma...
求出的根由主函数输出。
下面的分函数我看不太懂能哪位大神给每句话注释出来一下吗,尤其是在做循环的这一部分,谢谢啦
#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);
} 展开
下面的分函数我看不太懂能哪位大神给每句话注释出来一下吗,尤其是在做循环的这一部分,谢谢啦
#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);
} 展开
1个回答
展开全部
牛顿迭代法的基本原理是,给定一个初始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);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |