2014-10-09 87 views
0

我正在寫一個函數實現牛頓迭代尋找標量函數,即找到x使得f(x)= 0,並且x_(n + 1)= x_n - [ F(x_n)/ F'(x_n)。牛頓迭代尋根

f1和f1prime是計算f和f'的句柄,x0是初始根估計值,'tol'是寬容度。我必須繼續迭代直到| f(x_n + 1)|小於tol或者我已經超過10^5次迭代。而且,函數的輸出是x_n + 1。另外... f(x)= 3x^4-5x^3-12x^2其中f'(x)= 12x^3-15x^2-24x。

我當前的代碼是...

[email protected](x) 3*x^4 -5*x^3 - 12*x^2; 
[email protected](x) 12*x^3-15*x^2-24*x; 
n=0; 
root=x0; 
    while abs(f1(x(n+1))<tol ||n>10^5 
    x(n+1)=x(n)-f1(x(n))/fprime(x(n)); 
    n=n+1; 
end 

我的代碼應該通過這個測試套件,但事實並非如此。上面的代碼有什麼問題?

tol=1e-6; 
[email protected](x) 3*x^4 -5*x^3 - 12*x^2; 
[email protected](x) 12*x^3-15*x^2-24*x; 
x0=-1; 
root_correct = [-1.333333]; 
[root]=newtonRoot(f1,f1prime,x0,tol); 
tol1=1e-4; 
assert(abs(root-root_correct) < tol1 , ... 
[ '\nYour output \n root = [' sprintf(' %d ',root) ']\n' ... 
    'Expected output \n root = [' sprintf(' %d ',root_correct) ']\n' ], ... 
    root,root_correct); 
+0

10^5作爲迭代限制是荒謬的。牛頓法以其二次收斂而聞名。假設初始值有1個正確的位,下一次迭代將有2,4,8,16,32,64 ...個正確的位。所以迭代的次數最好接近10比10萬次。(無論如何,因爲初始值可能比「精確比特」少「,所以允許有一定的餘量。) – 2014-10-09 06:48:48

回答

1

你的循環條件是不正確的:

while abs(f1(x(n+1)) < tol || n>10^5 

繼續只要f1絕對值小於toln10^5更大。這兩個條件在第一次迭代中都是無效的,因此你甚至不會迭代一次牛頓方法。

嘗試:

while abs(f1(x(n+1)) > tol && n < 10^5