在Python中对割线法进行建模
割线法是一种强大的方法,用于确定多项式或任何超越函数的x-截距(零点)。在这个方法中,首先我们选择(基本上猜测)我们期望找到根的区间(\mathrm{𝑥_{1}},\mathrm{𝑥_{2}})。然后,我们绘制一条割线来连接函数上对应于猜测值的点A,B,如下图所示。
斜率线与x轴在点 𝑥₃ 相交,由于 𝑥₃ 和 𝑥₂ 不接近(即它们的绝对差是有限的),我们找到与𝑥₃ 对应的曲线上的点,即点 C。然后我们连接一个与点 B 和 C 相交的斜率线。我们将延长斜率线直到到达X轴,并将该点标记为 𝑥₄。
现在再次检查 𝑥₃ 和 𝑥₄ 是否接近。由于它们也不接近,所以我们找到与 𝑥₄ 对应的多项式值,并将其标记在曲线上作为点 D。下面的图表示第二个斜率线和点 D。
# Importing module
from pylab import *
# Defining Polynomial function
def f(x):
return x ** 2 + 3 * x - 10
# Defining function for new value of x
def fn(a, b):
return a - ((b - a) / (f(b) - f(a))) * f(a)
# Creating array of x
x = linspace(-15, 15, 150)
# Plotting the function
figure(1, figsize=(7.20, 3.50))
plot(x, f(x), linewidth=2)
plot([-25, 25], [0, 0], "k--")
ylim(-15, 20)
xlim(-8, 6)
# Initial guess Interval
x1 = -4
x2 = 3
# Initial Error to enter into the loop
error = 1
# Setting iteration counter
count = 1
# Integration starts
while error > 1.E-3:
# Plotting Secant line
plot([x1, x2], [f(x1), f(x2)])
# Evaluating new value of x based on old
xn = fn(x1, x2)
# Plotting x intercept of secant
plot([xn], [0], 'o', label=f'{xn}')
# Evaluating error
error = abs(x2 - xn)
# Setting x's for next iteration
x1 = x2
x2 = xn
# Incrementing loop counter
count += 1
# Printing selected value of xn in the legend
if count < 6:
legend()
# Showing root in the figure (just decoration)
text(-7, -10, f'Root = {round(xn, 3)}', bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})
print(f'Root = {round(xn, 3)}')
show()
上面的代码中,所有的步骤都在本节开头提到。上述程序的输出如下图所示。
对于另一个根,你可以将初始 “x” 设置为:-6和-2。然后结果将如下所示:
结论
在这篇文章中,对割线法进行了详细讨论。给出了数学背景以便更容易地建模该方法。用户可以使用上面给出的代码进行操作,并用它来寻找其他函数的根。