C语言程序设计整理(2)用二分法和牛顿迭代法求解三次方程的根

【问题描述】

    用牛顿迭代法和二分法,分别求解同一个三次方程的根,要求精度为 e。

    牛顿迭代法的公式如下:

        x_{n+1}=x_{n}-\frac{f(x_{n})}{f^{'}(x_{n})}  ,精度e是指  \left | x_{n+1}-x_{n} \right |<e
    二分法的原理可以参考:https://zhuanlan.zhihu.com/p/95708908

    二分法的精度为 e 是指查找区间 [a,b] 满足 b - a < e


【输入形式】

【输出形式】

    输出分4行。

    第一行输出一个浮点数 x0,表示牛顿迭代法的解为 x0

    第二行输出一个整数 c0, 表示牛顿迭代法的迭代次数为 c0

    第三行输出一个浮点数 x1, 表示二分查找法的解为 x1

    第四行输出一个整数 c1, 表示二分查找法的迭代次数为 c1

 【样例输入】

    3 -3 1 -6

    1e-6

    1.5

    -3 3

  【样例输出】

    1.585429

    4

    1.585429

    23

  【样例说明】

    对于二分查找法,最后输出区间右侧的值为近似解。例如若最后的区间为 [0.01,0.02],则输出 0.02 作为其近似解。


  【代码展示】

//用牛顿迭代法和二分法来求三次方程的解
#include<stdio.h>
#include<math.h>
void newton(double a, double b, double c,
            double d, double e, double x);
void halfcut(double low, double high, double a, double b,
            double c, double d, double e);
int main(void)
{
    double a, b, c, d, e, x, low, high;
    double solution;
    scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
    scanf("%lf",&e);
    scanf("%lf",&x);
    scanf("%lf %lf",&low,&high);
    
    newton(a, b, c, d, e, x);
    halfcut(low, high, a, b, c, d, e);
    return 0;
}
void newton(double a, double b, double c,         //牛顿迭代法的函数
            double d, double e, double x)
{
    int k=0; double y, m;
    do
    {
        m = x;
        y = x-(a*pow(x,3)+b*pow(x,2)+c*x+d)/(3*a*pow(x,2)+2*b*x+c);
        x = y;
        k+=1;
    }while (fabs(x-m)>=e);
    printf("%lf\n%d\n",x,k);
    return;
}
void halfcut(double low,double high,double a,double b,
                double c,double d,double e)       //二分法的函数
{
    int k = 0;
    double n=(low+high)/2;
    while ((high-low)>=e)
    {
        if ((a*pow(n,3)+b*pow(n,2)+c*n+d)*(a*pow(low,3)+b*pow(low,2)+c*low+d)<0)
        {
            high = n;
            n = (low+high)/2;
        }
        else
        {
            low = n;
            n = (low+high)/2;
        }
        k+=1;
    }
    printf("%lf\n%d",high, k);
    return;
}

【代码解释】

   本代码主要实现利用牛顿法与二分法分别尽可能的求出一个三次方程的近似解。同样是利用两个函数模块,使程序更具有模块化,更易于理解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值