牛顿迭代法和二分法求方程的根

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyzsir/article/details/78712887

使用牛顿迭代法(在1.5附近)和二分法(在(-10,10)区间内)求2*x*x*x-4*x*x+3*x-6=0的根

牛顿迭代法:

算法分析:假设方程f(x)=0,在x0附近有一个根,那么用xn+1=xn-f(xn)/f’(xn)。依次计算x1,x2,x3,…………,那么这个序列无限逼近方程的根。原理是根据f(x)在x0附近的值和斜率,估计f(x)和x轴的交点。

#include<stdio.h>
int main()
{
    double x=1.5;     
    double fx,f1x,eps=0.00001;
    do
    { 
        fx=2*x*x*x-4*x*x+3*x-6;   
        f1x=6*x*x-8*x+3;
        x=x-fx/f1x;      
        if(fx<0)fx=-fx;   
        if(fx<eps)break;
    }while(1>0);
    printf("%lf",x);
    return 0;
}

二分法:

算法分析:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法。

#include<stdio.h>
int main()
{
    double l=-10.0,h=10.0;     //划定区间,默认函数在-10出取负值,在10处取正值
    double m,fm,eps=0.000001;  //规定逼近值eps
    do
    {
        m=(l+h)/2;         //找到区间中点
        fm=2*m*m*m-4*m*m+3*m-6;    //计算区间中点函数值
        if(fm<0)l=m;       //如果区间中点函数值为负值,将区间最小端点赋为区间中点
        else h=m;          //如果区间中点函数值为正值,将区间最大端点赋为区间中点
        if(fm<0)fm=-fm;    //如果函数值为负值化为正值便于和eps比较,此处和上述任何一个步骤无关
        if(fm<eps)break;   //如果函数值趋近与eps,即得到根m
    }while(1);
    printf("%lf",m)
    return 0;
}



猜你喜欢

转载自blog.csdn.net/yyzsir/article/details/78712887
今日推荐