牛顿迭代法(C程序设计,习题7.12笔记)

一.题目

用牛顿迭代法求根. 方程为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;
}

你可能感兴趣的:(C)