欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二分法求根问题

程序员文章站 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;
}