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;
}
目录
相关文章
|
Android开发
如何在Android真机上检测是否有Google Map add-on
如何在Android真机上检测是否有Google Map add-on
137 3
|
12月前
|
运维 监控 安全
高效运维管理:从混沌到秩序的艺术
本文深入探讨了高效运维管理的核心要素与实践策略,揭示了从混沌到秩序转变的关键环节。文章首先剖析了当前运维领域面临的挑战与困境,随后提出了一系列创新思路和解决方案,旨在帮助运维团队优化流程、提升效率、确保系统稳定运行。通过案例分析,本文展示了这些策略和方法在实际应用中的效果,为运维人员提供了宝贵的参考和启示。
|
XML 负载均衡 前端开发
ajax的优缺点有哪些?
ajax的优缺点有哪些?
103 1
|
数据安全/隐私保护 开发者 微服务
权限管理-角色分配菜单 | 学习笔记
快速学习 权限管理-角色分配菜单
158 0
|
Oracle 关系型数据库 数据库管理
|
SQL 监控 Oracle
11g dataguard使用总结
11g的dataguard相比于10g来说,最优越的特性应该算就是active dataguard了,这一点改进在很大意义上促使用户需要把数据库从10g升级到11g,读写分离在这个时候得到了升华,而且在后台会根据需要进行数据的同步,相比于使用10g,想读数据的时候把数据库启动到read only 阶段,但这个时候不接受日志同步数据,如果需要同步数据还需要把数据库再启动到mount阶段,感觉还是比较繁琐的。
1310 0
|
SQL 测试技术 iOS开发
6,ORM组件XCode(撬动千万级数据)
有了前面的《动手》,基本上可以进行开发了。本篇我们来试试XCode的基本功功力如何,测试在单表一千万业务数据的环境下查询的速度,添删改等没什么可测试的。其实应该说是XCode开发模式的功力,XCode组件仅仅是处理分页而已,而XCode开发模式为高性能开发提供了更多的建议。
1056 0
|
3天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
354 123
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?

热门文章

最新文章