「fminconの使用中にエラーが発生しました(300行目)Aには「n」列が必要です」というエラーが表示されます。次の最適化コードを解こうとするとき。制約の定義に誤りがあると思います。誰かが同じ問題を抱えていましたhttp://goo.gl/35MeCですが、残念ながら私は中国語を読みません!!
目的は、Yとその積分IntYの制約を受ける配列Yの最適値を見つけることです。問題の性質をよりよく理解するために、Yの各値は、連続する時間ステップの変数の値を表します。最小化する目的関数は、基本的に相互作用のコストです。
function [Y, IntY] = optTest()
% inputs of the problem
TS = 10; % number of time steps
YMin = -0.1; % minimum value of Y
YMax = 0.2; % maximum value of Y
IntYMin = 0.1; % min value of the integral of Y
IntYMax = 0.9; % max value of the integral of Y
IntYInit = 0.2; % initial value of the integral of Y
Prices = PricesFun(TS);
% use of function 'fmincon', preparation of the inputs
% x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
A = [tril(ones(TS))*1;tril(ones(TS))*-1];
b = [ones(TS,1)*(IntYInit-IntYMin);ones(TS,1)*(IntYMax-IntYInit)];
lb = ones(TS,1)*YMax;
ub = ones(TS,1)*YMin;
Y0 = ones(TS)*IntYInit;
Y = fmincon(@(x) costFun(x, Prices),Y0,A,b,[],[],lb,ub);
IntY = cumsum(Y);
function cost = costFun(x, Prices)
cost = sum(x*Prices);
function P = PricesFun(TS)
x = linspace(1,TS,TS);
pi = 3.1415;
P = 2 + sin(x/TS*4*pi);
上記のコードは自己完結型です。試してみたい場合は、matlabに貼り付けて、関数を呼び出すだけです。
[Y, IntY] = optTest();