【数学建模方法笔记】非线性规划
非线性规划模型及求解
1.非线性规划模型概念
可以简单的认为,目标函数或约束条件中包含非线性函数,则就是非线性规划模型
如投资决策问题在不考虑是否存在风险时,目标函数可以写成
总收益/投资总额
注意,对于非线性规划中决策变量只能取0或1的问题,我们可以引入方程
x i ( 1 − x i ) = 0 , ( i = 1 , 2 , ⋯ , n ) x_i(1-x_i)=0,(i=1,2,\cdots,n) xi(1−xi)=0,(i=1,2,⋯,n)来表示
2.非线性规划模型
a.一般形式
非线性规划数学模型一般形式可以表示为
线性规划的最优解一定在可行域的的边界上,而非线性规划的最优解可能在可行域任意一点找到。
b.matlab的标准形式
用matlab求解前,应当把原式化成如下标准形式
A,b,Aeq,beq,lb,ub为相应位数的矩阵和向量;c(x),ceq(x)为非线性向量函数。
c.matlab求解
我们用函数 [x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 求解
在这里我们要注意:
fun要用M文件function去定义目标函数,主函数中引用它的时候要加上’ ‘符号
x0是迭代初值,我们直接用命令rand(m,n)生成随机数即可,一般生成m行1列的数字(与决策变量数相同)
nonlcon是多个向量值函数,也要用function定义,比如
function [f,g]=hanshu(x)
g=[ <非线性函数1> (打回车)
<非线性函数2> ];
h=[ <非线性函数3> (打回车)
<非线性函数4> ];
在主函数中引用的时候要加’ ‘号,如’hanshu’
options一般不写
我们以下题为例
编写M函数fun1.m定义目标函数
function f=fun1(x);
f=sum(x.^2)+8;
编写M函数fun2.m定义非线性约束条件
function [g,h]=fun2(x);
g=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20]; %非线性不等式约束
h=[-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3]; %非线性等式约束
编写主程序文件如下
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
解得当 x 1 = 0.5522 , x 2 = 1.2033 , x 3 = 0.9478 x1=0.5522,x2=1.2033,x3=0.9478 x1=0.5522,x2=1.2033,x3=0.9478时,最小值 y = 10.6511 y=10.6511 y=10.6511.
3.二次规划
a.数学模型
当目标函数是二次函数,约束条件全部是线性函数时,满足二次规划
其数学模型如下
注意, x T H x 是二次型,该二次型前面要 × 1 / 2 ,也就是 H 中每个元素要 × 2 x^THx是二次型,该二次型前面要×1/2,也就是H中每个元素要×2 xTHx是二次型,该二次型前面要×1/2,也就是H中每个元素要×2
b.matlab求解
我们用命令 [x,fval] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) 来求解
其中返回值x是决策向量x的值,返回值fval是目标函数在x 处的值
我们用下面例题来说明

