0

環路錯誤我試圖找到利用牛頓迭代法找到根源。它通過猜測然後在每次迭代之後改進猜測來做到這一點,直到得到一個零。雖然與Netwon迭代法

因爲牛頓迭代方法很快就找到了零,則立即和兩個或三個迭代最大應該不符合while循環的條件後,給了我一個小錯誤。然而,問題是,當我在我的循環「錯誤」後刪除分號,我開始越來越分數應該打破while循環,但它像Matlab不知道123/8328423小於1。它會繼續運行,直到我手動強制程序停止運行。

我該如何解決這個問題?我試圖格式化long格式,並在命令窗口,腳本文件和循環中的某處使用double。

預先感謝您的任何提示,建議或意見,可以幫助!

A = [1,2,-4;2,-2,-2;-4,-2,1;]; 
format longe 
% syms x y z 
% P = x^4 + 3*x^2*y^2-z^3+y+1; 
% feval(symengine,'degree',P,x) 

syms x 

B = mateigenvalue(A); 
f(x) = simplify(matdet(B)); 

x0 = 1; 
error = 10; 
while(error > .01) 
    x1 = x0 - f(x0)/(27*(x0)-3*(x0)^2); 
    error = abs(((f(x0)-f(x1))/f(x0))*100) 
    x0 = x1; 
end 

x0 = double(x0) 

回答

2

我認爲主要的問題是error
它開始爲double但while循環裏面變成了一個象徵性的變量,你不能輕易比較標值(.01在while循環條件)符號變量。

檢查您的工作區,如果error是符號(或鍵入class(error)並檢查是否返回sym)。我猜它是符號的,因爲返回一個分數(123/8328423),因爲相反,Matlab會用小數對待double值,而不是分數。
如果是這樣,嘗試做(while循環中)轉換爲error也就是線下

error = abs(((f(x0)-f(x1))/f(x0))*100); 

嘗試把

error=double(error); 

所以error將暫時轉換在double和你可以輕鬆地將其值與.01進行比較以檢查while-loop條件。

此外,由於error()是Matlab中的一個內置函數,所以調用變量error是個不好的做法。通過命名變量error你不能使用error()功能。同樣的故事也適用於其他內置功能。