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

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

一、线性规划

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

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

  约束条件: 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.}

  求解函数为:
    [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},}

     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.}

  解:

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}

  约束条件: 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.}

  求解函数为:
    [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},}

     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.}

    解:

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),}

  约束条件: 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.}

  求解函数为:
    [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,}

     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.}

  解:

(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),}

    求解函数为:
    [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}]}

      求解函数为:
      [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)\ ,}

      约束条件: 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.}

      求解函数为:
      [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})} 的个数;seminfcon             是用于定义非线性不等式约束 c(x) 、非线性等式约束 ceq(x) 和半无穷 K i ( x , w i ) {K_{i}(x, w_{i})} 的函数。

      注意[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}} 取最小值时的 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,\\ }

       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, }

       1 w 1 100 , 1 w 2 100. {1\leq w_{1}\leq 100,1\leq w_{2}\leq 100.}

      解:
      (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)
发布了14 篇原创文章 · 获赞 50 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_43519779/article/details/104275279
今日推荐