考研数学:用二分法求方程的近似解

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;

}

高等数学

考研数学:用二分法求方程的近似解