0

「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();
4

1 に答える 1

2

最初の推測Y0は、最適化に関係する変数の数を定義するものです。のTSxTS正方行列を入力していますがY0、これにはTS*TS線形制約が必要です。との列ベクトルを使用しているとすると、列ベクトルとしても作成するつもりだったと思いますlbubY0Y0 = ones(TS,1)*IntYInit;

于 2012-10-18T17:08:20.050 に答える