高中数学必修一上给的定义是:
对于在区间
𝒂,𝒃上连续不断且 𝒇𝒂𝒇𝒃<𝟎的函数 𝒚=𝒇𝒙,通过不断地把函数
𝒇𝒙零点所在区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似
值的方法,叫做二分法 ( 。
「连续」「变号」「近似值」
同时,只能求出一组解。
法一:递归形式的二分法求解函数零点:
#include <iostream>
using namespace std;
/*
用二分法求函数零点: (递归方法)
*/
double f(double x){
double y=x*x-2;
return y;
}
double find_zero_point(double left,double right,double precesion){
//f(left)*f(right)<0
if(right-left<precesion) return left;
double mid=(left+right)/2;
if(f(mid)==0) return mid;
if(f(mid)*f(right)>0) return find_zero_point(left,mid,precesion);
else return find_zero_point(mid,right,precesion);
}
int main(int argc, char** argv) {
cout<<find_zero_point(1,2,0.0001)<<endl;
return 0;
}
法二:非递归形式求函数零点
#include<iostream>
using namespace std;
double f(double x){
return x*x-2;
}
double find_zero_point(double left,double right,double precesion){
while(right-left>precesion){
double mid=(left+right)/2;
if(f(mid)==0) return mid;
if(f(left)*f(mid)<0) right=mid;
else left=mid;
}
return left;
}
int main(){
cout<<find_zero_point(1,2,0.00001)<<endl;
return 0;
}