【题目链接】
ybt 1241:二分法求函数的零点
OpenJudge NOI 1.11 02:二分法求函数的零点
【题目考点】
1. 二分 实数域二分查找
代码模板为:
while(r - l >= 1e-x)//保留到小数点后x+1位
{
double mid = (l+r)/2;
if(要查找的结果小于m)
r = m;
else
l = m;
}
【解题思路】
二分求函数零点,用实数域二分查找方法。
设
l
l
l与
r
r
r为给定区间的左右端点,已知
f
(
l
)
∗
f
(
r
)
<
0
f(l)*f(r)<0
f(l)∗f(r)<0,且
f
(
x
)
f(x)
f(x)在这个区间内只有一个零点。
二分查找,取中点
m
=
(
l
+
r
)
/
2
m=(l+r)/2
m=(l+r)/2,
- 如果
f
(
l
)
∗
f
(
m
)
>
0
f(l)*f(m) > 0
f(l)∗f(m)>0,说明二者符号相同,零点不在左半边,在右半边,取
l = m
- 如果
f
(
l
)
∗
f
(
m
)
<
0
f(l)*f(m) < 0
f(l)∗f(m)<0,说明二者符号相反,零点在左半边,取
r = m
直到 l l l与 m m m的差值满足精度要求为止。
【题解代码】
解法1:二分:实数域二分查找
#include<bits/stdc++.h>
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;
}
int main()
{
double l = 1.5, r = 2.4, m;
while(r - l >= 1e-7)//保留到小数点后6位
{
m = (l + r) / 2;
if(f(l)*f(m) > 0)
l = m;
else
r = m;
}
cout << fixed << setprecision(6) << m;
return 0;
}