考研数学:用二分法求方程的近似解
1. 二分法的原理
二分法是用于求解方程\(f(x)=0\)的一种数值方法。
基本思想:如果函数\(y = f(x)\)在区间\([a,b]\)上连续,且\(f(a)\)与\(f(b)\)异号(即\(f(a)f(b)<0\)),那么根据零点存在定理,函数\(y = f(x)\)在区间\((a,b)\)内至少有一个零点。
二分法的过程就是不断将区间\([a,b]\)一分为二,根据区间端点函数值的符号,确定零点所在的子区间,然后继续在这个子区间内进行下一轮的分割,逐步缩小包含零点的区间范围,直到达到所需的精度为止。
2. 二分法的具体步骤
(1)确定初始区间\([a,b]\),使得\(f(a)f(b)<0\)。
(2)计算区间\([a,b]\)的中点\(c=\frac{a + b}{2}\)。
(3)判断\(f(c)\)与\(f(a)\)的符号关系:
若\(f(c)=0\),则\(c\)就是方程的一个根,求解结束。
若\(f(c)f(a)<0\),则根位于区间\([a,c]\),令\(b = c\),进入下一轮迭代。
若\(f(c)f(a)>0\),则根位于区间\([c,b]\),令\(a = c\),进入下一轮迭代。
(4)重复步骤(2)和(3),直到满足停止条件。停止条件通常是区间长度\(\vert b - a\vert\)小于给定的精度要求\(\varepsilon\),或者达到预定的迭代次数。
例如,用二分法求方程\(x^{3}-x - 1 = 0\)在区间\([1,2]\)内的一个近似解,精度要求\(\vert b - a\vert<0.1\)。
首先,计算\(f(1)=1^{3}-1 - 1=-1\),\(f(2)=2^{3}-2 - 1 = 5\),因为\(f(1)f(2)<0\),所以可以使用二分法。
第一次迭代:
计算中点\(c_1=\frac{1 + 2}{2}=1.5\),\(f(c_1)=1.5^{3}-1.5 - 1 = 0.875\)。
因为\(f(1)f(c_1)<0\),所以根位于区间\([1,1.5]\),令\(b = 1.5\)。
第二次迭代:
计算新的中点\(c_2=\frac{1 + 1.5}{2}=1.25\),\(f(c_2)=1.25^{3}-1.25 - 1=-0.296875\)。
因为\(f(c_2)f(1.5)<0\),所以根位于区间\([1.25,1.5]\),令\(a = 1.25\)。
第三次迭代:
计算中点\(c_3=\frac{1.25 + 1.5}{2}=1.375\),\(f(c_3)=1.375^{3}-1.375 - 1 = 0.224609\)。
因为\(f(1.25)f(c_3)<0\),所以根位于区间\([1.25,1.375]\),令\(b = 1.375\)。
此时\(\vert b - a\vert=\vert1.375 - 1.25\vert = 0.125>0.1\),继续迭代。
第四次迭代:
计算中点\(c_4=\frac{1.25 + 1.375}{2}=1.3125\),\(f(c_4)=1.3125^{3}-1.3125 - 1=-0.051514\)。
因为\(f(c_4)f(1.375)<0\),所以根位于区间\([1.3125,1.375]\),令\(a = 1.3125\)。
此时\(\vert b - a\vert=\vert1.375 - 1.3125\vert = 0.0625<0.1\),满足精度要求,所以方程\(x^{3}-x - 1 = 0\)在区间\([1,2]\)内的一个近似解为\(1.3125\)。
用C++求解方程 \(f(x) =x^{3}-x - 1 = 0\)
#include <iostream>
#include <cmath>
using namespace std;
// 定义要求解的方程
double equation(double x) {
return x * x * x - x - 1;
}
// 二分法:通过不断检查区间中点处函数值与区间端点函数值的符号关系,来缩小区间,直到区间长度小于给定的精度 tolerance。
double bisectionMethod(double a, double b, double tolerance) {
if (equation(a) * equation(b) >= 0) {
cout << "区间两端点函数值需异号,请重新选择区间。" << endl;
return NAN;
}
double c;
while ((b - a) > tolerance) {
c = (a + b) / 2;
if (equation(c) == 0)
return c;
else if (equation(c) * equation(a) < 0)
b = c;
else
a = c;
}
return (a + b) / 2;
}
可以使用以下方式调用二分法函数:
int main() {
double a = 1; // 初始区间左端点
double b = 2; // 初始区间右端点
double tolerance = 0.0001; // 精度要求
double root = bisectionMethod(a, b, tolerance);
if (!isnan(root)) {
cout << "二分法求得的近似根为: " << root << endl;
}
return 0;
}