当前位置:   article > 正文

【MATLAB】线性规划与非线性规划器求解_matlab线性求解器

matlab线性求解器

在MATLAB中,自带线性规划、整数规划和非线性规划求解器,在使用这些求解器前需要先得到参数输入,如系数矩阵A, Aeq,b,beq等。
这里就有个前提,如何获取这些系数矩阵呢?难道要自己手打系数矩阵吗?
这种办法在变量少时可以使用,但变量多时则很难实现。
以下介绍一个可行的方法,就是通过符号变量构造系数矩阵。

min f=x_3-y_6+z_2 \\\\ \left\{\begin{matrix} x_1+y_3=3\\ x_2+x_6-z_2+8=3 \\ x_6+y_6+z_3=10 \\x_i=y_i+2\end{matrix}\right.

这个模型实际上有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作为参数,若有非线性约束

x_2*y_4-z_3^2<8

根据上面参数的顺序,代码应该写成

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)不能既是整数,也在非线性等式约束中出现!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/593088
推荐阅读
相关标签
  

闽ICP备14008679号