二分法求多项式单根

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0;要求编写程序,计算给定3阶多项式f(x)=a_3x^3+a_2x^2+a_1x+a_0​​在给定区间[a,b]内的根。
二分法的步骤为:
  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2)
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。
输入格式:

输入在第1行中顺序给出多项式的4个系数a_3、a​_2、a_1、a_0

输出格式:

在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:

3 -1 -3 1
-0.5 0.5

输出样例:

0.33

代码如下
#include <stdio.h>
#include <math.h>
int main()
{
    float a3, a2, a1, a0;
    float a, b, m, n, s = 1;
    scanf("%f %f %f %f", &a3, &a2, &a1, &a0);
    scanf("%f %f", &a, &b);
    while(s != 0)
    {
        m = a3 * pow(a, 3) + a2 * pow(a, 2) + a1 * a + a0;
        n = a3 * pow(b, 3) + a2 * pow(b, 2) + a1 * b + a0;
        s = a3 * pow((a + b) / 2, 3) + a2 * pow((a + b) / 2, 2) + a1 * (a + b) / 2 + a0;
        if (m == 0)
        {
            s = 0;
            b = a;
            break;
        }
        if (n == 0)
        {
            s = 0;
            break;
        }
        if (s * m > 0)
            a = (a + b) / 2;
        else
            b = (a + b) / 2;
        if (b - a < 0.001)
            s = 0;
       
    }
    printf("%.2f\n", b);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 算法思想 一、二分查找 1. 算法思想 算法详解 算法细节 一定要看二分查找细节.md 实现时需要注意以下细节: ...
    因丶为阅读 482评论 0 0
  • 1:快速排序 先上模板 然后是习题 785. 快速排序 快速排序的基本思想是基于分治大致思想是假设我们有一个集合q...
    Charon_ted阅读 1,232评论 0 0
  • 3-1 求一元二次方程的根(20 分)本题目要求一元二次方程的根,结果保留2位小数。 输入格式:输入在一行中给出3...
    林之禾阅读 23,755评论 0 7
  • 异地,跟她相聚100多公里,她是家里介绍相亲认识的,高中也是上的一所中学,有一些共同认识的人。因此感觉不算很陌生的...
    刀锋_2669阅读 206评论 0 0
  • 今天我弟弟幼儿园的家访结束了,他们准备回家,暑期培训课结束的我也收拾衣服跟他们去戴南外婆家。在车里我和弟弟从上车到...
    牛小魔阅读 173评论 1 1

友情链接更多精彩内容