匿名使用者
匿名使用者 發問時間: 科學數學 · 7 年前

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 個解答

評分
  • Elisha
    Lv 6
    7 年前
    最佳解答

    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
  • 7 年前

    多次執行 不是還是會陷入local minimum的狀態嗎?

還有問題?馬上發問,尋求解答。