当前位置:   article > 正文

【数学建模笔记】3.非线性规划

非线性规划

1.非线性规划的实例与定义

如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。

例1:(投资决策问题)

某企业拥有n个项目可供选择投资,并且至少要对其中一个项目投资。已知该企业拥有总资金A元,投资于第i(i=1,....n)个项目需花费资金ai元,并预计可收益bi元,试选择最佳投资方案。

2.非线性规划的数学模型

一般形式:

min\, f\left ( x \right )

s.t\begin{Bmatrix} h_{j}\left ( x \right )\leq 0\, j=1,2,...q\\ g_{i}\left ( x \right )= 0\, i=1,2,...p \end{Bmatrix}

在一组等式或不等式的约束下,求一个函数的最大值(或最小值)问题,其中至少有一个非线性函数,这类问题称之为非线性规划问题。

matlab中非线性规划的数学模型写成以下形式:

min\, f\left ( x \right )

s.t.\left\{\begin{matrix} Ax\leqslant b\\ Aeqx=beq\\ c\left ( x \right )\leqslant 0\\ ceq\left ( x \right )=0\\ lb\leqslant x\leqslant ub \end{matrix}\right.

 其中f(x)是标量函数,A,b,Aeq,beq,lb,ub是相应维数的矩阵和向量,c(x),ceq(x)是非线性向量函数

matlab中的命令是:

[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

x的返回值是决策向量x的取值;

fval返回的是目标函数的取值;

fun是用M文件定义的函数;

x0是x的初始值;

A,b,Aeq,beq定义了线性约束Ax<=b,Aeqx=beq,如果没有线性约束,则A=[ ],b=[ ],Aeq=[ ],beq=[ ];

lb和ub是变量x的下界和上界,如果上界和下界没有约束,即x无下界也无上界,则lb=[ ],ub=[ ],也可以写成lb的各分量都为-inf,ub的各分量都为inf;

nonlcon是用M文件定义的非线性向量函数c(x),ceq(x);

options定义了优化参数,可以使用matlab缺省的参数设置。

例2:求下列非线性规划

min\, f\left ( x \right )=x{_{1}}^{2}+x{_{2}}^{2}+x{_{3}}^{2}+8

s.t.\left\{\begin{matrix} x{_{1}}^{2}-x_{2}+x{_{3}}^{2}\geq 0\\ x_{1}+x{_{2}}^{2}+x{_{3}}^{2}\leqslant 20\\ -x_{1}-x{_{2}}^{2}+2=0\\ x_{2}+2x{_{3}}^{2}=3\\ x_{1},x_{2},x_{3}\geqslant 0 \end{matrix}\right.

解:

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

  1. function f=fun1(x);
  2. f=sum(x.^2)+8;

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

  1. function [g,h]=fun2(x);
  2. g=[-x(1)^2+x(2)-x(3)^2
  3. x(1)+x(2)^2+x(3)^2-20];
  4. h=[-x(1)-x(2)^2+2
  5. x(2)+2*x(3)^2-3];

(3)编写主程序文件example2.m如下:

[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')

3.二次规划 

若某非线性规划的目标函数为自变量x的二次函数,约束条件又全是线性的,就称这种规划为二次规划

matlab中二次规划的数学模型可表述如下:

min\, \frac{1}{2}x^{T}Hx+f^{T}x

 s.t.\left\{\begin{matrix} Ax\leqslant b\\ Aeqx=beq\\ lb\leqslant x\leqslant ub \end{matrix}\right.

这里H是实对称矩阵,f,b,beq,lb,ub,是列向量,A,Aeq是相应维数的矩阵

matlab中求解二次规划的的命令是:

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

返回值x是决策向量x的取值;

返回值fval是目标函数在x处的值;

具体细节可以参考在matlab命令窗口中运行help quadprog的帮助

例3:求解二次规划

min\, f\left ( x \right )=2x{_{1}}^{2}-4x_{1}x_{2}+4x{_{2}}^{2}-6x_{1}-3x_{2}

s.t.\left\{\begin{matrix} x_{1}+x_{2}\leqslant 3\\ 4x_{1}+x_{2}\leqslant 9\\ x_{1},x_{2}\geqslant 0 \end{matrix}\right.

解:编写如下程序

  1. h=[4,-4;-4,8];%%二次型矩阵,平方项系数x2填对角,交叉项系数/2
  2. f=[-6;-3];
  3. a=[1,1;4,1];
  4. b=[3,9];
  5. [x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))

例4:

某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位:千米 )及水泥日用量d(吨)由下表给出。目前有两个临时料场位于A(5,1),B(2,7),日储量各有20吨。假设从料场到工地之间均有直线道路相连。   (1)试制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的吨千米数最小。  (2)为了进一步减少吨千米数,打算舍弃两个临时料场,改建两个新的,日储量各为20吨,问应建在何处,节省的吨千米数有多大?

程序:

  1. a = [1.25 8.75 0.5 5.75 4 7.25];
  2. b = [1.25 0.75 4.75 5 6.5 7.25];
  3. d =[3 5 4 7 6 11];
  4. x =[5 2];
  5. y =[1 7];
  6. e =[20 20];
  7. for i=1:6
  8. for j=1:2
  9. aa(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2);
  10. end
  11. end
  12. CC=[aa(:,1);aa(:,2)];
  13. A=[1 1 1 1 1 1 0 0 0 0 0 0;0 0 0 0 0 0 1 1 1 1 1 1];
  14. B=[20;20];
  15. Aeq=[1 0 0 0 0 0 1 0 0 0 0 0 %从第一\二料场运到工地一的料
  16. 0 1 0 0 0 0 0 1 0 0 0 0
  17. 0 0 1 0 0 0 0 0 1 0 0 0
  18. 0 0 0 1 0 0 0 0 0 1 0 0
  19. 0 0 0 0 1 0 0 0 0 0 1 0
  20. 0 0 0 0 0 1 0 0 0 0 0 1 ];
  21. beq=[d(1);d(2);d(3);d(4);d(5);d(6)];
  22. VLB=[0 0 0 0 0 0 0 0 0 0 0 0];
  23. VUB=[];
  24. x0=[1 2 3 0 1 0 0 1 0 1 0 1];%给一个初值,可以不给
  25. [xx,fval]=linprog(CC,A,B,Aeq,beq,VLB,VUB,x0)

 改建两个新料场时,原本的A,B坐标变成未知数,令x_{1}=X_{13} ,y_{1}=X_{14} ,x_{2}=X_{15} ,y_{2}=X_{16}

定义目标函数:

  1. function f=liaoch(x)
  2. a=[1.25 8.75 0.5 5.75 3 7.25];
  3. b=[1.25 0.75 4.75 5 6.5 7.25];
  4. d=[3 5 4 7 6 11];
  5. e=[20 20];
  6. f1=0;
  7. for i=1:6
  8. s(i)=sqrt((x(13)-a(i))^2+(x(14)-b(i))^2);
  9. f1=s(i)*x(i)+f1;
  10. end
  11. f2=0;
  12. for i=7:12
  13. s(i)=sqrt((x(15)-a(i-6))^2+(x(16)-b(i-6))^2);
  14. f2=s(i)*x(i)+f2;
  15. end
  16. f=f1+f2;

 取初值为线性规划的计算结果及临时料场的坐标: x0=[3  5 0  7  0  1  0  0  4  0  6 10 5 1 2 7]';

 编写主程序:

  1. clear
  2. x0=[3 5 0 7 0 1 0 0 4 0 6 10 5 1 2 7];
  3. %x0=[ 3.0000 5.0000 0.0707 7.0000 0 0.9293 0 0 3.9293 0 6.0000 10.0707 6.3875 4.3943 5.7511 7.1867];
  4. %x0=[ 3.0000 5.0000 0.3094 7.0000 0.0108 0.6798 0 0 3.6906 0 5.9892 10.3202 5.5369 4.9194 5.8291 7.2852];
  5. %x0=[3 5 4 7 1 0 0 0 0 0 5 11 5.6348 4.8687 7.2479 7.7499];
  6. A=[1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
  7. 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0];
  8. B=[20;20];
  9. Aeq=[1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
  10. 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
  11. 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
  12. 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
  13. 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
  14. 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0];
  15. beq=[3 5 4 7 6 11];
  16. vlb=[zeros(12,1);-inf;-inf;-inf;-inf];
  17. vub=[];
  18. [x,fval,exitflag]=fmincon('liaoch',x0,A,B,Aeq,beq,vlb,vub)

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

闽ICP备14008679号