我需要用以下形式求解由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 problem和system 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值,该值在我指定的约束范围内。