0
点赞
收藏
分享

微信扫一扫

二分法求根(c语言)——弦截法计算一元多次方程的根

Gaaidou 2022-01-20 阅读 47

 

 


递归的求法

#include<stdio.h>
#include<math.h>
double root(double,double);
int main()
{
    double x1,x2,ans;
    scanf("%lf%lf",&x1,&x2);
    ans=root(x1,x2);
    printf("%lf\n",ans);
    return 0;
}

double root(double x1,double x2)
{
    double y1,y2,y,x;
    y1 = x1*x1*x1 - 11.1*x1*x1 + 38.8*x1 - 41.77;
    y2 = x2*x2*x2 - 11.1*x2*x2 + 38.8*x2 - 41.77;        //求出函数值

    x = (x1*y2 - x2*y1)/(y2 - y1);                        //求出弦的零点
    y = x*x*x - 11.1*x*x + 38.8*x - 41.77;                //求出对应零点函数值的误差
    if(fabs(y) < 0.00001)                                 //两根精度
        return x;                                        //递归出口
    else if(y*y2<0) 
        return root(x,x2);                                //对应函数值正负的改变
    else 
        return root(x1,x);
}

循环的求法

#include<stdio.h>
#include<math.h>
double root(double,double);
int main()
{
    double x1,x2,ans;
    scanf("%lf%lf",&x1,&x2);
    ans=root(x1,x2);
    printf("%lf\n",ans);
    return 0;
}

double root(double x1, double x2)
{
    double x;
    double f,f1,f2;
    do
    {
        f1=x1 * x1 * x1 - 11.1 * x1 * x1 + 38.8 * x1 - 41.77;
        f2=x2 * x2 * x2 - 11.1 * x2 * x2 + 38.8 * x2 - 41.77;        //函数值求解

        x = (x1 * f2 - x2 * f1)/ (f2-f1);
        f=x * x * x - 11.1 * x * x + 38.8 * x - 41.77;                //弦的零点
        if (f*f1> 0)
             x1 = x;
        else
             x2 = x;                                                  //相当于递归出口
           
     }while (f <= -0.00001 || f >= 0.00001);
     return x;
}
举报

相关推荐

0 条评论