【数学建模】 非线性规划+二次规划(上)

本文涉及的产品
函数计算FC,每月15万CU 3个月
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 【数学建模】 非线性规划+二次规划(上)

非线性规划概念和实例

如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般说来,解非线性规划要比解线性规划问题困难得多。而且,也不象线性规划有单纯形法这一通用方法,非线性规划目前还没有适于各种问题的一般算法,各个方法都有自己特定的适用范围。

非线性规划(Nonlinear Programming, NLP)是指优化问题中目标函数或约束条件包含非线性项的情况。在非线性规划中,目标函数和/或约束条件可以包括幂函数、指数函数、对数函数、三角函数、分式函数等非线性项。

线性规划不同,非线性规划问题通常无法使用简单的线性代数来求解。相反,需要使用数值优化方法来寻找最优解。

由于目标函数和/或约束条件中的非线性项可能导致问题具有多个局部最优解,因此非线性规划面临的挑战在于如何找到全局最优解或近似最优解。这需要使用各种求解算法,如梯度下降法、牛顿法、拟牛顿法、遗传算法、模拟退火算法等。

非线性规划在现实生活中有着广泛的应用,如机器学习、图像处理、控制系统、生物医学、工程设计等领域。

非线性规划可以使用各种算法来求解,以下列举一些常用的方法:

  1. 梯度下降法(Gradient Descent Method):它是一种基于迭代逼近的优化算法,基于目标函数的梯度信息沿着相反的方向更新变量。这种方法适用于简单的连续可导凸函数。
  2. 牛顿法(Newton’s Method):在牛顿法中,以二阶导数为基础,将当前点近似为二次函数的极小点,然后移动到二次函数的极小点。需要计算目标函数的一、二阶偏导数,并需求解一个线性系统。该方法适用于具有光滑二阶导数的问题。
  3. 拟牛顿法(Quasi-Newton Methods):拟牛顿法是牛顿法的改进版本,主要目的是避免计算每个迭代点的二阶导数。它通过近似二阶导数来避免需要计算二阶导数,构造一个二阶Hessian矩阵的近似。
  4. 遗传算法(Genetic Algorithms):遗传算法不依赖于任何特定的问题特征,而是直接对目标函数进行执行优化。遗传算法模拟了自然选择和遗传机理,通过选择、交叉和变异操作迭代地改进候选解。
  5. 模拟退火算法(Simulated Annealing):模拟退火算法是一种基于物理学中固体冷却的过程。该方法将问题视为一个物理系统,通过逐渐降低系统温度来最小化目标函数。这允许算法跳出局部极小值并不断搜索新的解空间。
  6. 内点法(Interior Point Method):内点法使用迭代技术在搜索汽车的超平面上进行优化,并遵循一条指向求解器的策略。这种方法的重点是如何保持可行性。

这些方法在非线性规划中都有不同的优缺点,因此需要根据具体问题特点选择合适的算法。

一般方法:

  1. 决策变量
  2. 建立的函数
  3. 限制条件

非线性规划的matlab解法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hK7xxMml-1686226654207)(2023-06-07-19-21-07.png)]

其中 f (x)是标量函数, A, B, Aeq, Beq是相应维数的矩阵和向量,C(x),Ceq(x) 是非线性向量函数。

Matlab 中的命令是

