MATLAB中的fmincon函数

2025年03月25日 08:36
有2个网友回答
网友(1):

可以把'10000/(x(1).......'这个写成如下形式:
w=[100000,w(2),...,w(n)];
for i=1:length(w)
y=@(x)w(i)/(x(1)*0.971/33.5.........;
[x,favl]=fmincon(y,x0,A,b,Aeq,beq,VLB,VUB);
end
或者:可以写一个函数myfun.m
function f=myfun(x)
global p
f=p/(x(1)*0.971/33.5..............;
------------------------------------
主函数调用部分写成
global p
...
...
w=[w(1),w(2),....w(n)];
for i=1:n
p=w(i);
[x,favl]=fmincon(@myfun,x0,A,b,Aeq,beq,VLB,VUB);
end

网友(2):

你换个初值即可运算了,不要取0即可。
我试了下,取x0=[284.4086 469.2243 64.7811 988.3349 929.88 929.88 929.88 929.88];得到的结果最好

A=[1 0 0 0 -1 0 0 0;-1 0 0 0 1 0 0 0;0 1 0 0 1 -1 0 0;0 -1 0 0 -1 1 0 0;0 0 1 0 0 1 -1 0;0 0 -1 0 0 -1 1 0;0 0 0 1 0 0 1 -1;0 0 0 -1 0 0 -1 1;]
b=[-851.9;1169.9;1453.5;-589.3;1767.7;-663.9;455.8;-216.5];
Aeq=[1 1 1 1 0 0 0 0];

q=2500;
beq=[q];
lb=[0 0 0 0 929.88 929.88 929.88 929.88];
ub=[q q q q 1394.82 1394.82 1394.82 1394.82];
x0=[284.4086 469.2243 64.7811 988.3349 929.88 929.88 929.88 929.88];
[x,fval,exitflag]=fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub)