#Matlab记--第一章:线性规划、整数规划、非线性规划

#Matlab记--第一章:线性规划、整数规划、非线性规划

    • 一、线性规划
    • 二、整数规划
    • 三、非线性规划
    • 章外杂谈

一、线性规划

  Matlab对于线性规划方程作出了如下规范:

  目标函数: m i n x f T x {{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}\nolimits^{{T}}}}x} xminfTx

  约束条件: s . t . { A ⋅ x ⩽ b , A e q ⋅ x = b e q , l b ⩽ x ⩽ u b {s.t.\left\{\begin{matrix}A\cdot x\leqslant b,\\Aeq\cdot x = beq,\\lb\leqslant x\leqslant ub\end{matrix}\right.} s.t.Axb,Aeqx=beq,lbxub

  求解函数为:
    [x, fval] = linprog(f, A, b, Aeq, beq, lb, ub)

  函数解释[1]:(1). 返回值x为决策向量的取值,fval为目标函数的最优值(最小值)。
       (2). 参数 f,x,b,beq,lb,ub为列向量;A,Aeq为矩阵。

  注意[1]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。

  例1:
  求解下列线性规划问题:
     m a x   z = 2 x 1 + 3 x 2 − 5 x 3 , {max\ z = 2x_{1} + 3x_{2} - 5x_{3},} max z=2x1+3x25x3,

     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. {s.t. \left\{\begin{matrix}x_{1} + x_{2} + x_{3} = 7,\\2x_{1} - 5x_{2} + x_{3} \geq 10,\\x_{1} + 3x_{2} + x_{3} \leq 12,\\x_{1},x_{2},x_{3}\geq 0.\end{matrix}\right.} s.t.x1+x2+x3=7,2x15x2+x310,x1+3x2+x312,x1,x2,x30.

  解:

f = [-2; -3; 5];
A = [-2 5 -1; 1 3 1];
b = [-10; 12];
Aeq = [1 1 1];
beq = 7;
lb = [0; 0; 0];
ub = [inf; inf; inf];
[x, fval] = linprog(f, A, b,Aeq, beq, lb, ub);
fval = -fval;
display(x);
display(fval);

二、整数规划

  Matlab对于整数线性规划方程作出了如下规范:

  目标函数: m i n x f T x {{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}\nolimits^{{T}}}}x} xminfTx

  约束条件: s . t . { x ( i n t c o n ) 为 整 数 A ⋅ x ⩽ b , A e q ⋅ x = b e q , l b ⩽ x ⩽ u b {s.t.\left\{\begin{matrix}x(intcon)为整数\\A\cdot x\leqslant b,\\Aeq\cdot x = beq,\\lb\leqslant x\leqslant ub\end{matrix}\right.} s.t.x(intcon)Axb,Aeqx=beq,lbxub

  求解函数为:
    [x, fval] = intlinprog(f, intcon, A, b, Aeq, beq, lb, ub)

  函数解释[2]:(1). 返回值x为决策向量的取值,fval为目标函数的最优值(最小值)。
       (2). 参数 f,x,b,beq,lb,ub为列向量;A,Aeq为矩阵。
       (3). intcon 为整数变量的地址,从1开始。

  注意[2]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。

  例2:
  求解如下的混合整数规划问题:
     m i n   z = − 3 x 1 − 2 x 2 − x 3 , {min\ z = - 3x_{1} - 2x_{2} - x_{3},} min z=3x12x2x3,

     s . t . { x 1 + x 2 + x 3 ≤ 7 , 4 x 1 + 2 x 2 + x 3 = 12 , x 1 , x 2 ≥ 0 , x 3 = 0   o r   1. {s.t. \left\{\begin{matrix} x_{1} + x_{2} + x_{3} \leq 7,\\ 4x_{1} + 2x_{2} + x_{3} = 12,\\ x_{1},x_{2}\geq 0,\\ x_{3}= 0\ or\ 1. \end{matrix}\right.} s.t.x1+x2+x37,4x1+2x2+x3=12,x1,x20,x3=0 or 1.

    解:

f = [-3; -2; -1];
A = [1 1 1];
b = 7;
Aeq = [4 2 1];
beq = 12;
lb = [0; 0; 0];
ub = [inf; inf; 1];
intcon = 3;
[x, fval] = intlinprog(f, intcon, A, b, Aeq, beq,lb, ub);
display(x);
display(fval);

三、非线性规划

  Matlab对于非线性规划方程作出了如下规范:

  目标函数: m i n   f ( x ) , {min\ f(x),} min f(x),

  约束条件: s . t .   { A ⋅ x ≤ b , A e q ⋅ x = b e q , c ( x ) ≤ 0 , c e q ( x ) = 0 , l b ≤ x ≤ u b {s.t. \ \left\{\begin{matrix} A\cdot x\leq b,\\ Aeq\cdot x=beq,\\ c(x)\leq 0,\\ ceq(x)=0,\\ lb\leq x\leq ub \end{matrix}\right.} s.t. Axb,Aeqx=beq,c(x)0,ceq(x)=0,lbxub

  求解函数为:
    [x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)

  函数解释[3]:(1). 返回值x为决策向量的取值,fval为目标函数的最优值(最小值)。
       (2). 参数 A, b, Aeq, beq定义了线性约束,x0为决策向量 x 的初始值。
       (3). 参数 fun 是用M文件定义的函数或匿名函数。
       (4). 参数 nonlcon 是用M文件定义的非线性向量函数 c(x),ceq(x) 。

  注意[3]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。
     (2). 定义M文件时,参数为决策向量。

  例3:
  求下列非线性规划:
     m i n   f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 , {min\ f(x) = x_{1}^{2} + x_{2}^{2} + x_{3}^{2} + 8,} min f(x)=x12+x22+x32+8,

     s . t .   { x 1 2 − x 2 + x 3 2 ≥ 0 , x 1 + x 2 2 + x 3 3 ≤ 20 , − x 1 − x 2 2 + 2 = 0 , x 2 + 2 x 3 2 = 3 , x 1 , x 2 , x 3 ≥ 0. {s.t.\ \left\{\begin{matrix} x_{1}^{2}-x_{2}+x_{3}^{2}\geq 0,\\ x_{1}+x_{2}^{2}+x_{3}^{3}\leq 20,\\ -x_{1}-x_{2}^{2}+2=0,\\ x_{2}+2x_{3}^{2}=3,\\ x_{1},x_{2},x_{3}\geq 0. \end{matrix}\right.} s.t. x12x2+x320,x1+x22+x3320,x1x22+2=0,x2+2x32=3,x1,x2,x30.

  解:

(1)编写 M 函数 fun1.m 定义目标函数:

function f = fun1(x)
f = x(1)^2 + x(2)^2 + x(3)^2 + 8;
end

(2)编写 M 函数 fun2.m定义非线性约束条件:

function [c, ceq] = fun2(x)
c = [-x(1)^2 + x(2) - x(3)^2
    x(1) + x(2)^2 + x(3)^3 - 20];
    
ceq = [-x(1) - x(2)^2 + 2
      x(2) + 2*x(3)^2 - 3];
end

(3)编写主程序文件:

fun = 'fun1';
x0 = [0; 0; 0];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0; 0; 0];
ub = [inf; inf; inf];
nonlcon = 'fun2';
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon);
display(x);
display(fval);

章外杂谈

  1、无约束极值的数值解

    目标函数: m i n x f ( x ) , {{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}}}(x),} xminf(x),

    求解函数为:
    [x, fval] = fminunc(fun, x0)
    [x, fval] = fminsearch(fun, x0)

    函数解释[4]:(1). 返回值 x 是所求得的极小值点,fval 是函数的极小值。
         (2). 参数 x0 是 x 的初始值,fun 是用M文件定义的函数或匿名函数。

    注意[4]:fminsearch 只能求给定的初始值附近的一个极小值点。

  2、对函数的零点和方程组的解

%%

A = [1 -1 2 -3]; % 多项式是用向量定义的,系数从高次幂到低次幂排列,如果缺少某一项,则系数为0
x0 = roos(A)

%%

f = @(x) x^3-x^2+2*x-3;
x0 = solve(f) % 求函数零点的符号解
x0 = vpa(x0, 5) % 化成小数格式的数据

%%

y = @(x) x^3 - x^2 + 2 * x - 3;
x = fsolve(y, rand) % 只能求给定初始值附近的一个零点

%%

  3、约束极值的数值解

    (1). 求单变量非线性函数在区间上的极小值

      目标函数: m i n x f ( x )   , x ∈ [ x 1 , x 2 ] {{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}}}(x)\ ,x \in [x_{1}, x_{2}]} xminf(x) ,x[x1,x2]

      求解函数为:
      [x, fval] = fminbnd(fun, x1, x2)

      函数解释[5]:(1). 返回值 x 是极小点x,fval 是函数的极小值。
           (2). 参数 fun 是用M文件定义的函数或匿名函数,x1 和 x2 分别为区间的上下限。

    (2). 求非线性约束下的极值
      目标函数: m i n f ( x )   , {{\mathop{{{min}}}{f\mathop{{}}}}(x)\ ,} minf(x) ,

      约束条件: s . t .   { A ⋅ x ≤ b A e q ⋅ x = b e q , l b ≤ x ≤ u b , c ( x ) ≤ 0 , c e q ( x ) = 0 , K i ( x , w i ) ≤ 0 , 1 ≤ i ≤ n . {s.t.\ \left\{\begin{matrix} A\cdot x\leq b\\ Aeq\cdot x=beq,\\ lb\leq x\leq ub,\\ c(x)\leq 0,\\ ceq(x)=0,\\ K_{i}(x,w_{i})\leq 0,1\leq i\leq n. \end{matrix}\right.} s.t. AxbAeqx=beq,lbxub,c(x)0,ceq(x)=0,Ki(x,wi)0,1in.

      求解函数为:
      [x, fval] = fseminf (fun, x0, ntheta, seminfcon, A, b, Aeq, beq, lb, ub)

      函数解释[6]:(1). 返回值 x 是极小点x,fval 是函数的极小值。
           (2). 参数 fun 用于定义目标函数 f(x) ;x0 为 x 的初始值;ntheta是半无穷约束 K i ( x , w i ) {K_{i}(x,w_{i})} Ki(x,wi)的个数;seminfcon             是用于定义非线性不等式约束 c(x) 、非线性等式约束 ceq(x) 和半无穷 K i ( x , w i ) {K_{i}(x, w_{i})} Ki(x,wi)的函数。

      注意[6]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。
         (2). 函数seminfcon 有两个输入参量 x 和 s,s 是推荐的取样步长,也可不使用。
         (3). 初始值 x0 的取值很重要,如果取得不合适,可能就得不到可行解。

      例4:求函数 f ( x ) = ( x 1 − 0.5 ) 2 + ( x 2 − 0.5 ) 2 + ( x 3 − 0.5 ) 2 {f(x)=(x_{1}-0.5)^{2}+(x_{2}-0.5)^{2}+(x_{3}-0.5)^{2}} f(x)=(x10.5)2+(x20.5)2+(x30.5)2取最小值时的 x {x} x 值,约束为:
       K 1 ( x , w 1 )   =   s i n ( w 1 x 1 ) c o s ( w 1 x 2 )   − 1 1000 ( w 1 − 50 ) 2 − s i n ( w 1 x 3 ) − x 3 ≤ 1 , {K_{1}(x,w_{1})\ =\ sin(w_{1}x_{1})cos(w_{1}x_{2})\ -\frac{1}{1000}(w_{1}-50)^{2}-sin(w_{1}x_{3})-x_{3}\leq 1,\\ } K1(x,w1) = sin(w1x1)cos(w1x2) 10001(w150)2sin(w1x3)x31,

       K 2 ( x , w 2 )   =   s i n ( w 2 x 2 ) c o s ( w 2 x 1 )   − 1 1000 ( w 2 − 50 ) 2 − s i n ( w 2 x 3 ) − x 3 ≤ 1 , { K_{2}(x,w_{2})\ =\ sin(w_{2}x_{2})cos(w_{2}x_{1})\ -\frac{1}{1000}(w_{2}-50)^{2}-sin(w_{2}x_{3})-x_{3}\leq 1, } K2(x,w2) = sin(w2x2)cos(w2x1) 10001(w250)2sin(w2x3)x31,

       1 ≤ w 1 ≤ 100 , 1 ≤ w 2 ≤ 100. {1\leq w_{1}\leq 100,1\leq w_{2}\leq 100.} 1w1100,1w2100.

      解:
      (1). 编写 M 函数 fun1.m 定义目标函数:

function fun = fun4(x,s)
fun = (x(1) - 0.5)^2 + (x(2) - 0.5)^2 + (x(3) - 0.5)^2;
end

      (2). 编写 M 函数 fun2 .m 定义约束条件:

function [c, ceq, k1, k2, s] = fun5(x, s)
c = [];ceq = [];
if isnan(s(1,1))
    s = [0.2 0;0.2 0];
end

% 取样值
w1 = 1:s(1,1):100;
w2 = 1:s(2,1):100;

% 半无穷约束
k1 = sin(w1*x(1)).*cos(w1*x(2))-(w1-50).^2/1000-sin(w1*x(3))-x(3)-1;
k2 = sin(w2*x(2)).*cos(w2*x(1))-(w2-50).^2/1000-sin(w2*x(3))-x(3)-1;

% 画出半无穷约束的图形
plot(w1, k1, '-', w2, k2, '+');
end

      (3). 编写主程序文件:

A = [];b = [];Aeq = [];beq = [];lb = [-inf;-inf;-inf];ub = [inf;inf;inf];
fun = 'fun4';
semifcon = 'fun5';
ntheta = 2;
x0 = [0.5; 0.2; 0.3]; % 如果初始值取的不合适,可能就得不到可行解
[x, fval] = fseminf(fun, x0, ntheta, semifcon, A, b, Aeq, beq, lb, ub)

你可能感兴趣的:(Matlab)