2

これが C/C++ で解決されたことは理解していますが、それらの言語を Python に変換できるほど十分に慣れていません。これをPythonで作成しようとしています。私が来ることができた最も近いものはこれでした:

#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

しかし、このコードの基になった Newton メソッドをプログラムすることができました。それが役立つ場合は、次のとおりです。

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 桁の精度で答えが得られます。どんな助けでも大歓迎です。

4

2 に答える 2

2

アルゴリズムが Python 浮動小数点数の精度内で答えに収束したため、ゼロ除算エラーが発生しています。(無限ループを回避するために) 最大回数反復することに加えて、最後の 2 つの推測が「十分に近い」かどうかも確認する必要があります。

于 2012-10-11T02:59:20.430 に答える
2

重要なのは浮動小数点数のラウンドです。f(xnm1)前者の場合、何回か繰り返した後、との差がf(xnm2)小さすぎて浮動小数点数で表すことができないため、ゼロに丸められ、エラーがスローされます。

後者では、微分を使用してその時点での勾配を直接計算します。これは小さいですが、ゼロではない (ただし、次の反復ではほぼ同じ値のままです) ため、エラーは発生しません。

これが例であり、IEEE 浮動小数点です。

于 2012-10-11T03:16:38.553 に答える