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