2014-01-11 83 views
0

我完全是編程的初學者,所以請告訴我,如果我的問題的答案是非常明顯和明顯的。Newton-Raphson方法求解三次方程

我在一週前開始學習python,學習了使用Newton-Raphson method解決方程式的基礎知識,我想出了一段代碼,可以給你一個三次方程的解(只)。這裏是我設計的代碼: -

def deg3(a,b,c,d,g): 
    y=a*g**3+b*g**2+c*g+d 
    return y 
def solvedeg3equation(): 
    e=float(input("e= ")) #for ax^3+bx^2+cx+d=0, with maximum error of e 
    a=float(input("a= ")) 
    b=float(input("b= ")) 
    c=float(input("c= ")) 
    d=float(input("d= ")) 
    count=1 
    g=0.01 
    while abs(deg3(a,b,c,d,g))>e and count<=100: 
     count=count+1 
     if 3*a*g**2+2*b*g+c==0: 
      g=g+0.001 
     g=g-deg3(a,b,c,d,g)/(3*a*g**2+2*b*g+c) 
    if count<=100: 
     print("The best guess is:",g) 
     print("iterations required: ",count) 
    else: 
     print("maximum iterations exceeded ") 
     print("iterations: ",count,"current guess: ",g) 

一個牛頓法的缺點是,或f'(X)= 0,它給出了一個數學錯誤和崩潰。爲了克服這個問題,我使用g = g + 0.001,如果g的當前值給出零導數,其中g是當前猜測。 有沒有更好的方法來消除這個問題,而不使用複雜的功能?

我的另一個問題是,我可以包括提供多個根並對代碼進行微小更改嗎?一個想法是以這樣的方式改變猜測,即現在連續迭代產生另一個根。但我不知道如何做出這樣的猜測,給出一個解決方案。

+2

這真的是三個問題!要查看工作代碼,請使用http://codereview.stackexchange.com – jonrsharpe

+1

@jonrsharpe我會減少問題的數量。 :) –

回答

2

爲導數製作第二個步驟。更好的是,爲保持初始化期間獲得的係數的數值函數做一個類,並提供值和導數的方法。

使用x /(eps^2 + x^2)去desingularize函數1/x。實際上,這不應該起作用,因爲融合到多個根是慢的,所以在更高級的實現中你必須實現代碼來檢測這個並加速它。

要得到其他根,可以使用Horner-Ruffini方案計算癟二次多項式並使用求解公式求解。

並嘗試避免多次計算相同的值。這在這裏並不重要,但對於更昂貴的功能來說,這變得至關重要。