c语言求解一元三次方程(二分法和公式法)

一、二分法

1.二分法概念:二分法,又称分半法,是一种方程式根的近似值求法。对于区间[m,n]上连续不断且f(m)*f(n)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫做二分法(bisection)。

2.二分法思路:

(1)求已知函数f(x)=0的根,先找一个区间[m,n],使得f(m)*f(n)<0,即f(m)与f(n)异号,根据介值定理,这个区间内一定包含着方程式的根。

(2)求该区间的中点i=(m+n)/2,并找出f(i)的值。

(3)若f(i)与f(m)同号,即f(m)*f(i)>0,则取新的区间[i,n],否则取[m,i]。

(4)重复第二步和第三步,直到得到理想的精确度为止。

3.以下为二分法解题的代码(用codeblocks可运行)

#include<stdio.h>
#include<math.h>
int main()
{
    double m,n;
    double i,sum;
    double eps=1e-6;//eps是精度控制,此处为10^-6,表示无限小
    double a,b,c,d;
    double f1,f2;
    
    printf("请输入一元三次方程标准形式a*x^3+b*x^2+c*x+d的系数a b c d:\n");
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    printf("请输入取值区间:\n");
    scanf("%lf%lf",&m,&n);//注意abcdmn都是%lf而不是%d
    f1=a*pow(m,3)+b*pow(m,2)+c*m+d;//pow(x,y)=x^y,幂函数
    f2=a*pow(n,3)+b*pow(n,2)+c*n+d;
    //判断f1*f2<0是主要代码
    if(f1*f2<0)
    {
        while(fabs(m-n)>eps)
        {
            i=(m+n)/2;
            sum=a*pow(i,3)+b*pow(i,2)+c*i+d;
            if(fabs(sum)<eps)//如果函数f(i)的绝对值|sum|小于无限小
            {
                printf("方程的一个近似解为x*=%lf\n",i);
                break;
            }
            else if(f1*sum<0)
            {
                n=i;
            }
            else if(f2*sum<0)
            {
                m=i;
            }
        }
    }
    //如果刚好区间取值为方程解
    else if(f1*f2==0)
    {
        if(f1==0)
        { printf("方程的一个解为x*=%lf\n",m);}
        if(f2==0)
        { printf("方程的一个解为x*=%lf\n",n);}
    }

    else
    { printf("方程在该区间内无解!\n");}
    return 0;
}

4.运行结果如下:

参考文章:

https://jingyan.baidu.com/article/597a06438def54312a524376.html

https://blog.csdn.net/Xue_fabulous/article/details/105125596

二、公式法

参见小小小罗成的文章https://blog.csdn.net/weixin_44889344/article/details/108700037

  • 6
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值