X=FMINCON(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS

它的返回值是向量 x ,其中 FUN 是用 M 文件定义的函数 f (x);X0 是 x 的初始值;A,B,Aeq,Beq 定义了线性约束 A* X ≤ B, Aeq * X = Beq ,

如果没有线性约束,则A=[],B=[],Aeq=[],Beq=[];

LB 和 UB 是变量 x 的下界和上界,如果上界和下界没有约束,则 LB=[],UB=[],如果 x 无下界,则 LB 的各分量都为-inf,如果 x 无上界,则 UB的各分量都为 inf;NONLCON 是用 M 文件定义的非线性向量函数C(x),Ceq(x) ;OPTIONS定义了优化参数,可以使用 Matlab 缺省的参数设置。

如何来理解缺省参数:

Matlab提供了许多预定义的优化选项,可以满足大部分常见问题的需要。如果您不需要自定义优化选项,则可以使用Matlab默认设置,这样可以使代码更简洁易懂。例如,在使用fmincon函数进行非线性规划时,您可以选择Matlab缺省的优化参数,如下所示:

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

这将会使用Matlab默认的优化参数对函数进行优化,并且在求解过程中不会出现警告信息。当然,如果您希望使用自定义的优化参数,也可以根据具体任务进行调整。

在 Matlab 中进行非线性规划时,可以使用 optimoptions 函数来设置优化参数。具体的使用方式如下:

% 创建一个优化选项对象
options = optimoptions('fmincon');
% 设置优化参数
options.MaxIterations = 1000;  % 最大迭代次数
options.Display = 'iter';     % 显示迭代过程
options.TolCon = 1e-6;         % 约束容限
options.TolFun = 1e-6;         % 函数值容限
% 调用 fmincon 函数进行优化
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);

其中,options 对象包含了各种优化参数的设置,例如最大迭代次数、显示参数、容限等等。在这个例子中,我们设置了最大迭代次数为 1000 次,显示迭代过程,约束容限和函数值容限均为 1 0 − 6 10^{-6}106

需要注意的是,优化参数的设置需要根据具体问题进行调整。如果遇到不收敛、耗时过长等问题,可以考虑调整参数设置。

例2 求下列非线性规划

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DJf8zWO-1686226654208)(2023-06-07-19-33-26.png)]

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

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

(ii)编写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]; %非线性等式约束

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

options=optimset('largescale','off'); 
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[], ... 
'fun2', options) 

就可以求得当 x1 = 0.5522, x2 =1.2033, x3 = 0.9478 时,最小值 y =10.6511。

无约束极值问题的符号解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCrWA3Jv-1686226654208)(2023-06-08-19-22-23.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8AG4pj0-1686226654209)(2023-06-08-19-25-16.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPrezkTx-1686226654210)(2023-06-08-19-25-22.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ATfuy8v8-1686226654211)(2023-06-08-19-25-34.png)]

无约束极值问题的符号解可以使用数学软件或符号计算工具箱进行求解。下面我们提供一个示例来说明这个过程。

假设有一个目标函数 f ( x , y ) = x 3 + y 3 − 3 x y f(x,y) = x^{3}+y^{3}-3xyf(x,y)=x3+y33xy,需要求解它的无约束极小化问题。

  1. 定义变量:使用syms定义代表问题中各个变量的符号变量。
syms x y;
  1. 定义目标函数:使用符号变量定义目标函数f ff
f = x^3 + y^3 - 3*x*y;
  1. 求解梯度和海森矩阵:使用diff函数计算目标函数f的梯度和海森矩阵,并将结果存储到变量grad和hess中。
grad = [diff(f, x); diff(f, y)];
hess = [diff(grad, x), diff(grad, y); diff(grad, y), diff(grad, y)];
  1. 使用solve函数解方程组:使用solve函数解决梯度方程组grad=0,然后将解决得到的可行解存储到xs和fs向量中。
[xs, fs] = solve([grad == [0;0]], [x, y]);
  1. 计算目标函数在可行解处的值:使用subs函数将可行解xs和fs代入原始目标函数,从而获得函数在这些点上的值。
fsubs = subs(f, {x, y}, {xs(1), xs(2)});
  1. 判断优化结果:使用海森矩阵的特征值来判断外部点是否为最小值或者最大值。
eigval = eig(hess);
if(eigval(1)>0 && eigval(2)>0)
    fprintf('xs is a local minimum and the function value at it is %s \n', char(fsubs));
