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

本文详细介绍了非线性规划的概念,通过投资决策问题阐述了非线性规划的实例,并给出了其数学模型。同时,讲解了MATLAB中解决非线性规划问题的fmincon函数的使用方法。此外,还讨论了二次规划的特性,以及如何使用quadprog函数解决此类问题。最后,结合实际的水泥供应问题,展示了如何运用线性和非线性规划方法进行优化计算。
摘要由CSDN通过智能技术生成

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定义目标函数

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')

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.

解:编写如下程序

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

例4:

某公司有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坐标变成未知数,令x_{1}=X_{13} ,y_{1}=X_{14} ,x_{2}=X_{15} ,y_{2}=X_{16}

定义目标函数:

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)

  • 15
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值