我知道这已经在C / C ++中得到了解决,但是我对这些语言能够将其转换为python感到不舒服。我想在python中创建this。我能来的最接近的是:
#This is meant to work for functions of the form x^a + b = 0
def secant(base, exp=2, it=20):
def f(x):
return x**exp - base
x1 = base / float(exp**2)
xnm1 = x1 - 5
xnm2 = x1 + 5
xn = 0
for n in range(it):
q = (xnm1-xnm2)/float(f(xnm1)-f(xnm2))
xn = xnm1 - (f(xnm1)*q)
xnm1, xnm2 = xn, xnm1
return xn
print secant(2, 2)
这将返回错误:
Traceback (most recent call last):
File "/Users/Joe/Desktop/secant.py", line 16, in <module>
print secant(2, 2)
File "/Users/Joe/Desktop/secant.py", line 11, in secant
q = (xnm1-xnm2)/float(f(xnm1)-f(xnm2))
ZeroDivisionError: float division by zero
然而,我能够编写牛顿方法,我将此代码基于此。如果它有帮助,这里是:
def newton(base, exp=2, it=20):
def f(x):
return x**exp - base
def df(x):
return exp*(x**(exp-1))
x1 = base / float(exp**2)
xnp = x1
xn = 0
for n in range(it):
xn = xnp - ((f(xnp)/df(xnp)))
xnp = xn
return xn
以下方法在20次迭代后给出了12位精度的答案。任何帮助将不胜感激。
答案 0 :(得分:2)
你得到零错误的除法,因为算法在Python浮点数的精度内收敛到答案。除了迭代最多次数(以避免无限循环)之外,您还应检查最后两次猜测是否“足够接近”。
答案 1 :(得分:2)
重要的是一轮浮动数。在前一种情况下,经过一些迭代后,f(xnm1)
和f(xnm2)
之间的差异很小,浮点将无法表示它,因此它将舍入为零,然后抛出错误。 / p>
在后者中,我们直接通过使用导数计算该点的斜率,虽然它很小,但它非零(但在下一次迭代中几乎保持相同的值),所以它不会抛出错误。