2017-06-07 159 views
0

我想在Matlab與fmincon (interior-point)施加兩個非線性約束:違規非線性約束fmincon內點Matlab的

sqrt(w*S*w') <= sigmaTgt/sqrt(260) 
sqrt(w*S*w') >= sigmaTgt/sqrt(260)-0.02/sqrt(260) 

我試過如下:

function [c,ceq] = in_nonlconstr(w, S) 

    c(1) = sqrt(w*S*w') - tgtVolAnn/sqrt(260); 
    c(2) = - sqrt(w*S*w') + (tgtVolAnn/sqrt(260) - 0.02/sqrt(260)); 
    ceq = []; 

end 

但優化後,我不斷收到即sqrt(w*S*w')滿足c(1)但不是c(2),儘管exitflag爲1且求解器已經收斂。

我的寫作是否正確?或者我的求職者有沒有錯?從output.message


消息:

局部最小值發現滿足約束。

優化完成,因爲目標函數是 非遞減的可行方向,到 最優公差的默認值之內,滿足約束的約束寬容的 默認值內。

停止標準的細節:

優化完成:相對第一階最優測量, 9.821943e-07,小於options.OptimalityTolerance = 1.000000e-06,相對最大約束違反,0.000000e +00,比選項小 .ConstraintTolerance = 1.000000e-06。

優化度量選項 相對第一階最優= 9.82e-07 OptimalityTolerance = 1E-06(默認值)的相對最大值(約束違反)= 0.00E + 00 ConstraintTolerance = 1E-06(默認值)

+0

是的,因爲我把* -1從> =轉換爲<=。你會如何做到這一點? – JohnAndrews

+0

你可以爲我運行這個嗎? options = optimset('fmincon')並在選項中發佈變量?那麼即使我沒有優化工具箱,我也可以很快給你一個解決方案。 – Matt

回答

1

給這一個鏡頭:

options = optimset('OptimalityTolerance', 1e-20, 'ConstraintTolerance', 1e-20); 
% this may need to be instead started with the function name, depends on your MATLAB version 
options = optimset('fmincon','OptimalityTolerance', 1e-20, 'ConstraintTolerance', 1e-20); 
fmincon(....., options) % i.e. what you already are passing to fmincon but adding additional tolerances 

讓我知道是否能解決你的問題。如果不是我的變量名稱可能是錯誤的,我需要你運行options=optimset('fmincon')並在options中發佈變量名稱來設置容差。你有另一種選擇就是改變你的算法 - MATHWORKS說sqp通常比您正在使用的方法更好:

options = optimset('fmincon','Algorithm','sqp','TolConSQP',1e-20) % other choices are 'active-set' or 'trust-region-reflective' and don't have the `TolConSQP` tolerance parameter, which you may not need at all anyhow 

當然可以使用較低的容忍它是否適合你的應用程序中你 - 這似乎1E -20是任何算法中最大的。 查看文檔:http://www.mathworks.com/help/optim/ug/fmincon.html#inputarg_options