【Matlab基础学习】运筹学-线性规划简单总结

线性规划问题:

linprog函数

2.1 x = linprog(f,A,b)

可用于求解

img

2.2 x = linprog(f,A,b,Aeq,beq)

可用于求解

img

2.3 x = linporg(f,A,b,Aeq,beq,VLB,VUB)

可用于求解

img

2.4 [x,fval] = linprog(f,A,b,Aeq,beq,VLB,VUB)

其用法与 2.3 一致,只是这种写法会返回目标函数的值(即最小值)fval

若要求最大值则将 返回的目标函数的值 取相反数

例:

max ⁡ z = 2 x 1 + 3 x 2 − 5 x 3  s.t.  x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 \begin{array}{ll} & \max z=2 x_{1}+3 x_{2}-5 x_{3} \\ \text { s.t. } & x_{1}+x_{2}+x_{3}=7 \\ & 2 x_{1}-5 x_{2}+x_{3} \geq 10 \\ & x_{1}+3 x_{2}+x_{3} \leq 12 \\ & x_{1}, x_{2}, x_{3} \geq 0 \end{array}  s.t. maxz=2x1+3x25x3x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30

f=[2;3;-5];
a=[-2 5 -1;1 3 1];
b=[-10;12];
aeq=[1 1 1];
beq=7;
[x,fval]=linprog(-f,a,b,aeq,beq,zeros(3,1));
%注意fval是最小值 所以要取相反数
fprintf('x1=%.4f,x2=%.4f,x3=%.4f\nz:%4f\n',x,-fval)
  1. 生产决策问题
    一生产甲、乙两种产品,己知制成一吨产品甲需用资源A 3吨,资源B 4平方米,产品乙需用资源A 2吨,资源B6平方米,资源C 7个单位。若每吨产品甲和乙的经济价值分别为7万元和5万元,3种资源的限制量分别为80吨、220平方米和230个单位,分析应生产这两种产品各多少吨才能使创造的总经济价值最高?
    这里可以令生产产品甲的数量为x_1生产产品乙的数量为x_2。
f=[-7;-5];
A=[3 2
   4 6
   0 7];
b=[80;220;230];
lb=zeros(2,1);
[x,fval,exitflag,output,lambda]=linprog(f,A,b,[],[],lb)
  1. 转换

    min ⁡ z = ∣ x 1 ∣ + 2 ∣ x 2 ∣ + 3 ∣ x 3 ∣ + 4 ∣ x 4 ∣ \operatorname { m i n } z = | x _ { 1 } | + 2 | x _ { 2 } | + 3 | x _ { 3 } | + 4 | x _ { 4 } | minz=x1+2x2+3x3+4x4
    x 1 − x 2 − x 3 + x 4 = 0 x 1 − x 2 + x 3 − 3 x 4 = 1 x 1 − x 2 − 2 x 3 + 3 x 4 = − 1 2 \left. \begin{array} { l } { x _ { 1 } - x _ { 2 } - x _ { 3 } + x _ { 4 } = 0 } \\ { x _ { 1 } - x _ { 2 } + x _ { 3 } - 3 x _ { 4 } = 1 } \\ { x _ { 1 } - x _ { 2 } - 2 x _ { 3 } + 3 x _ { 4 } = - \frac { 1 } { 2 } } \end{array} \right. x1x2x3+x4=0x1x2+x33x4=1x1x22x3+3x4=21

    这里是一个到线性规划的转换,要做一个变量的变换,把每一个绝对值x都替换成一个u和v的表示变量
    如:

 u = (x + |x|) / 2 
