Python 中的 Regula Falsi 方法建模
在本教程中,我将向您展示如何借助 Regula Falsi 方法(也称为“假位置法”)找到方程的根。让我们考虑下图所示。

首先,我们搜索了两个 𝑥 值 x1 和 x2,在这些值处函数的值 (y1和 y2) 不同,这意味着这些点应该使得这两个值的乘积为负(即,它们应该位于 X 轴的两侧)。由于这些不是精确点,即根存在的点,因此它们被视为假点,因此称为 Regula Falsi 方法。现在,这些点将由一条线连接,该线将在 xn 点与 x 轴相交。现在,对应于此将计算 yn。
如果 y1 和 yn 的乘积小于 0,则表示 x1 和 xn 位于根的两侧。然后,x2 将被 xn 替换,y2 将被 y1 替换。否则,它将表明 x1 和 x𝑛 位于同一侧,然后 x1 将被 xn 替换,y1 将被 yn 替换。此后,将重复相同的过程,直到 yn 的绝对值小于某个收敛准则(这里我们将其设置为 0.00001,但您可以根据所需的精度自由选择)。
现在问题是如何计算新的位置 xn。新的位置可以通过经过 (x1,y1) 和 (x2,y2) 的直线方程得到,如下所示 -
y−y1={y2−y1}{x2−x1}(x−x1)
但在 xn 处,𝑦 截距为零,则上述方程变为
0−y1={y2−y1}{x2−x1}(xn−x1)
0−{x2−x1}{y2−y1}y1=(xn−x1)
x1−{x2−x1}{y2−y1}y1=xn
最终,用于计算新 𝑥 值 (xn) 的方程变为 -
xn=x1−{x2−x1}{y2−y1}y1
Python 中 Regula Falsi 方法的实现
我们试图使用 Regula Falsi 方法找到其根的函数是 𝑥3−9𝑥−5=0。初始区间选择为 (−3,−1)。
导入用于数组使用和数据绘图的模块 -
from pylab import *
定义要计算其根的多项式的函数 -
f=lambda x: x**3-9*x-5
此步骤虽然不是严格必要的,但它将有助于可视化 Regula Falsi 过程的工作原理。这段代码将有助于绘制函数 -
# Creating array of x x=linspace(-4,4,50) # Drawing function figure(1,dpi=200) plot(x,f(x)) ylim(-19,10) plot([-4,4],[0,0],'k--')
选择您期望根存在的初始区间。我所取的值是上面提到的多项式。
# Selecting false positions x1 and x2 x1=-3 x2=-1 # Evaluating corresponding y1 and y2 y1=f(x1) y2=f(x2)
检查初始猜测区间 (𝑥1,𝑥2) 是否正确,即 𝑦1x𝑦2>0。
如果不是,则使用适当的消息退出循环。否则,进入 while 循环。在 while 循环内,首先根据公式 1 计算 𝑥𝑛 并找到 𝑦ℎ。
如果 𝑦1 的绝对值本身很小,则使用最终答案 𝑥1 中断 while 循环。否则,检查 y1Xyns0 是否为真,如果是,则设置 x2=xn 和 𝑦2=𝑦𝑛。否则,设置 𝑥1=𝑥𝑛 和 𝑦1=𝑦𝑛。
# Initial check if y1*y2>0: print("on the same side of x axis, Correct the Range") exit else: # Plotting line joining (x1,y1) and (x2,y2) plot([x1,x2],[y1,y2]) # Iteration counter count=1 # Iterations while True: xn=x1-y1*(x2-x1)/(y2-y1) plot([xn],[0],'o',label=f'{xn}') yn=f(xn) if abs(y1)<1.E-5: print("Root= ",x1) break elif y1*yn<0: x2=xn y2=yn plot([x1,x2],[y1,y2]) else: x1=xn y1=yn plot([x1,x2],[y1,y2]) # printing few xn in legend if count<6: legend() # Increasing iteration counter count +=1 show()
程序的 输出 将是 -
Root= -2.669663840642225
函数图本身显示了对根的收敛,如下所示。

完整的 Python 代码
最终编译后的代码如下 -
# Importing modules for plotting and Array from pylab import * # Defining function using Lambda f = lambda x: x ** 3 - 9 * x - 5 # Creating array of x using linspace x = linspace(-4, 4, 50) # Drawing function for better understanding of convergence figure(1, figsize=(7.20,3.50)) plot(x, f(x)) ylim(-19, 10) plot([-4, 4], [0, 0], 'k--') # Selecting false position interval x1 and x2 x1 = -3 x2 = -1 # Evaluating the values at x1 and x2 viz. y1 and y2 y1 = f(x1) y2 = f(x2) # Initial check for gussed interval if y1 * y2 > 0: print("on the same side of x axis, Correct the Range") exit else: # Plotting line joining (x1,y1) and (x2,y2) plot([x1, x2], [y1, y2]) # Iteration counter count = 1 # Iterations while True: xn = x1 - y1 * (x2 - x1) / (y2 - y1) plot([xn], [0], 'o', label=f'{xn}') yn = f(xn) if abs(y1) < 1.E-5: print("Root= ", x1) break elif y1 * yn < 0: x2 = xn y2 = yn plot([x1, x2], [y1, y2]) else: x1 = xn y1 = yn plot([x1, x2], [y1, y2]) # printing few xn if count < 6: legend() # Incrementing counter count += 1 show()
对于其他根,我们必须采用其他初始集合的 x1 和 x2。您可以练习 (-1, 1) 和 (2, 4)。
Learn Python in-depth with real-world projects through our Python certification course. Enroll and become a certified expert to boost your career.
结论
在本教程中,您学习了如何在 Python 中建模 Regula Falsi 方法。您还了解了初始猜测区间的选择有多么重要。