赞
踩
在MATLAB中,自带线性规划、整数规划和非线性规划求解器,在使用这些求解器前需要先得到参数输入,如系数矩阵A, Aeq,b,beq等。
这里就有个前提,如何获取这些系数矩阵呢?难道要自己手打系数矩阵吗?
这种办法在变量少时可以使用,但变量多时则很难实现。
以下介绍一个可行的方法,就是通过符号变量构造系数矩阵。
这个模型实际上有x1...x6,y1...y6,z1...z6一共18个变量,手打系数矩阵则要数清楚哪个地方是0哪个地方不是0,用接下来符号变量定义:
首先定义参数:
X=sym('x',[1,6]);
Y=sym('y',[1,6]);
Z=sym('z',[1,6]);
var=[X,Y,Z];%定义变量的顺序依次为X,Y,Z,在线性规划函数中,y(1)相当于在x(7)的位置,x(18)则为z(6)
定义等式约束组:
AeqM=sym('aeq',[9,1]); %在一个大的符号向量中存放等式约束,等式约束个数为9个
AeqM(1)=X(1)+Y(3)-3;
AeqM(2)=X(2)+X(6)-Z(2)+8-3;
AeqM(3)=X(6)+Y(6)+Z(3)-10;
j=4;
for i=1:6
AeqM(j)=X(i)-Y(i)-2 ;
j=j+1 ;
end
得到等式组
根据等式和参数提取Aeq和beq
[Aeq,beq] = equationsToMatrix(AeqM, var);%提取Aeq,beq
便可得到求解器需要的等式系数矩阵的符号向量
Aeq =
Aeq =
[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0]
[1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0]
beq =
3
-5
10
2
2
2
2
2
2
但是由于其类型不是double,还不能输入求解器,需要进行转换
Aeq=double(Aeq);% 等式约束的变量系数矩阵
beq =double(beq);%等式约束的资源数
如此便可输入到求解器中求解了。
对于目标函数和不等式约束也是由同样的方法得到系数矩阵或向量。
但目前该方法仅限于线性约束提取系数矩阵,不能对非线性约束提取系数矩阵
非线性约束求解器fmincon的输入参数为
若目标函数是可变的,每次都需要输入参数改变函数中的risk值,
则先把目标函数的输入形式以字符串形式拼接起来obj=['fun1(x,',num2str(risk),')'];
[x,y]=fmincon(obj,x0,A,b,Aeq,beq,lb,ub,'fun2',options);
其中'fun1'为目标函数文件名称,'fun2'为非线性约束的函数文件名称。
在fun2中,可以用符号类似常量定义公式,但只能以x作为参数,若有非线性约束
根据上面参数的顺序,代码应该写成
A=[
x(2)*x(10)-x(15)^2)-8
]
fmincon不支持非线性整数规划,但可在非线性函数中加上等式约束实现整数规划,如
ceqM(i)=mod(x(i),1);%意思是约束x对1取余=0
求解器设置options = optimoptions('fmincon','Display','none');
可以不显示求解信息(如未达到最优解)
MTALAB自带的ga求解器可以求解非线性整数规划,但是整数参数约束和等式约束不能同时出现,即x(2)不能既是整数,也在非线性等式约束中出现!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。