给定一个闭区间,我们假设函数 f ( x ) f(x) f(x) 在该区间内有且仅有一个零点,即令 f ( x ) = 0 f(x)=0 f(x)=0,通过在该区间内不断折半区间,根据有根的判别条 f ( x 1 ) × f ( x 2 ) < 0 f(x_{1}) \times f(x_{2}) <0 f(x1)×f(x2)<0,我们总能找到一个给定了精度的根,并且有理由相信该根 x x x 关于精度是 “准确” 的。
在实际操作过程中,我们用在精度控制下找到有根区间的中点的值作为方程的近似解。
例:用二分法求方程 x 3 − x − 1 = 0 x^{3} -x-1=0 x3−x−1=0 在区间 [1, 1.5] 内的一个实根,要求误差不超过 0.005。
运行示例:
程序源码:
#include <iostream>
#include <cmath>
using namespace std;
/**
* f(x) = x^3 - x - 1
*/
double f(double x)
{
return pow(x, 3) - x - 1;
}
int main()
{
double low, up;
cout << "请输入区间下限和上限:";
cin >> low;
cin >> up;
double accuracy;
cout << "请输入精度:";
cin >> accuracy;
double mid;
int count = 0;
do
{
count++;
mid = (low + up) / 2;
if ((f(low) * f(mid)) < 0)
{
// 根在前半区间
up = mid;
cout << "\n第" << count << "次折半,根位于前半区间" << endl;
}
else
{
// 根在后半区间
low = mid;
cout << "\n第" << count << "次折半,根位于后半区间" << endl;
}
} while ((up - low) > accuracy);
// 用区间中点的值作为根的近似解
cout << "\n方程解为:";
cout << mid << endl;
return 0;
}