如何使用二分法进行数值计算
二分法数值计算使用方法
了解根查找二分法及其工作原理
我们可以通过以下方式联系: 领英 | 推特 | VoAGI | SUBSTACK |
计算机科学和数学的一个子领域被称为数值计算,它着重于利用计算机实现的数值方法和算法来解决数学问题。它涉及运行模拟和计算,以得出对于在解析上具有挑战性或不可能解析解的数学难题的近似答案。
我们在数学中有许多方程。为了在现实生活中使用这些方程,我们必须解决这些方程。当我们找到方程的根时,我们说“方程已解决”,其中f(x)是一个连续函数,并且我们想找到使该函数等于零的‘x’的值。当我们将根代入方程时,方程变为零。让我们看一个简单的例子:
f(x) = x * x — 1
- RecList 2.0:开源系统化测试机器学习模型
- 使用PyTorch Lightning从头开始实现和训练一个卷积神经网络(CNN)
- 使用Amazon SageMaker多模型端点在GPU上部署成千上万个模型集合,以最小化托管成本
x * x — 1 = 0
f(1) = (1) * (1) –1 = 0
f(-1) = (-1) * (-1) –1=0
所以上述方程的根是1和-1。
我们是如何理解的?
我们将1代入方程中的x位置。这就是我们解决这些方程的方法。但遗憾的是,在现实生活中,方程并不那么简单。
为了解决现实生活中的方程,我们有许多称为“根查找方法”的方法。这些方法对于数值计算、优化、插值、曲线拟合、数值分析等领域非常有用。
如果我们开始谈论进化,那将需要一篇完整的博客,但让我们直接开始实施技术。
二分法
在数学中,二分法是一种寻找单变量方程数值根的简单方法。二分法是解决超越问题的最简单的数值方法。在本文中,我们将详细介绍二分法,并解决一些问题。
使用二分法确定多项式问题的根。它将方程的根所在的区间分割和分离。连续函数中间值定理作为该方法的指导原则。它通过缩小正负区间之间的距离,直到接近正确的答案。通过对正负区间求平均,该技术减小了变量之间的距离。
尽管它是一个简单的过程,但它移动缓慢。二分法有时也被称为二分法、二分搜索法、区间二分法和根查找方法。

二分法算法
对于任何连续函数f(x),[来源]
找到两个点,假设为a和b,使得a < b且f(a)* f(b) < 0
找到a和b的中点,假设为“c”
如果f(c) = 0,则t是给定函数的根;否则进行下一步
划分区间[a, b] — 如果f(c)*f(a) < 0,则在c和a之间存在一个根;否则,如果f(c)*f(b) < 0,则在c和b之间存在一个根
重复上述三个步骤,直到f(c) = 0。
二分法是一种通过反复分割区间来逼近给定方程的根的近似方法。该方法将不断分割区间,直到找到非常小的结果区间。
代码:
免责声明/警告:此代码仅用于展示如何在Python中创建基本的二分法代码。我不声称代码中有任何优化,根据具体问题陈述需要进一步改进。
我们来看一个简单的函数。
F(x) = x * x — 3
def fun(x): return x * x - 3
我们编写一个非常基本的代码,创建一个二分法代码的简单流水线。
a = 1 #近似第一个根b = 2 #近似第二个根 #函数声明def fun(x): return x*x - 3a_original = fun(a)b_original = fun(b)i = 0while i < 50 : #重复50次 c = (a + b)/2 c_original = fun(c) if c_original < 0: a = c else: b = c# plt.plot(a) print("a是{}".format(a)) print("b是{}".format(b)) i+=1
上述内容非常基础,仅代表了二分法在朴素水平上的表现。
让我们看看它的输出
a是1.5b是2a是1.5b是1.75a是1.625b是1.75a是1.6875b是1.75a是1.71875b是1.75a是1.71875b是1.734375a是1.7265625b是1.734375a是1.73046875b是1.734375a是1.73046875b是1.732421875a是1.7314453125b是1.732421875a是1.73193359375b是1.732421875a是1.73193359375b是1.732177734375a是1.73193359375b是1.7320556640625a是1.73199462890625b是1.7320556640625a是1.732025146484375b是1.7320556640625a是1.7320404052734375b是1.7320556640625a是1.7320480346679688b是1.7320556640625a是1.7320480346679688b是1.7320518493652344a是1.7320499420166016b是1.7320518493652344a是1.7320499420166016b是1.732050895690918a是1.7320504188537598b是1.732050895690918a是1.7320506572723389b是1.732050895690918a是1.7320507764816284b是1.732050895690918a是1.7320507764816284b是1.7320508360862732a是1.7320508062839508b是1.7320508360862732a是1.7320508062839508b是1.732050821185112a是1.7320508062839508b是1.7320508137345314a是1.7320508062839508b是1.732050810009241a是1.7320508062839508b是1.732050808146596a是1.7320508072152734b是1.732050808146596a是1.7320508072152734b是1.7320508076809347a是1.732050807448104b是1.7320508076809347a是1.7320508075645193b是1.7320508076809347a是1.7320508075645193b是1.732050807622727a是1.7320508075645193b是1.7320508075936232a是1.7320508075645193b是1.7320508075790713a是1.7320508075645193b是1.7320508075717953a是1.7320508075681573b是1.7320508075717953a是1.7320508075681573b是1.7320508075699763a是1.7320508075681573b是1.7320508075690668a是1.732050807568612b是1.7320508075690668a是1.7320508075688394b是1.7320508075690668a是1.7320508075688394b是1.7320508075689531a是1.7320508075688394b是1.7320508075688963a是1.7320508075688679b是1.7320508075688963a是1.7320508075688679b是1.732050807568882a是1.732050807568875b是1.732050807568882a是1.732050807568875b是1.7320508075688785a是1.7320508075688767b是1.7320508075688785a是1.7320508075688767b是1.7320508075688776
上面的输出是对 a 和 b 进行 50 次迭代的结果。由于限制,系统在处理大于 16 位数的数字时会遇到麻烦。但我们可以看到根的值越来越接近。
最后的 a 是 1.73205080
最后的 b 是 1.73205080
将这些最新值代入方程得到:
F(a) = -0.000176000…..
F(b) = 0.000176000…..
非常接近 0 !!!
现在我们知道这个逻辑是有效的。让我们优化代码并可视化输出,以便更好地理解它。
import matplotlib.pyplot as pltdef Bisection_method(a, b, iterations): def fun(x): return x * x - 3 # 创建图形和绘图的轴 plt.figure() plt.xlabel('x') plt.ylabel('y') plt.title('方程可视化 y = x^2 - 3') # 绘制方程 y = x^2 - 3 的范围[a, b]上的图像 x_values = [x / 100.0 for x in range(int(a * 100), int(b * 100) + 1)] y_values = [fun(x) for x in x_values] plt.plot(x_values, y_values, color='orange', label='y = x^2 - 3') # 在图上绘制初始点 a 和 b plt.plot(a, fun(a), 'ro', label='f(a)') plt.plot(b, fun(b), 'go', label='f(b)') # 绘制 x 轴线 plt.axhline(linewidth=2, y=0, color='brown', linestyle='dashdot') plt.axhline(y=fun(a), color='blue', linestyle='dashdot') plt.axhline(y=fun(b), color='blue', linestyle='dashdot') plt.legend() plt.grid() # 更新绘图并显示 plt.pause(1) a_vals = [a] b_vals = [b] i = 0 while i < iterations: c = (a + b) / 2 c_original = fun(c) if c_original < 0: a = c else: b = c i += 1 a_vals.append(a) b_vals.append(b) # 用不同颜色绘制所有 a 和 b 的值 plt.plot([fun(a_val) for a_val in a_vals], 'mo', label='f(a)',color='orange') plt.axhline(y=0, color='brown', linestyle='dashdot') plt.plot([fun(b_val) for b_val in b_vals], 'co', label='f(b)') plt.axhline(y=0, color='brown', linestyle='dashdot') plt.legend() plt.grid() # 更新绘图并显示# plt.pause(1) plt.show()
# 使用初始值 a、b 和迭代次数调用函数a_initial = 1b_initial = 2iterations = 50Bisection_method(a_initial, b_initial, iterations)
我修改了这段代码,使其可以接收输入并显示根的图形。

