二分法(英语:Bip method),是一种常用的数值求解方程根近似值的方法,主要用于解一元函数的根(也就是方程的解)。它的原理非常简单,利用若干次迭代逼近根的位置,直至误差满足给定条件。

具体的求解步骤如下:

    1. 先将方程化为 的形式,通常是方程左边减右边(或者方程右边减左边)。确定方程的区间 ,使得 异号(即一个正一个负,该步骤最好通过画图得出 的值)。这是因为在连续函数的定义域中,如果 异号,根据零值定理,必定存在解。

    1. 将区间 平均分成两半,找到中点 。即

    1. 计算函数在 点的值

    1. 判断 的关系。如果 ,则 就是方程的解;如果 异号,说明解在 之间或 之间,此时将区间 更新为 ,然后返回步骤2;否则,解不在[a, b]之间,结束迭代。

    1. 重复步骤 2 至 4,直到达到预设的精度要求(如解的误差小于某个很小的值),或者达到最大迭代次数。


二分法的思想是在包含解的区间内不断缩小区间范围,直到找到一个足够小的含着解的区间,从而得到具有足够精度的解。这种方法的应用不仅限于求解代数方程,还可以用于求解微分方程的数值解。

二分法的优点在于简单直观,易于实现,并且能够在有界区间内找到解。缺点是对于某些特定的函数,可能迭代次数很多,收敛速度较慢。此外,二分法只能找到一个根(如果存在多个根),且对于非线性方程来说,初始区间的选取很关键,不同的初始区间可能得到不同的解,因此最好是先画图确定要找的解的大致范围。

需要注意的是,二分法只适用于单调的函数,对于非单调函数,需要使用其他的数值求解方法(如牛顿法、弦线法等)。


Mathematica

  • 使用二分法数值解方程 的近似根。首先令 ,画出 的图形:
In[]:=
1
2
f[x_] = x^2 - x;
Plot[f[x], {x, -1, 2}]
Out[]:=

xf(x)-11212f(x)=x2-x


可以看出方程有两个根,大致在 附近,我们以 为例在 mathematica 中数值求解:

In[]:=
1
2
3
4
5
6
7
8
9
10
11
12
a = 0.1; b = 1.5; error = Abs[a - b];
n = 0;
(*n 为迭代次数,为防止遇到不收敛的情况,将最大迭代次数设为 1000。
计算精度要求 0.0001,可以自行设定为需求精度*)
While[error > 0.0001 && n < 1000,
c = (a + b)/2;
If[f[c] == 0, Break[],
If[f[a] f[c] > 0, a = c, b = c]];
error = Abs[a - b];
n++
]
c
Out[]:=

判断程序结束还有另一种方法,这种方法看起来更简洁:

In[]:=
1
2
3
4
5
6
7
8
9
10
11
a = 0.1; b = 1.5; c = (a + b)/2;
n = 0;
(*n 为迭代次数,为防止遇到不收敛的情况,将最大迭代次数设为 1000。
计算精度要求 0.0001,可以自行设定为需求精度*)
While[Abs[f[c]] > 0.0001 && n < 1000,
If[f[c] == 0, Break[],
If[f[a] f[c] > 0, a = c, b = c]];
c = (a + b)/2;
n++
]
c
Out[]:=


下面图像显示了前两次迭代的解:

xf(x)0.511.50.51f(x)=x2-x

当然该例非常简单,接下来会讲不动点迭代法,然后利用该方法求解泊松方程。