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是定义优化中涉及的变量数量。您正在为 输入一个 TS x TS 方阵Y0,这需要 TS*TS 线性约束。鉴于您将列向量用于lband ub,我假设您也打算创建Y0为列向量,或者Y0 = ones(TS,1)*IntYInit;

于 2012-10-18T17:08:20.050 回答