二分法求根问题
程序员文章站
2024-03-16 09:01:34
...
一类问题:定义在[L,R]上的单调函数f(x),求方程f(x)=0的根。
1).计算√2的近似值
注意:由于根号√2是无理数,因此只能获得它的近似值,不妨精确到10^-5为例。
分析:对于f(x)=x^2来说,在x∈[1,2]范围内,f(x)是随着x的增大而增大,可采取如下策略逼近√2。
#include <stdio.h>
const double eps=1e-5;
double f(double x){
return x*x;
}
double calsqrt(){
double left=1,right=2,mid;
while(right-left>eps){
mid=(left+right)/2;
if(f(mid)>2){
right=mid;
}else{
left=mid;
}
}
return mid;
}
问题的本质:计算√2,实际上等价于求f(x)=x^2-2=0在[1,2]范围内的根。
因此程序可修改为:
#include <stdio.h>
const double eps=1e-5;
double f(double x){
return x*x-2;
}
double calsqrt(){
double left=1,right=2,mid;
while(right-left>eps){
mid=(left+right)/2;
if(f(mid)>0){
right=mid;
}else{
left=mid;
}
}
return mid;
}
总结为一般性通用求解方法:
#include <stdio.h>
const double eps=1e-5; //精度为10^-5
double f(double x){
return ...; //计算f(x)
}
double solve(double L,double R){
double left=L,right=R,mid;
while(right-left>eps){
mid=(left+right)/2;
if(f(mid)>0){
right=mid;
}else{
left=mid;
}
}
return mid;
}