else
    fprintf('The Hessian matrix is not positive definite; no such extremum exists');
end

在本示例中,我们使用了Matlab的符号计算工具箱来解决f ( x , y ) = x 3 + y 3 − 3 x y f(x,y)=x^{3}+y^{3}-3xyf(x,y)=x3+y33xy的无约束极小化问题。针对任何一个无约束极值问题,你可以使用以上示例中的代码框架,在Matlab环境下进行符号计算求解。

无约束极小化问题的符号解可以使用Matlab中的符号计算工具箱进行求解。下面是一个示例代码:

syms x y
f = x^3 + y^2 - 4*x*y;
grad = [diff(f,x); diff(f,y)];
hess = [diff(grad, x) diff(grad, y); diff(grad, y) diff(grad, y)];
[xs, fs] = solve([grad ==[0;0]], [x y]);
fsubs = subs(f, {x,y}, {xs(1), xs(2)});
hsubsx = subs(hess(1,1), {x,y}, {xs(1), xs(2)});
hsubsy = subs(hess(2,2), {x,y}, {xs(1), xs(2)});
detval = det(hess);
if(detval>0 && hsubsx>0 && hsubsy>0)
    fprintf('xs is a local minimum and the function value at it is %s \n', char(fsubs));
else
    fprintf('The Hessian matrix is not positive definite; no such extremum exists');
end

上述代码中,syms定义了代表变量x和y的符号变量。 f定义了要进行极值计算的函数。 gradhess分别表示函数的一阶导数(梯度)和二阶导数(海森矩阵)。使用solve函数求解方程组给出的梯度方程式。代入求解得到的极值点 x s x_sxsy s y_sys,并利用subs函数来计算函数在这些点上的值。最后,通过测试海森矩阵是正定矩阵来判断求解是否成功。

如果你需要对其他无约束极值问题进行符号化的求解,可以按照下面的步骤进行:

  1. 定义变量:使用syms定义代表问题中各个变量的符号变量。
  2. 定义目标函数:使用符号变量定义目标函数f(x1, x2, …, xn),其中x1, x2, …, xn是问题中的各个自变量。
  3. 求解梯度和海森矩阵:使用diff函数计算目标函数f的梯度和海森矩阵,并将结果存储到变量grad和hess中。
  4. 使用solve函数解方程组:使用solve函数解决梯度方程组grad=0,然后将解决得到的可行解存储到xs和fs向量中。
  5. 计算目标函数在可行解处的值:使用subs函数将可行解xs和fs代入原始目标函数,从而获得函数在这些点上的值。
  6. 判断优化结果:使用海森矩阵的特征值来判断外部点是否为最小值或者最大值。

注意

使用符号计算工具箱的时候,需要避免输入不支持的操作以及可能导致数值错误的命令(例如除以零等),以保证符号计算的结果准确。

多元函数的求解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cP3y76uS-1686226654212)(2023-06-08-19-28-08.png)]

Matlab提供了一个非常便利的Optimization工具箱,其中包含了多种求解无约束最优化、约束最优化、曲线拟合等问题的函数和工具。下面我们介绍一下如何使用Matlab的Optimization工具箱来求解多元目标函数的极值。

假设有一个 n nn 元目标函数 f ( x ) = f ( x 1 , x 2 , … , x n ) f(\mathbf{x})=f(x_{1},x_{2},\dots,x_{n})f(x)=f(x1,x2,,xn),需要求解它的最小值(或最大值)。这里是一个基本的示例:

