2017-02-21 44 views
2

我嘗試了非線性多項式函數,並且此代碼運行良好。但對於這一個,我嘗試了幾種方法來解決使用反斜槓或bicg或lsqr的線性方程df0 * X = f0,也嘗試了幾個初始值,但結果從未收斂。NOT CONVERGE:使用Newton Raphson-Method找到非線性方程的根

% Define the given function 
syms x1 x2 x3 

x=[x1,x2,x3]; 

f(x)=[3*x1-cos(x2*x3)-1/2;x1^2+81*(x2+0.1)^2-sin(x3)+1.06;... 
    exp(-x1*x2)+20*x3+1/3*(10*pi-3)]; 

% Define the stopping criteria based on Nither or relative errors 

tol=10^-5; 
Niter=100; 

df=jacobian(f,x); 

x0=[0.1;0.1;-0.1]; 

% Setting starting values 

error=1; 
i=0; 

% Start the Newton-Raphson Iteration 

while(abs(error)>tol) 

f0=eval(f(x0(1),x0(2),x0(3))); 

df0=eval(df(x0(1),x0(2),x0(3))); 

xnew=x0-df0\f0; % also tried lsqr(df0,f0),bicg(df0,f0) 

error=norm(xnew-x0); 

x0=xnew; 

i=i+1 

if i>=Niter 

    fprintf('Iteration times spill over Niter\n'); 

    return; 

end 

end 
+0

繪製函數並查看關於開始猜測的更好選擇。 – duffymo

+0

該函數是一個由3個方程組成的向量,如何繪圖? – Jarvis

+0

你爲什麼在那裏使用'eval'?!?這是完全沒有必要的,並且會破壞你的計算速度,並且將你吸引到「eval」和它相關的壞習慣的深淵坑中。 – Adriaan

回答

1

爲了更好地完成工作,我們需要匿名函數(我們今天提到它!)。

首先,讓我們來定義函數定義。匿名函數是您以類似於數學函數的方式調用事物的好方法。例如,

f = @(x) x^2;

爲平方函數。要評估它,只需像你在紙上寫下f(2)那樣說。既然你有一個多元函數,你需要向量化的定義如下:

f(x) = @(x) [3*x(1) - cos(x(2) * x(3)) - 1/2; ...

爲了您的雅可比,你需要使用另一個匿名函數(或許稱之爲grad_f)和計算它紙張,然後編碼。功能jacobian使用有限差分,所以誤差可能與雅可比堆積在一些區域不穩定。

關鍵是要小心,並使用一些良好的編碼習慣。有關匿名函數和其他良好MATLAB實踐的更多信息,請參見this document

+0

非常感謝! – Jarvis

+0

我還有一個問題,我計算的f(x)的梯度與雅可比函數的結果相同。另外,我只在第一次使用雅可比時不在循環中,這會算什麼? – Jarvis