二分法是一种求函数零点的经典算法,也被称为二分查找。其核心思想是将函数定义域分成两个部分,判断零点在哪一部分,然后继续迭代,最终收敛到某个精度范围内的零点。
以下是二分法的 Jupyter Notebook 示例:
import numpy as np
import matplotlib.pyplot as plt
def bisection(f, a, b, tol=1e-6):
"""
:param f: The function to find the root of
:param a: The left end point
:param b: The right end point
:param tol: The tolerance (default 1e-6)
:return: The root of the equation
"""
if f(a) * f(b) > 0:
raise ValueError("f(a) and f(b) must have opposite signs!")
while abs(b - a) > tol:
m = (a + b) / 2.0
if f(m) == 0 or abs(b - a) < tol:
return m
elif f(m) * f(a) < 0:
b = m
else:
a = m
return (a + b) / 2.0
f = lambda x: np.sin(x) - x / 2
root = bisection(f, 0, 2)
x = np.linspace(-2, 2, 100)
plt.plot(x, f(x))
plt.plot(root, f(root), 'ro')
plt.show()
print(root)
此示例演示了如何使用二分法求解方程 sin(x) - x / 2 = 0
的根。函数 bisection
是二分法的实际计算函数,使用输入的左右端点不断迭代直至满足一定的迭代条件。而在函数中,先判断左右端点函数值符号是否相反,若否则不满