% 1. 定义变量:使用`syms`定义代表问题中各个变量的符号变量。
syms x y;
% 2. 定义目标函数:使用符号变量定义目标函数$f$。
f = x^3 + y^3 - 3*x*y;
% 3. 求解梯度和海森矩阵:使用`diff`函数计算目标函数f的梯度和海森矩阵,并将结果存储到变量grad和hess中。
grad = [diff(f, x); diff(f, y)];
hess = [diff(grad, x), diff(grad, y); diff(grad, y), diff(grad, y)];
% 4. 使用`solve`函数解方程组:使用`solve`函数解决梯度方程组grad=0,然后将解决得到的可行解存储到xs和fs向量中。
[xs, fs] = solve([grad == [0;0]], [x, y]);
% 5. 计算目标函数在可行解处的值:使用`subs`函数将可行解xs和fs代入原始目标函数,从而获得函数在这些点上的值。
fsubs = subs(f, {x, y}, {xs(1), xs(2)});
% 6. 判断优化结果:使用海森矩阵的特征值来判断外部点是否为最小值或者最大值。
eigval = eig(hess);
if(eigval(1)>0 && eigval(2)>0)
    fprintf('xs is a local minimum and the function value at it is %s \n', char(fsubs));
else
    fprintf('The Hessian matrix is not positive definite; no such extremum exists');
end

需要注意的是,Matlab中有多个不同的求解多元目标函数极值的函数,包括无约束优化函数(如fminunc),以及特定类型的约束优化函数(如fmincon,用于线性/非线性等式约束等)。你可以根据具体问题所面对的情况选择适当的求解方法。

Matlab提供了一个非常便利的Optimization工具箱,其中包含了多种求解无约束最优化、约束最优化、曲线拟合等问题的函数和工具。下面我们介绍一下如何使用Matlab的Optimization工具箱来求解多元目标函数的极值。

假设有一个 n nn 元目标函数 f ( x ) = f ( x 1 , x 2 , … , x n ) f(\mathbf{x})=f(x_{1},x_{2},\dots,x_{n})f(x)=f(x1,x2,,xn),需要求解它的最小值(或最大值)。这里是一个基本的示例:

% 1. 定义变量:使用`syms`定义代表问题中各个变量的符号变量。
syms x y;
% 2. 定义目标函数:使用符号变量定义目标函数$f$。
f = x^3 + y^3 - 3*x*y;
% 3. 求解梯度和海森矩阵:使用`diff`函数计算目标函数f的梯度和海森矩阵,并将结果存储到变量grad和hess中。
grad = [diff(f, x); diff(f, y)];
hess = [diff(grad, x), diff(grad, y); diff(grad, y), diff(grad, y)];
% 4. 使用`solve`函数解方程组:使用`solve`函数解决梯度方程组grad=0,然后将解决得到的可行解存储到xs和fs向量中。
[xs, fs] = solve([grad == [0;0]], [x, y]);
% 5. 计算目标函数在可行解处的值:使用`subs`函数将可行解xs和fs代入原始目标函数,从而获得函数在这些点上的值。
fsubs = subs(f, {x, y}, {xs(1), xs(2)});
% 6. 判断优化结果:使用海森矩阵的特征值来判断外部点是否为最小值或者最大值。
eigval = eig(hess);
if(eigval(1)>0 && eigval(2)>0)
    fprintf('xs is a local minimum and the function value at it is %s \n', char(fsubs));
else
    fprintf('The Hessian matrix is not positive definite; no such extremum exists');
end

需要注意的是,Matlab中有多个不同的求解多元目标函数极值的函数,包括无约束优化函数(如fminunc),以及特定类型的约束优化函数(如fmincon,用于线性/非线性等式约束等)。你可以根据具体问题所面对的情况选择适当的求解方法。

希望这能对你有所帮助!

非线性优化汇总——Matlab优化工具箱

Matlab 优化工具箱(Optimization Toolbox)是 Matlab 平台上的一个常用工具箱,用于解决各种优化问题,包括线性规划、非线性规划、整数规划、二次规划、多目标优化等。该工具箱提供了许多内置函数和算法来执行优化任务,并支持各种分析和调试工具。