在上图中,我们可以看到起始点及其对应的 F(x) 值。红色突出线是我们希望通过这些初始根得到的结果。
在上图中,我绘制了最后 10 个点中的输出结果,可以看到值收敛到 0,最后几个点几乎为 0。这是我们得到根的一个迹象。迭代次数可以控制整个执行过程的限制。该参数可以是函数的阈值值。因此,要么在完成一定数量的迭代后停止,要么在达到一定阈值后停止。
您可以更改函数并使用此代码来查找自己的方程的根,或者您可以直接使用下面的链接,它将带您进入二分法在线计算器。
二分法在线计算器
二分法在线计算器是一种简单可靠的工具,用于使用非线性方程找到实根…
www.codesansar.com
二分法的优点:
收敛性:只要给定一个包含根的区间,可靠性保证该方法能给出一个解。
简单性:该方法在理论上很简单,易于使用。
稳健性:与其他一些求根方法相比,二分法对初始猜测不太敏感。
区间细化:每次改进都确保解更精确。
无需导数:这使其适用于无法获得导数或难以计算导数的函数。
全局收敛性:如果区间内存在根,该方法最终将找到一个根。
二分法的局限性:
收敛速度慢:与其他具有更快收敛速度的求根算法相比,该方法可能较慢,特别是对于斜率陡峭的函数,尽管它保证收敛。
区间要求:如果未知或难以确定这样的区间,则该过程可能不适用。
只能找到一个根:二分法仅用于在提供的范围[a, b]内查找一个根。如果函数在该范围内有多个根,则该过程将到达其中之一的根。
对复杂方程的适用性有限:二分法最适用于在指定的区间内具有单个实根的方程。
为了克服这些局限性,我们还有许多其他在根查找方面具有不同机制的高级方法。我们将在下一系列博客中介绍这些方法。
如果您觉得本文有启发:
事实证明,“慷慨使人更快乐”;因此,如果您喜欢本文,请为其点赞。如果您认为本文有启发,请关注我的Linkedin和VoAGI。您也可以订阅以在我发布文章时收到通知。让我们创建一个社区!感谢您的支持!
您可以在这里点击给我买咖啡。
理解LangChain 🦜️🔗:第1部分
对LangChain中链、提示和其他重要模块的理论理解
pub.towardsai.net
选择计算机视觉应用的CNN架构实用指南
从LeNet到EfficientNet:为您的项目选择最佳CNN架构
levelup.gitconnected.com
全面指南:计算机视觉资源一站式博客
保存这个博客,获取计算机视觉的全面资源
VoAGI.com
提升您的数据科学、机器学习和计算机视觉项目:高效项目管理的基本工具
使用这些工具加快您的构建和项目
pub.towardsai.net
结束,
Chinmay