具有fmincon(Matlab)的方程组中的不等式约束

时间:2019-05-10 16:50:10

标签: matlab constraints system equation

我需要用以下形式求解由44个未知数(x)组成的44个方程组

(-1 /(1-x(t)))+(phi(t)*(1 / T)*Σ_{h = 45} ^ {60}β^ {ht}))= 0

其中phi_t对于t <= 25取值0,在其他所有地方取值1,其中T = phi(1)x(1)+ phi(2)x(2)+ ... + phi(44)x (44)。

我有两种约束。首先,所有x必须在0.1到0.5之间,并且T必须在0.9以下。

编辑:以下链接是带有完整问题的图片以及代表解决方案的相关方程组,Stack Overflow不允许我发布图片。 Maximization problemsystem of equations。该约束基本上意味着所有t和phi(25)x(25)+ phi(26)x(26)... + phi(43)x(43)+的x(t)\ in [0.1,0.5] phi(44)x(44)<= 0.9

我使用Matlab的fmincon,并且它返回的解决方案满足τ上的约束位置,但是返回的T的结果远大于其打算具有的最大值0.9。

我使用以下主文件:

clear all
clc

% Solve restricted problem

global beta phi w C R D
C = 25;
R = 40;
D = 55;
beta = 0.99;
phi = [0,1];
w = ones(1,R-1);

phiB = phi(1)*ones(1,R-1);
for i=C:R-1
    phiB(i) = phi(2);
end

lb = 0.1*ones(1,R-1); % Lower bound constraint
ub = 0.5*ones(1,R-1); % Lower bound constraint
rng default % reproducible initial point
x0 = 0.01*ones(R-1,1);
opts = optimoptions(@fmincon,'Algorithm','interior-point','Display','off');
sol = fmincon(@(x)0,x0,phiB,0.9,[],[],lb,ub,@fminconstr,opts)

其中 fmincon 函数表示常数的最大值,因此唯一需要满足的条件就是等式和不等式约束。它调用形式为

fminconstr 的函数

function [c,ceq] = fminconstr(x)

    c = []; % nonlinear inequality
    ceq = fbnd(x); % the fsolve objective is fmincon constraints

end

其中约束是方程组,由函数 fbnd

定义
function F = fbnd(x)

    global R C D
    global beta
    global phi
    global w

    phiB = phi(1)*ones(1,R-1);
    for i=C:R-1
         phiB(i) = phi(2);
     end

    T =  phiB * x;

    F = NaN(1,R-1);
    for i=1:C
        betaM = beta*ones(1,D-R);
        for j = 1:D-R
            betaM(j) = beta^(R+j-i-1);
        end
        F(i) = ((-1/(w(i)-x(i))) + phi(1)*(1/T)*sum(betaM));            
    end
    for i=C-1:R-1
        betaM = beta*ones(1,D-R);
        for j = 1:D-R
            betaM(j) = beta^(R+j-i-1);
        end
        F(i) = ((-1/(w(i)-x(i))) + sum(phi(2)*betaM'*(1/T)));        
    end

end

程序返回x的值在0.1到0.5之间,因此这些约束起作用。但是,当按问题中的描述计算T时(以fmincon表示,我知道此约束是Ax <= b),我获得的T值为4.6左右,远高于约束定义的0.9。

我还尝试将此约束定义为c(x)<= 0,将代码修改为

 sol = fmincon(@(x)0,x0,[],[],[],[],lb,ub,@fminconstr2,opts)

其中 fminconstr2 现在是

function [c,ceq] = fminconstr2(x)

    global phi
    global R 
    global C

    c = fbnd2(x); % nonlinear inequality
    ceq = fbnd(x); % the fsolve objective is fmincon constraints

end

fbnd2

function T = fbnd2(x)

    global R C
    global phi

    phiB = phi(1)*ones(1,R-1);
    for i=C:R-1
        phiB(i) = phi(2);
    end

    T =  phiB * x - 0.9;

end

并获得大约4.6的T的相同结果。

我想求解相同的方程组,但是我需要获得一个T值,该值在我指定的约束范围内。

1 个答案:

答案 0 :(得分:0)

enter image description here

您的平等约束在逻辑上是错误的。如果设置ceq = [],则将获得仅满足lb,ub和T <= 0.9约束的解决方案