4.无约束问题的Matlab解法
以 f ( x , y ) = x 3 − y 3 + 3 x 2 + 3 y 2 − 9 x f(x,y)=x^3-y^3+3x^2+3y^2-9x f(x,y)=x3−y3+3x2+3y2−9x为例
a.符号解
即求偏导利用Hessian方法判断,其程序如下:
clc,,clear
syms x y
f=x^3-y^3+3*x^2+3*x^2+3*y^2-9*x;
df=jacobian(f); %求一阶偏导
d2f=jacobian(df) %求hessian矩阵
[xx,yy]=solve(df); %求驻点
xx=double(xx);yy=double(yy); %化为数值型数据
for i=1:length(xx) %对每一个驻点进行判断
a=subs(d2f,{x,y},{xx(i),yy(i)});
b=eig(a); %求矩阵特征值
f=subs(f,{x,y},{xx(i),yy(i)});f=double(f);
if all(b>0)
fprintf('(%f,%f)是极小值点,对应的极小值为%f\n',xx(i),yy(i),f);
elseif all(b<0)
fprintf('(%f,%f)是极大值点,对应的极大值为%f\n',xx(i),yy(i),f);
elseif any(b>0)&any(b<0)
fprintf('(%f,%f)不是极值点\n',xx(i),yy(i));
else
fprintf('无法判断(%f,%f)是否是极值点\n',xx(i),yy(i));
end
end
b.数值解
Matlab求解无约束极小值的函数有fminunc和fminsearch
注
1.对于fminunc
给的信息越多,计算越快,精度越高。
2.fminsearch只能求给定的初值附近的一个极小值点
以 f ( x , y ) = x 3 − y 3 + 3 x 2 + 3 y 2 − 9 x f(x,y)=x^3-y^3+3x^2+3y^2-9x f(x,y)=x3−y3+3x2+3y2−9x为例,求极值
clc,clear
f=@(x)x(1)^3-x(2)^3+3*x(1)^2-9*x(1); %定义匿名函数
g=@(x)-f(x);
[xy1,z1]=fminunc(f,rand(2,1)); %极小值
[xy2,z2]=fminsearch(g,rand(2,1)); %极大值
xy2,z2=-z2
当然可以将一阶导、二阶导加进去来使求解更精确。
c.函数零点求解
1.多项式零点
xishu=[1,-1,2,-3];
x0=roots(xishu)
2.符号求解
syms x y
[x,y]=solve(x^2+y-6,y^2+x-6);
x=vpa(x,5); %化成小数格式数据
y=vpa(y,5);
5.约束极值问题
a.罚函数法
罚函数法分为内罚函数法和外罚函数法,对于约束条件中含有等式约束的只能采用外罚函数法,下面介绍外罚函数:
对于如下非线性约束问题
取充分大的数 M > 0 M>0 M>0,构造如下罚函数

求上面罚函数的无约束条件极值,即为待求结果。
应用举例
对于下面的非线性规划
构造罚函数后,可以笔算解决,也可以编写程序如下:
function g=test3_3_2(x)
%罚函数
M=50000;
f=x(1)^2+x(2)^2+8;
g=f-M*sum(min([x';zeros(1,2)]))-M*min(x(1^2)-x(2)^2+2)^2;
[x,y]=fminsearch('test3_3_2',rand(2,1))
该方法精度较低
b.其他matlab函数
1.fminbnd函数
应用举例
求 f ( x ) = ( x − 3 ) 2 − 1 , x ∈ [ 0 , 5 ] f(x)=(x-3)^2-1,x \in[0,5] f(x)=(x−3)2−1,x∈[0,5]的最小值
解法很简单,代码如下
function f=f3_3_31(x)
%编写目标函数
f=(x-3)^2-1;
end
在命令窗口输入
[x,y]=fminbnd('f3_3_31',0,5)
2.fseminf函数
其中,fun是目标函数,x0为 x x x的初始值,ntheta是半无穷约束 K i ( x , w i ) K_i(x,w_i) Ki(x,wi)的个数,函数seminfcon用于定义非线性不等式约束、非线性等式约束、
应用举例

代码如下
function f=f_3_12(x,s)
%定义目标函数
f=sum(x-0.5).^2;
end
function [c,ceq,k1,k2,s]=f3_12st(x,s)
%定义约束条件
c=[];ceq=[];
if isnan(s(1,1)) %判断s是否为非数
s=[0.2,0;0.2,0];
end
w1=1:s(1,1):100;
w2=1:s(1,1):100;
k1=sin(w1*x(1)).*cos(w1*x(2))-1/1000*(w1-50).^2-sin(w1*x(3))-x(3)-1;
k2=sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2-sin(w2*x(3))-x(3)-1;
plot(w1,k1,'-',w2,k2,'--');
%主程序
x0=[0.5;0.2;0.3]; %如果初值取的不合适,可能得不到最优解
[x,y]=fseminf(@f_3_12,x0,2,@f3_12st)
3.fminimax函数
应用举例

代码如下
function f=f3_13(x)
%定义目标函数
f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304
-x(1)^2-3*x(2)^2
x(1)+3*x(2)-18
-x(1)-x(2)
x(1)+x(2)-8];
[x,y]=fminimax(@f3_13,rand(2,1))

reference:《数学建模算法与应用》
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)