【问题标题】:Secant method function in pythonpython中的正割方法函数
【发布时间】:2012-10-11 02:06:00
【问题描述】:

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

【问题讨论】:

  • 对不起。我得到一个除以零的错误。

标签: python function methods calculus


【解决方案1】:

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

【讨论】:

  • 谢谢,我把它改成了一个while循环,直到xnm1 = xnm2。
  • 这并不总是有效的。有时您会遇到在两个值之间反弹的解决方案。
【解决方案2】:

重要的是浮点数。前一种情况,经过一些迭代,f(xnm1)和f(xnm2)之间的差异很小,以至于float无法表示它,因此将其四舍五入为零,然后抛出错误。

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

这里是an example 和IEEE floating point。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多