`v = (|x| - x) / 2
   clc,clear
   c = 1:4;
   c = [c,c];
   aeq = [1 -1 -1 1;1 -1 1 -3;1 -1 -2 3];
   Aeq = [aeq,-aeq];beq = [0 1 -1/2];
   [x,y] = linprog(c,[],[],Aeq,beq,zeros(8,1))
   x = x(1:4)-x(5:8)

fminunc函数

求多变量无约束函数的最小值。

语法

  • x = fminunc(fun,x0)
  • x = fminunc(fun,x0,options)
  • x = fminunc(problem)
  • [x,fval] = fminunc( ___ )
  • [x,fval,exitflag,output] = fminunc( __ )
  • [x,fval,exitflag,output,grad,hessian] = fminunc( ___ )

表示和描述

  • x = fminunc(fun,x0)从x0点开始,尝试找到fun中描述的函数的一个局部最小x。点x0可以是标量、向量或矩阵。
  • Note fminunc适用于无约束的非线性问题。如果您的问题有约束,通常使用fmincon。参见优化决策表。
  • x = fminunc(fun,x0,options)通过选项中指定的优化选项最小化乐趣。使用 optimoptions 设置这些选项。
  • x = fminunc(problem)找到问题的最小值,其中问题是 Input Arguments 中描述的结构。
  • [x,fval] = fminunc( __ ),对于任何语法,返回目标函数在解x处的值
  • [x,fval,exitflag,output] = fminunc()另外返回一个描述fminunc退出条件的exitflag值,以及一个包含优化过程信息的结构输出
  • [x,fval,exitflag,output,grad,hessian] = fminunc( __ )另外返回:
    • 梯度-解x处的梯度。
    • Hessian- 解决方案x的x1和x2的偏导。
    • H e s s i a n = H i j = ∂ 2 f ∂ x i ∂ x j Hessian=H _ { i j } = \frac { \partial ^ { 2 } f } { \partial x _ { i } \partial x _ { j } }Hessian=Hij=∂x**ix**j∂2f

例:

  1. 找到使函数f(X)=-X1X2X3最小化的值,其中0≤X1+2X2+2X3≤72

image
2.
f ( x ) = 3 x 1 2 + x 2 2 + 2 x 1 x 2 f ( x ) = 3 x _ { 1 } ^ { 2 } + x _ { 2 } ^ { 2 } + 2 x _ { 1 } x _ { 2 } f(x)=3x12+x22+2x1x2
的最小值
image

quadprog函数

求解二次规划

x=quadprog(H,f,A,b)
x=quadprog(H,f,A,b,Aeq,beq)
x=quadprog(H,f,A,b,Aeq,beq,lb,ub)
x=quadprog(H,f,A,b,Aeq,beq,Ib,ub,x0)
x=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]quadprog(..)
[x,fval,exitflag]=quadprog(.…)

例:

f ( x ) = 1 / 2 x 1 2 + x 2 2 − x 1 x 2 − 2 x 1 − 6 x 2 f ( x ) = 1 / 2 x _ { 1 } ^ { 2 } + x _ { 2 } ^ { 2 } - x _ { 1 } x _ { 2 } - 2 x _ { 1 } - 6 x _ { 2 } f(x)=1/2x12+x22x1x22x16x2

{ x 1 + x 2 ≤ 2 − x 1 + 2 x 2 ≤ 2 2 x 1 + x 2 ≤ 3 0 ≤ x 1 , 0 ≤ x 2 \{ \begin{array} { l } { x _ { 1 } + x _ { 2 } \leq 2 } \\ { - x _ { 1 } + 2 x _ { 2 } \leq 2 } \\ { 2 x _ { 1 } + x _ { 2 } \leq 3 } \\ { 0 \leq x _ { 1 } , 0 \leq x _ { 2 } } \end{array} {x1+x22x1+2x222x1+x230x1,0x2

img

​ 【分析】首先应该把目标函数表示成如下矩阵形式:

img

​ 这里要细说一下如何写成矩阵形式。

​ 首先,向量x是很容易写出的,因为f(x)包含两个变量x1和x2,因此

img

​ 其次,向量f只与两个变量x1和x2的一次项有关,所以fTx=-2x1-6x2,因此

img

​ 最后,矩阵H只与两个变量x1和x2的二次项有关,所以img,这里要注意的是不同于二次型,这里有个系数1/2,所以矩阵H的元素是二次型中的矩阵元素大小的两倍。给出一个规律:设矩阵H第i行第j列的元素大小为H(i,j),二次项xixj的系数为a(i,j),则

img

​ 本例中,img,这是由于x1的平方项(即x1x1)系数为1/2,所以第1行第1列的元素为1=2*(1/2),x2的平方项(即x2x2)系数为1,所以第2行第2列的元素为2=21,x1x2项(即x2x*1)的系数为-1,所以第1行第2列和第2行第1列的元素均为-1。

​ 目标函数搞定之后,下面来看约束条件部分,约束条件应该写成如下形式:

img

​ 本例中约束条件只有不等式约束,因此Aeq和beq为空,对于A和b很容易就可以得出来:

img

​ 而约束条件中对变量x1和x2只给出下限,没有给上限,因此ub为空,img

​ 得到了所有的参数,将参数输入MATLAB,编程如下:(代码是直接在Command Window中一行一行录入的,所以每行前面有符号“>>”)

H = [1 -1; -1 2];
f = [-2; -6];
A = [1 1; -1 2; 2 1];
b = [2; 2; 3];
lb = [0; 0];
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb)

画图

matlab绘图

%x1=4
L1=[4,0;4,4]; 
plot(L1(:,1),L1(:,2));hold on 
text(4.1,3.5,'x_1=4','color','b'); 
%x2=3
L2=[0 3;5 3]; 
plot(L2(:,1),L2(:,2));hold on 
text(0.8,3.1,'x_2=3','color','b'); 
%2*x1+5*x2=12
L3=[0 2.4;5 0.4]; 
plot(L3(:,1),L3(:,2));hold on 
text(1,1.5,'2x_1+5x_2=12','color','b') 
%x1+2*x2=8
L4=[0,4;4,2]; 
plot(L4(:,1),L4(:,2)); 
text(3,2.5,'x_1+2x_2=8','color','b') 

%几个点围成的图像的阴影
x=[0 0 2 4 4]'; 
y=[2.4 3 3 2 0.8]'; 
fill(x,y,'r'); 
xlabel('x_1') 
ylabel('x_2') 

axis([0 5.3 -0.2 4]) 

%交点1
z0=[0,2.4;4.8,0]; 
plot(z0(:,1),z0(:,2),'k--','LineWidth',2); 
text(4.5,0.3,'z=4.8') 
%交点2
z1=[0,2.8;4.6,0.5]; 
plot(z1(:,1),z1(:,2),'k--','Linewidth',2); 
text(4.6,0.5,'z=5.6') 
%交点3
z2=[0,3;4.6,0.7]; 
plot(z2(:,1),z2(:,2),'k--','Linewidth',2); 
text(4.6,0.7,'z=6') 
%交点4
z3=[0.6,3.7;4.6,1.7]; 
plot(z3(:,1),z3(:,2),'g--','Linewidth',2); 
text(4.6,1.7,'z=8') 
%画交点
text(4,2,'A_2','color','r','fontsize',20); 
text(2,3,'A_1','color','r','fontsize',20); 
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值