fsolve是采用最小二乘法來求解非線性方程(組)。它的一般求解方式為:X=FSOLVE(FUN,X0,OPTIONS)
其中,fun是要求解的非線性方程,X0是變量初值,options由optimset函數產生的結構體,用於對優化參數的設置,可以省略(采用默認值)。
fsolve可以求解簡單的一維非線性方程,如:x = fsolve(@myfun,[0.5 2 4],optimset('Display','iter')); %求解在初值分別為0.5,2和4時方程的解
其中,函數myfun的定義為:
function F = myfun(x)
F = sin(x);
fsolve還可以求解大型的非線性方程組,如
x0 = [51.6;rand;unifrnd(-1,1);rand];
h=optimset;
h.MaxFunEvals=20000;
h.MaxIter=5000;
h.Display='off';
[p,fval] = fsolve(@f,x0,options);
此時,方程組可以寫成矩陣形式:
function F=f(x)
f=[x(1)+x(2)*(1-exp(-(x(3)*(0)^x(4))))-51.61;
x(1)+x(2)*(1-exp(-(x(3)*(9.78)^x(4))))-51.91;
x(1)+x(2)*(1-exp(-(x(3)*(30.68)^x(4))))-53.27;
x(1)+x(2)*(1-exp(-(x(3)*(59.7)^x(4))))-59.68;];
以上是的非線性方程(組)都是簡單的函數關系式,但是實際應用中的函數,例如在圖像處理中的函數關系可能往往是一個隱函數,所以優化的目標方程可能是一個函數文件的結果,這種時候也是可以用來求解的。
PS: 個人感悟: 既然人家的目的是求解非線性方程組,那么如果如果需要訓練的參數有幾個,就乖乖地最少列幾個方程進行求解。例如我的文章中有三個參數,那么至少列三個方程,並且這三個方程還不能是相關的。而fminsearch就不需要有這個要求。