以下是一些 Matlab 优化工具箱中常用的函数和算法:

  1. linprog():用于解决线性规划问题的内置函数,可快速计算最小值或最大值。
  2. fmincon():用于解决非线性约束或无约束的优化问题,可优化包括任意连续、寻找局部极小值的函数。
  3. intlinprog():用于解决混合整数线性规划问题,其中部分变量必须取整数值。
  4. quadprog():用于解决二次规划问题,即带有二次项的目标函数和线性约束。
  5. gamultiobj():用于解决多目标优化问题,其产生一系列帕累托前沿解。
  6. simulannealbnd():使用模拟退火技术搜索目标函数的全局最小值。
  7. geneticoptim(): 适用于基于遗传算法的单目标和多目标优化。

Matlab 优化工具箱还提供了许多其他有用的辅助函数,如绘图、输出、约束条件管理、算法调试和分析等。这些功能可以帮助用户更好地理解和调整问题,并验证算法的正确性和可靠性。

Matlab 优化工具箱可以用于各种实际应用,如生产调度、资源规划、物流优化、金融分析等。

以下是一些实际应用场景的示例:

  1. 生产调度:生产过程中需要考虑各种限制因素,如供需匹配、交通、库存、机器利用率等。使用 Matlab 优化工具箱来求解这些问题可以帮助用户制定更有效的计划,在最小化成本和最大化效益之间取得平衡。
  2. 资源规划:资源规划涉及到许多复杂的限制和约束条件,如设备容量、物流距离、人力成本等。使用 Matlab 优化工具箱进行资源规划可以帮助用户确定最佳方案并减少浪费和冗余。
  3. 物流优化:在物流领域,使用 Matlab 优化工具箱可以处理具有多个目标和复杂约束条件(如车辆路径)的问题。通过确定最优路线和方案,可以提高物流效率,减少运输时间和成本,并更好地服务客户。
  4. 金融分析:Matlab 优化工具箱也广泛用于金融分析领域,特别是在风险管理和资产组合优化等方面。使用该工具箱,用户可以优化组合的收益率和风险,并进行损失控制、期权估值、财务建模等任务。
    https://blog.csdn.net/weixin_44044161/article/details/123837706?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168614096516800213078305%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168614096516800213078305&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-123837706-null-null.142v88control_2,239v2insert_chatgpt&utm_term=matlab%E4%BC%98%E5%8C%96%E5%B7%A5%E5%85%B7%E7%AE%B1&spm=1018.2226.3001.4187

求函数的极小值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EGmsgDmA-1686226654212)(2023-06-08-19-33-11.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d1KDIW7S-1686226654213)(2023-06-08-19-33-30.png)]

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
7月前
【数值分析】Jacobi、Seidel和Sor迭代法求解线性方程组(附matlab代码)
【数值分析】Jacobi、Seidel和Sor迭代法求解线性方程组(附matlab代码)
P9853 [入门赛 #17] 方程求解
P9853 [入门赛 #17] 方程求解
|
算法
数学建模——曲线拟合
数学建模——曲线拟合
190 1
数学建模——微分方程介绍
数学建模——微分方程介绍
155 0
|
机器学习/深度学习 移动开发 算法
【数学建模】 非线性规划+二次规划(下)
【数学建模】 非线性规划+二次规划(下)
147 0
|
数据可视化 数据建模 算法框架/工具
【数学建模】常微分方程
【数学建模】常微分方程
211 0
|
机器学习/深度学习 决策智能
线性规划 (二) 单纯形法
线性规划 (二) 单纯形法
147 0
|
算法 算法框架/工具
数值分析算法 MATLAB 实践 常微分方程求解
数值分析算法 MATLAB 实践 常微分方程求解
142 0
|
算法
数值分析算法 MATLAB 实践 线性方程组迭代法
数值分析算法 MATLAB 实践 线性方程组迭代法
102 0
|
算法
数值分析算法 MATLAB 实践 线性方程组迭代法
数值分析算法 MATLAB 实践 线性方程组迭代法
119 0