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;
}
目录
相关文章
|
2天前
2572. 无平方子集计数(状态压缩dp)
2572. 无平方子集计数(状态压缩dp)
|
9月前
|
索引
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
|
10月前
|
算法 内存技术
求组合数三种算法
求组合数三种算法
49 0
|
机器学习/深度学习 算法 Java
排序不等式算法
排序不等式算法
排序不等式算法
|
算法 C++
容斥原理算法的实现
容斥原理算法的实现
容斥原理算法的实现
|
算法 Python
7-2 多项式求和 (10 分)
7-2 多项式求和 (10 分)
128 0
7-1 一元多项式求导 (10 分)
7-1 一元多项式求导 (10 分)
85 0
|
机器学习/深度学习 算法
算法时间复杂度--推导大O阶
记录时间复杂度的计算方法——推导大O阶方法
184 0
|
存储 算法
算法 |【实验5.3】:一元三次方程的根-连续区间的二分搜索求近似解
算法 |【实验5.3】:一元三次方程的根-连续区间的二分搜索求近似解
124 0
算法 |【实验5.3】:一元三次方程的根-连续区间的二分搜索求近似解
|
存储 C++
区间问题(贪心)(二)
AcWing 906. 区间分组
64 0
区间问题(贪心)(二)