ニュートン法

Pythonニュートン法をやってみた。ニュートン法って何?って方はググってください。

def newton(x, num):
    #nextx = (2 * (x*x*x) + x*x - 3) / (3 * (x*x) + 2*x - 5)    #x - (g / dg)をまとめた場合
    g = f(x)
    dg = df(x)
    nextx = x - (g / dg)
    num.append(nextx)
    if x != 0:
        check = (nextx - x) / x
        if (check < 0.00000001 and check > -0.00000001):    #誤差の範囲内に収まったら計算終了
            return
    newton(nextx, num)

def f(x):
    return x*x*x + x*x - 5*x + 3    #今回はx^3+x^2-5x+3=0を解く

def df(x):
    return 3*x*x + 2*x - 5    #左辺を1回微分した式

def main():
    x0 = 0.0    #最初のxの値
    num = [x0]
    newton(x0, num)
    print num

if __name__ == '__main__':
    main()

結果は以下のようになる。

>>> 
[0.0, 0.6, 0.8117647058823529, 0.9082650781831724, 0.9546772328747365, 0.9774692207697667, 0.9887666079847501, 0.9943912241748202, 0.9971975823794107, 0.9985992825526064, 0.9992997639662882, 0.9996499126368127, 0.9998249639795537, 0.9999124839046458, 0.9999562424305699, 0.9999781213351223, 0.9999890606966689, 0.9999945303568718, 0.9999972651704089, 0.9999986325565382, 0.9999993162552172, 0.9999996580523504, 0.9999998288321135, 0.9999999147737951, 0.9999999577621707, 0.9999999801044548, 0.999999988474844]

最初のxの値を5.0にした場合は以下のようになる。

>>> 
[5.0, 3.4, 2.389473684210526, 1.774066654525587, 1.4160571394231234, 1.2173873680856377, 1.1114246354069843, 1.056457160596543, 1.0284236632976032, 1.0142617931551174, 1.007143541372518, 1.0035749515517178, 1.0017882734738675, 1.000894336473054, 1.0004472182097137, 1.000223621603005, 1.0001118139264726, 1.0000559077440478, 1.0000279540660224, 1.000013977080193, 1.0000069885504108, 1.0000034942696048, 1.000001747124112, 1.0000008735613346, 1.0000004367476691, 1.0000002183878496, 1.0000001093420305, 1.0000000545122083, 1.0000000270174305, 1.0000000105802935, 1.0000000105802935]