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(1xi)=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)=x3y3+3x2+3y29x为例

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求解无约束极小值的函数有fminuncfminsearch

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)=x3y3+3x2+3y29x为例,求极值

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)=(x3)21,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:《数学建模算法与应用》

Logo

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

更多推荐