栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二分法求多项式单根 — c语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二分法求多项式单根 — c语言

题目:

编写程序,计算给定3阶多项式f(x)=a3​x^3+a2​x^2+a1​x+a0​在给定区间[a,b]内的根。

原理:

如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

步骤:

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(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个系数a3​、a2​、a1​、a0​,在第2行顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:

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

代码:

#define _CRT_SECURE_NO_WARNINGS
#include
float a3, a2, a1, a0;
float f(float x) {
    float y = 0;
    y = a3 * x * x * x + a2 * x * x + a1 * x + a0;
    return y;
}
int main() {
   
    float left, right, mid;
    scanf("%f %f %f %f", &a3, &a2, &a1, &a0);
    scanf("%f %f", &left, &right);
    float y1, y2, y3;
    while (left <= right) {
        y1 = f(left);
        y2 = f(right);
        if (y1 * y2 <= 0) {
             mid = (left + right) / 2.0;
             y3 = f(mid);
             if (y1 * y3 > 0) {
                left = mid;
             }
             else if (y2 * y3 > 0) {
                right = mid;
             }
             if (y3 == 0) {
                 printf("%.2f", mid);
                 break;
             }
             else if ((right-left)<=0.000001 && y3 != 0) {
                 printf("%.2f", mid);
                 break;
             }
        }
    }
	return 0;
}

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850285.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号