7-166 二分法求多项式单根 (20 分)

简介: 7-166 二分法求多项式单根 (20 分)

7-166 二分法求多项式单根 (20 分)


二分法求函数根的原理为:如果连续函数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,重复循环。


本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a,b]内的根。


输入格式:


输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。


输出格式:


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


输入样例:


1. 3 -1 -3 1
2. -0.5 0.5


输出样例:


0.33

 

15分的代码


#include<iostream>
using namespace std;
int main(){
    int a3,a2,a1,a0;
    double a,b,mid,x,y,z;
    cin>>a3>>a2>>a1>>a0;
    cin>>a>>b;
    while(1){
        mid=(a+b)/2;
        x=a3*a*a*a+a2*a*a+a1*a+a0;
        y=a3*b*b*b+a2*b*b+a1*b+a0;
        z=a3*mid*mid*mid+a2*mid*mid+a1*mid+a0;
        cout.precision(2);
        if(z==0){cout<<fixed<<mid;break;}
        if(b-a<0.001){
            cout<<fixed<<mid;
            break;
        }
        if(z*x>0)a=mid;
        if(z*y>0)b=mid;
    }
    return 0;
}


改进后的


#include<bits/stdc++.h>
using namespace std;
typedef double d;
d fx(d x,d a3,d a2,d a1,d a0){
    d ans;
    ans=a3*x*x*x+a2*x*x+a1*x+a0;
    return ans;
}
int main(){
    d a3,a2,a1,a0,a,b,x,ansa,ansb,ans;
    cin>>a3>>a2>>a1>>a0>>a>>b;
    cout.precision(2);
    ansa=fx(a,a3,a2,a1,a0);
    ansb=fx(b,a3,a2,a1,a0);
    if(ansa*ansb>0){
        cout<<fixed<<(a+b)/2;
        return 0;
    }
    while(1){
        x=(a+b)/2;
        ans=fx(x,a3,a2,a1,a0);
        ansa=fx(a,a3,a2,a1,a0);
        ansb=fx(b,a3,a2,a1,a0);
        if(b-a<0.001){
            cout<<fixed<<x;
            return 0;
        }
        if(ansa==0){
            cout<<fixed<<a;
            return 0;
        }
        if(ansb==0){
            cout<<fixed<<b;
            return 0;
        }
        if(ans==0){
            cout<<fixed<<x;
            return 0;
        }
        if(ans*ansa>0)a=x;
        if(ans*ansb>0)b=x;
    }
    return 0;
}
目录
相关文章
|
8月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
人工智能
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
|
8月前
2572. 无平方子集计数(状态压缩dp)
2572. 无平方子集计数(状态压缩dp)
|
8月前
DAY-4 | 力扣 - 求自身以外数组的乘积:区间划分,左右累乘,巧求乘积
该文档是关于LeetCode上的一道题目“Product of Array Except Self”的题解。提供了两种解题方法,一是暴力破解,即计算所有数的乘积后再逐个除以当前元素;二是左右累乘法,通过两次遍历数组分别计算左侧和右侧元素的乘积,避免了除法操作。其中,左右累乘法更优,代码实现中展示了这种方法。
56 1
|
8月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
人工智能 算法
动态规划之区间一维
噩梦中的仙境:动态规划之区间一维
82 0
动态规划之区间一维
L2-018 多项式A除以B (25 分)(数组模拟)
L2-018 多项式A除以B (25 分)(数组模拟)
189 0
L2-018 多项式A除以B (25 分)(数组模拟)
|
存储 算法
算法 |【实验5.3】:一元三次方程的根-连续区间的二分搜索求近似解
算法 |【实验5.3】:一元三次方程的根-连续区间的二分搜索求近似解
178 0
算法 |【实验5.3】:一元三次方程的根-连续区间的二分搜索求近似解
|
算法
区间问题(贪心)(一)
复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
137 0
区间问题(贪心)(一)
|
存储 C++
区间问题(贪心)(二)
AcWing 906. 区间分组
88 0
区间问题(贪心)(二)