有函数: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)。
接着题,就是不断缩小左右边界的
可以分成三种情况
- a与b的中点c=(a+b)/2,c刚好是零点。
- b点的值*c点的值>0,故b和c在同一边,故两个的值都<0;所以已经过了零点值,我们应当缩小范围,把c赋值给b,相当于在a与c之间进行取中点代入计算。
- 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);
}