2011-04-12 110 views
2

我想遵從下面給出Matlab的 - 正確設置fmincon當目標和非線性制約性需要參數

http://www.mathworks.com/help/toolbox/optim/ug/brhkghv-7.html

的意見,但我有麻煩。我有一個複雜的目標,可以將複雜的非線性約束減至最小,所有這些都是我3個選擇變量的函數,以及各種各樣的參數。我的腳本啓動一切看起來是這樣的:

% define a bunch of parameters 
gamma= .2; 
beta = .3; % 
x0=[.5 .5 .5]; 
%etc 
solution = nested_minimization_program(x0,gamma,beta) 

Nested_minimization_program看起來是這樣的:

function out = nest_minimization-program(x0,gamma,beta) 
options = optimset('GradObj','on'); 
out = fmincon(@objective,x0,[],[],[],[],[0 0 0],[1 1 1],@nonlin,options) 
function [obj obj_gradient] = objective(x) 
    [obj obj_gradient] = complicated_objective(x,gamma,beta); 
end 
function [ineq_constriant eq_constraint] = nonlin(x) 
    [ineq_constriant eq_constraint] = complicated_constaints(x,beta,gamma) 
end 
end 

Complicated_objective是用於返回第一個參數的客觀價值的文件,並且anlaytical梯度值爲第二。 Complicated_constaints爲其第一個參數返回一個非線性不等式約束矢量,併爲其第二個非線性等式約束矢量。

做的原因是這樣的話,我可以使用fmincon的@objective和@nonlin語法; objective和nonlin只是x的函數,而不是參數的函數,因爲它們是已經傳遞了參數的函數的子函數。我相信這是我爲了將梯度和非線性約束傳遞給fmincon而應該使用的形式。我的問題是,當我運行此代碼,我得到以下錯誤

警告:信賴域反射算法不能解決使用有效集算法這類問題, 。您也可以嘗試內點或SQP 算法:設置算法選項設置爲「內點」或「小數量議定書」並重新運行。對於 更多幫助,請參閱文檔中選擇的算法。

IE,由於某些原因,fmincon離開Trust-region反射算法並轉到活動集,它不利用我的分析梯度。爲fmincon使用分析梯度的要求是,根據http://www.mathworks.com/help/toolbox/optim/ug/brhkghv-3.html

編寫代碼返回: 目標函數(標量)作爲第一輸出

梯度(載體)作爲第二輸出

設置「對」的GradObj選項與optimset。

objective返回目標的標量值和所需的梯度,Gradobj打開,所以我沒有看到我的問題。

+0

fmincon通常希望回答它可以與開始:(OUT = fmincon(@目標,X0,[],[],[],[0 0 0],[1 1 1],@ NONLIN,選項)X0不能爲空......(至少在使用優化工具箱我簡短的經驗) – Rasman 2011-04-13 04:24:18

+0

你當然是正確的 - 如果我跑了代碼上面寫的,它甚至不會跑,不要介意不使用算法我想要。在我的實際代碼中提供了初始猜測,我將更新問題以反映這一點。 – Dennis 2011-04-13 16:20:56

回答

0

我從Matlab的Usenet組獲得了一些幫助,它向我透露,信任區域方法實際上並不支持非線性約束,所以它在我的代碼中根本不是錯誤。他們推薦使用'內點'算法進行重寫,該算法有其自身的問題,但至少這個問題已經解決。