用牛顿迭代法求根. 方程为ax^3+bx^2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输入. 求x在1附近的一个实根. 求出根后由主函数输出.
以下是我的解题方法,可能不是最优的方法,推荐看C程序设计习题集.
//牛顿迭代法:不断计算下一个更接近根的值:x2=x1-F(x1)/F'(x1),当F(x2)的绝对值<1e5时,即趋近于0时,x2即为根
//注意性能消耗:1e6为条件要比1e5多出非常多的计算量
#include
#include
float getRoot(int a,int b,int c,int d,float near);
float fx(int a,int b,int c,int d,float x);
float ffx(int a,int b,int c,int d,float x);
int main()
{
int a,b,c,d;
float near;
printf("Enter ax^3+bx^2+cx+d=0's 4 interage values of a,b,c,d: ");
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("Enter a nearly values of x: ");
scanf("%f",&near);
printf("Near %5.3f root is %5.3f .\n",near,getRoot(a,b,c,d,near)); //输出精度不够的话,结果精确度不对
return 0;
}
float getRoot(int a,int b,int c,int d,float near)
{
double x1 = near;
while(fabs(fx(a,b,c,d,x1))>1e-5) //abs求绝对值,输入输出都是整数
{ //1e-5=0.00001,1e5=10000
x1=x1-fx(a,b,c,d,x1)/ffx(a,b,c,d,x1);
}
return x1; //用函数返回所求值的,别忘了返回值
}
float fx(int a,int b,int c,int d,float x)
{
return (a*x*x*x+b*x*x+c*x+d);
}
float ffx(int a,int b,int c,int d,float x)
{
return 3*a*x*x+2*b*x+c;
}