matlab 求最小值
我使用共軛梯度法來求解f(x)=3 sin(0.5+0.25*x1*x2)×cos(x1) 從[0.5 0.5]開始搜索
但是matlab會進入busy狀態,等很久都沒有結果出來,
但是利用最速下降法卻可以計算
共軛梯度法不也是利用最速下降的梯度來逼近極值嗎?
我畫圖出來發現該函數最小值有非常多個,可是我覺得這不是原因?
實在不清楚問題出在哪,請各為指點迷津
附上我使用的共軛梯度法演算
function [x,minf] = minGETD(f,x0,var,eps)
format long;
if nargin == 3
eps = 1.0e-3;
end
x0 = transpose(x0);
n = length(var);
syms l;
gradf = jacobian(f,var);
v0 = Funval(gradf,var,x0);
p = -transpose(v0);
k = 0;
while 1
v = Funval(gradf,var,x0);
tol = norm(v);
if tol<=eps
x = x0;
break;
end
y = x0 + l*p;
yf = Funval(f,var,y);
[a,b] = minJT(yf,0,0.1);
xm = minGSM(yf,a,b);
x1 = x0 + xm*p;
vk = Funval(gradf,var,x1);
tol = norm(vk);
if tol<=eps
x = x1;
break;
end
if k+1==n
x0 = x1;
continue;
else
lamda = dot(vk,vk)/dot(v,v);
p = -transpose(vk) + lamda*p;
k = k+1;
x0 = x1;
end
end
minf = Funval(f,var,x);
format short;
多次執行 不是還是會陷入local minimum的情況嗎?
2 個解答
- ElishaLv 67 年前最佳解答
1. matlab會進入busy狀態,等很久都沒有結果出來?
我發現你程式中有使用symbolic算法(有sysm),這樣會大大減低運算的速度。
另外你程式中有continue,這是不需要的。format short可以先在commond window先行執行,或許不會數字輸出不會一下長一下短?
2. 現該函數最小值有非常多個?
我在猜想你的方程式f(x)=3 sin(0.5+0.25*x1*x2)×cos(x1) 為sin及cos可能會同時尋到許多極小時,而落入所謂的"local minimum"而非真正的最小值,可以再多執行幾次以找到真正的最小值。
2013-12-03 10:53:15 補充:
多次執行 不是還是會陷入local minimum的情況嗎?
是有可能的,你可以先使用matlab內建提供的涵數來找看看,例如fminbnd,fminsearch,ga....等。
參考資料: me, me