二分法求根问题

一类问题:定义在[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;
} 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页