赞
踩
如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。
例1:(投资决策问题)
某企业拥有n个项目可供选择投资,并且至少要对其中一个项目投资。已知该企业拥有总资金A元,投资于第i(i=1,....n)个项目需花费资金ai元,并预计可收益bi元,试选择最佳投资方案。
一般形式:
在一组等式或不等式的约束下,求一个函数的最大值(或最小值)问题,其中至少有一个非线性函数,这类问题称之为非线性规划问题。
matlab中非线性规划的数学模型写成以下形式:
其中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:求下列非线性规划
解:
(1)编写M文件fun1.m定义目标函数
- function f=fun1(x);
- f=sum(x.^2)+8;
(2)编写M文件fun2.m定义非线性约束条件
- function [g,h]=fun2(x);
- g=[-x(1)^2+x(2)-x(3)^2
- x(1)+x(2)^2+x(3)^2-20];
- h=[-x(1)-x(2)^2+2
- x(2)+2*x(3)^2-3];
(3)编写主程序文件example2.m如下:
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
若某非线性规划的目标函数为自变量x的二次函数,约束条件又全是线性的,就称这种规划为二次规划
matlab中二次规划的数学模型可表述如下:
这里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:求解二次规划
解:编写如下程序
- h=[4,-4;-4,8];%%二次型矩阵,平方项系数x2填对角,交叉项系数/2
- f=[-6;-3];
- a=[1,1;4,1];
- b=[3,9];
- [x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))
某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位:千米 )及水泥日用量d(吨)由下表给出。目前有两个临时料场位于A(5,1),B(2,7),日储量各有20吨。假设从料场到工地之间均有直线道路相连。 (1)试制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的吨千米数最小。 (2)为了进一步减少吨千米数,打算舍弃两个临时料场,改建两个新的,日储量各为20吨,问应建在何处,节省的吨千米数有多大?
程序:
- a = [1.25 8.75 0.5 5.75 4 7.25];
- b = [1.25 0.75 4.75 5 6.5 7.25];
- d =[3 5 4 7 6 11];
- x =[5 2];
- y =[1 7];
- e =[20 20];
-
- for i=1:6
- for j=1:2
- aa(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2);
- end
- end
- CC=[aa(:,1);aa(:,2)];
-
- 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];
- B=[20;20];
- Aeq=[1 0 0 0 0 0 1 0 0 0 0 0 %从第一\二料场运到工地一的料
- 0 1 0 0 0 0 0 1 0 0 0 0
- 0 0 1 0 0 0 0 0 1 0 0 0
- 0 0 0 1 0 0 0 0 0 1 0 0
- 0 0 0 0 1 0 0 0 0 0 1 0
- 0 0 0 0 0 1 0 0 0 0 0 1 ];
- beq=[d(1);d(2);d(3);d(4);d(5);d(6)];
- VLB=[0 0 0 0 0 0 0 0 0 0 0 0];
- VUB=[];
- x0=[1 2 3 0 1 0 0 1 0 1 0 1];%给一个初值,可以不给
- [xx,fval]=linprog(CC,A,B,Aeq,beq,VLB,VUB,x0)
改建两个新料场时,原本的A,B坐标变成未知数,令 , , ,
定义目标函数:
- function f=liaoch(x)
- a=[1.25 8.75 0.5 5.75 3 7.25];
- b=[1.25 0.75 4.75 5 6.5 7.25];
- d=[3 5 4 7 6 11];
- e=[20 20];
- f1=0;
- for i=1:6
- s(i)=sqrt((x(13)-a(i))^2+(x(14)-b(i))^2);
- f1=s(i)*x(i)+f1;
- end
- f2=0;
- for i=7:12
- s(i)=sqrt((x(15)-a(i-6))^2+(x(16)-b(i-6))^2);
- f2=s(i)*x(i)+f2;
- end
- f=f1+f2;
取初值为线性规划的计算结果及临时料场的坐标: x0=[3 5 0 7 0 1 0 0 4 0 6 10 5 1 2 7]';
编写主程序:
- clear
- x0=[3 5 0 7 0 1 0 0 4 0 6 10 5 1 2 7];
- %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];
- %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];
- %x0=[3 5 4 7 1 0 0 0 0 0 5 11 5.6348 4.8687 7.2479 7.7499];
- A=[1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0];
- B=[20;20];
- Aeq=[1 0 0 0 0 0 1 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 1 0 0 0 0 0 1 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 1 0 0 0 0 0 1 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0];
- beq=[3 5 4 7 6 11];
- vlb=[zeros(12,1);-inf;-inf;-inf;-inf];
- vub=[];
- [x,fval,exitflag]=fmincon('liaoch',x0,A,B,Aeq,beq,vlb,vub)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。