C代码:二分法求三次方程近似根

先来无事,写了一个简单的二分法求三次方程根的 C 程序,主要代码如下:

#include <stdio.h>
#include <math.h>
//函数声明
float resultOfEquation(float a,float b,float c,float d,float e,float key);
float dichotomyRoot(float a,float b,float c,float d,float e,float lowerLimit,float upperLimit);

int main(int argc, const char * argv[]) {
    // insert code here...
    //求方程 2*pow(x, 3) - 4*pow(x, 2) + 3*x - 6 = 0 在 x = 1.5 附近的根

    //定义变量
    float lowerLimit = 0.0f, upperLimit = 0.0f;
    float resultFunLowerLimit = 0.0f,resultFunUpperLimit = 0.0f;

    //提示输入区间
    printf("请输入求根区间(用空格隔开):\n");

    //判断区间是否合适
    do{
        resultFunLowerLimit = 0.0f,resultFunUpperLimit = 0.0f;
        scanf("%f%f",&lowerLimit,&upperLimit);
        resultFunLowerLimit = resultOfEquation(2,-4,3,-6,0,lowerLimit);
        resultFunUpperLimit = resultOfEquation(2,-4,3,-6,0,upperLimit);

        if (resultFunLowerLimit * resultFunUpperLimit > 0) {
            //提示重新输入区间
            printf("区间输入有误,请重新输入(用空格隔开):\n");
            continue;
        }
    }while(resultFunLowerLimit * resultFunUpperLimit > 0);

    //调用求根函数求方程根
   float root =  dichotomyRoot(2, -4, 3, -6, 0, lowerLimit, upperLimit);
    //打印结果
    printf("root = %.2f\n",root);
    return 0;
}

//二分法求根
 float dichotomyRoot(float a,float b,float c,float d,float e,float lowerLimit,float upperLimit){

     //定义变量
     float mid = (lowerLimit + upperLimit) / 2;
     float resultFunLowerLimit = 0.0f;
     float resultFunUpperLimit = 0.0f;
     float resultFunMid = 0.0f;
     //判断下限是否小于上限,否则换位
     if (lowerLimit >= upperLimit) {
         //若下限大于上线,进行交换
         lowerLimit = lowerLimit + upperLimit;
         upperLimit = lowerLimit - upperLimit;
         lowerLimit = lowerLimit - upperLimit;
     }

     //计算函数值                                             //计算函数值放在此处,有重复计算?
     resultFunLowerLimit = resultOfEquation(2,-4,3,-6,0,lowerLimit);
     resultFunUpperLimit = resultOfEquation(2,-4,3,-6,0,upperLimit);
     //循环求根
     do{
         mid = (lowerLimit + upperLimit) / 2;
         resultFunMid = resultOfEquation(2,-4,3,-6,0,mid);
         if (resultFunLowerLimit * resultFunMid < 0) {
             upperLimit = mid;
             resultFunUpperLimit = resultFunMid;
         }else{
             lowerLimit = mid;
             resultFunLowerLimit = resultFunMid;
         }
     }while (fabs(resultFunMid)>1e-5);
     return mid;
    }

//计算函数值的函数
float resultOfEquation(float a,float b,float c,float d,float e,float key){
    return a*pow(key, 3) + b*pow(key, 2) + c*key + d + e;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值