2-2 二分法求函数的零点

文章描述了如何使用二分法在给定的数学函数f(x)中找到一个唯一的根,该函数在区间[1.5,2.4]内满足f(1.5)>0和f(2.4)<0。通过不断缩小区间并判断中点函数值的符号,最终找到满足fabs(f(x))<1e-7的近似根。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有函数:f(x)=x5−15x4+85x3−225x2+274x−121
已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。
提示:判断函数是否为0,使用表达式 fabs(f(x)) < 1e-7

输入格式:

无。

输出格式:x

该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。。

记录做题思路,可能会有错误。

#include<iostream>
#include<cmath>
using namespace std;
double f(double x)
{
    return pow(x,5)-15*pow(x,4)+85*pow(x,3)-225*pow(x,2)+274*x-121;
}
double point(double a,double b)
{
    double min =1e-7;
    while (fabs(b-a)>min)
    {
    double c = (a+b)/2.0;
    double fc=f(c);
    if(fabs(fc)<min)
    {
        return c;
    }
        else if(f(b)*fc>0)
        {
            b=c;
        }
        else a=c;
}
     return a;
}
int main()
{
    double point1=point(1.5,2.4);
    cout<<fixed;
    cout.precision(6);
    cout<<point1<<endl;
}

数学问题找零点。

故为函数等于0的点。

我们可以联想到二分查找法,取中点来求零点。

根据图中我们可以知道零点的左右边界是(1.5,2.4)。

接着题,就是不断缩小左右边界的

可以分成三种情况

  1. a与b的中点c=(a+b)/2,c刚好是零点。
  2. b点的值*c点的值>0,故b和c在同一边,故两个的值都<0;所以已经过了零点值,我们应当缩小范围,把c赋值给b,相当于在a与c之间进行取中点代入计算。
  3. b点的值*c点的值>0,故b和c不在同一边,故c的值>0,他们异号,所以中间有零点值。故可以把左边界的范围缩小,a=c;

下面是一个普通的二分查找的代码,是不是超级像。

#include <iostream>
using namespace std;
int Search(int a[], int left, int right, int x) {
    while (left <= right) {
        // int mid = left + (right - left) / 2;  
        int mid = (left + right)/2;
        if (a[mid] == x) {
            return mid; 
        }
        if (a[mid] < x) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return -1;
}
int main(){
    int n,x;
    cin>>n>>x;
    int a[n];
    for(int i =0;i<n;i++)
    {
cin>>a[i];  
    }
    cout<<Search(a,0,4,x);
    
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值