python中的正确方法函数

时间:2012-10-11 02:06:01

标签: python function methods calculus

我知道这已经在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位精度的答案。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

你得到零错误的除法,因为算法在Python浮点数的精度内收敛到答案。除了迭代最多次数(以避免无限循环)之外,您还应检查最后两次猜测是否“足够接近”。

答案 1 :(得分:2)

重要的是一轮浮动数。在前一种情况下,经过一些迭代后,f(xnm1)f(xnm2)之间的差异很小,浮点将无法表示它,因此它将舍入为零,然后抛出错误。 / p>

在后者中,我们直接通过使用导数计算该点的斜率,虽然它很小,但它非零(但在下一次迭代中几乎保持相同的值),所以它不会抛出错误。

以下是an exampleIEEE floating point