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

来源:互联网 发布:java 连接两个string 编辑:程序博客网 时间:2024/05/17 21:29

使用牛顿迭代法(在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;}