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

news2025/1/21 9:21:43

非线性规划概念和实例

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

非线性规划(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}-3xy f(x,y)=x3+y33xy,需要求解它的无约束极小化问题。

  1. 定义变量:使用syms定义代表问题中各个变量的符号变量。
syms x y;
  1. 定义目标函数:使用符号变量定义目标函数 f f f
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}-3xy f(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_s xs y s y_s ys,并利用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 n n 元目标函数 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 n n 元目标函数 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)]

求函数的零点和方程组的解

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

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

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

二次规划

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

二次规划(Quadratic Programming, QP)是线性规划(LP)的一种扩展,它增加了一个二次项。二次规划可以看做一种将线性问题与非凸二次函数联系在一起的技术。其基本形式如下:

min ⁡ x 1 2 x T P x + q T x s . t . G x ≤ h A x = b \min_{x} \frac{1}{2}x^T P x + q^T x \\ s.t. \quad G x \le h \\ A x = b xmin21xTPx+qTxs.t.GxhAx=b

其中, x ∈ R n x \in R^n xRn表示待求解的优化变量, P P P为一个 n × n n \times n n×n的矩阵, q q q h h h n n n维向量, G G G m × n m \times n m×n矩阵,其中 m m m为约束数量。这个问题的目标函数中含有一个二次项 x T P x x^TPx xTPx,同时满足一组约束条件。

如果 P P P是半正定矩阵,则上述优化问题被称为凸二次规划问题。凸二次规划问题具有通用可行性和求解算法,在数学和工程领域均有广泛应用。二次规划优化问题可以使用凸优化算法如内点法、信赖域法、牛顿法等进行求解。同时还有许多成熟的商业软件和开源库可以用于求解二次规划问题,如 Matlab、CVXPY 等。

需要注意的是,二次规划问题在求解时需要注意矩阵 P P P的正定性,因为它直接关系到问题是否有唯一解。如果 P P P是不定的,则可能存在无穷多个解,或着根本不存在解。如果 P P P是负定的,则目标函数会是无界的。因此,通常情况下我们需要通过约束条件来限制 x x x的取值范围,以便避免一些无意义解的出现。

总之,二次规划是处理带二次项的最优化问题的一种通用技术,在实际应用中有许多的使用和扩展,包括经济学、工程设计等领域。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9voLm6fd-1686226654220)(2023-06-08-19-41-08.png)]
Matlab是一个广泛使用的科学计算软件,它提供了求解二次规划问题的工具箱。在Matlab中,可以通过以下命令调用QP Solver 工具箱函数来求解一般形式的二次规划问题:

x = quadprog(H, f, A, b, Aeq, beq, lb, ub)

其中,Hf分别是二次项和线性项的系数,AbAeqbeq分别表示不等式约束矩阵、不等式边界、等式约束矩阵、等式边界,lbub分别是优化变量的下界和上界。除了输入参数,quadprog函数还输出了最优解向量 x

另外,在用Matlab求解二次规划问题时,可以给出一些优化选项来设置求解器的行为。例如,可以使用optimset()函数来指定迭代次数限制、稳定性要求等选项:

options = optimset('MaxIter', 1000);
x = quadprog(H, f, A, b, Aeq, beq, lb, ub, x0, options);

在以上示例中,创建了一个名为options的结构体,并设定了最大迭代次数为1000。然后将该结构体作为quadprog函数的附加参数之一传递,以实现高级优化控制。

总之,Matlab提供了易于使用的、高效的二次规划求解器,使得处理二次规划问题变得更加容易。除此之外,还有许多其他支持二次规划问题求解的开源工具和商业软件,例如CVX、Gurobi、MOSEK等,可以根据需要进行选用。

罚函数法

罚函数法(Penalty Method)是将优化问题的等式和不等式约束转化为目标函数中的一类人工惩罚项,以便使用优化算法求解无限制优化问题的方法。由于罚函数法将约束条件作为“代价”来加入优化目标,则在每一次迭代中都能考虑到约束条件,因此比较适合处理约束问题。

对于一个优化问题:

min ⁡ f ( x ) s . t . g i ( x ) ≤ 0 , i = 1 , ⋯   , m \min f(\boldsymbol{x}) \\ s.t. \quad g_i(\boldsymbol{x}) \le 0, i=1,\cdots,m minf(x)s.t.gi(x)0,i=1,,m

其中, f ( x ) f(\boldsymbol{x}) f(x)是需要最小化的目标函数, g i ( x ) g_i(\boldsymbol{x}) gi(x)是不等式约束条件, x \boldsymbol{x} x是待求解的优化变量。使用罚函数法表示为:

min ⁡ x [ f ( x ) + P ( x ) ] \min_{\boldsymbol{x}}\left[f(\boldsymbol{x})+P(\boldsymbol{x})\right] xmin[f(x)+P(x)]

其中, P ( x ) P({x}) P(x)是一个惩罚项。常见的罚函数可以分为外部罚函数和内部罚函数两类。

外部罚函数法,即将罚函数 P ( x ) P(\boldsymbol{x}) P(x)定义为满足约束的度量值,有时也被称为“扰动法”。例如,可以定义无穷大系数的单边二次罚函数:

P 1 ( x ) = C ∑ i = 1 m max ⁡ ( 0 , g i ( x ) ) 2 P_1(\boldsymbol{x}) = C\sum_{i=1}^{m}\max(0,g_i(\boldsymbol{x}))^2 P1(x)=Ci=1mmax(0,gi(x))2

其中, C C C是一个足够大的正常数,保证 P 1 ( x ) P_1(\boldsymbol{x}) P1(x) 只有在约束条件被破坏时才会起作用。同时,如果迭代过程中所得到的解越来越接近约束域,则罚函数项越来越小,从而让原问题越来越接近原问题。

内部罚函数法则将罚函数 P ( x ) P(\boldsymbol{x}) P(x)定义为目标函数与满足约束条件的距离和或者将满足约束条件的“惩罚项”直接加到目标函数中:

P 2 ( x ) = 1 μ ∑ i = 1 m log ⁡ ( − g i ( x ) ) P_2(\boldsymbol{x}) = \frac{1}{\mu}\sum_{i=1}^{m}\log(-g_i(\boldsymbol{x})) P2(x)=μ1i=1mlog(gi(x))

其中, μ > 0 \mu>0 μ>0是罚函数平衡系数。这种方法通常只考虑不等式约束,并且需要确保不等式约束避免取到零(从而导致 log ⁡ ( 0 ) \log(0) log(0)无穷大)。

实际上,罚函数法的可行性同样取决于选择合适的罚函数方法。一般而言,外部罚函数容易实现,但收敛速度较慢;内部罚函数精度较高但算法复杂性增加。因此,在使用罚函数法时要综合考虑优化问题本身以及可用内容。


以下是一个简单的例题,演示如何使用罚函数法求解二次规划问题:

将下面的二次规划问题

min ⁡ x 1 2 + x 2 2 s . t . x 1 + x 2 ≤ 1 ,   x 1 ≥ 0 ,   x 2 ≥ 0 \min x_1^2 +x_2^2 \\ s.t. \quad x_1 + x_2 \leq 1, \ x_1 \geq 0, \ x_2 \geq 0 minx12+x22s.t.x1+x21, x10, x20

转化为无约束问题,并使用罚函数法求解。

首先我们将不等式约束转化为惩罚项。考虑使用外部罚函数法,并定义罚函数为:

P ( x ) = C ∑ i = 1 m m a x ( 0 , g i ( x ) ) 2 P(x) = C \sum_{i=1}^{m} max(0,g_i(x))^2 P(x)=Ci=1mmax(0,gi(x))2

可以采用基本的一次或二次惩罚项,即:

P ( x ) = C ( max ⁡ ( 0 , x 1 + x 2 − 1 ) ) 2 + C ( max ⁡ ( 0 , − x 1 ) ) 2 + C ( max ⁡ ( 0 , − x 2 ) ) 2 P(x) = C(\max(0,x_1+x_2-1))^2+C(\max(0,-x_1))^2+C(\max(0,-x_2))^2 P(x)=C(max(0,x1+x21))2+C(max(0,x1))2+C(max(0,x2))2

其中, C C C 是足够大的正常数。这些惩罚项保证 P ( x ) > 0 P(x)>0 P(x)>0 当且仅当一个约束条件被违反时。

然后,将罚函数添加到原问题的目标函数中,得到新的无约束问题:

min ⁡ f ( x ) + P ( x ) \min f(x)+ P(x) minf(x)+P(x)

其中,

f ( x ) = x 1 2 + x 2 2 f(x) = x_1^2 + x_2^2 f(x)=x12+x22

接下来,我们可以使用任意优化器(如MATLAB)求解上述无限制最小二乘问题。

非线性规划笔记

https://blog.csdn.net/qq_44528283/article/details/117400926?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168613588216800192249430%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168613588216800192249430&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-117400926-null-null.142v88control_2,239v2insert_chatgpt&utm_term=%E9%9D%9E%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92&spm=1018.2226.3001.4187

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大咖驾到:XR云新未来|弹性算力赋能可交互、沉浸式商业实践

活动背景 XR市场作为数字化经济的重要发展方向,成为各大企业竞相布局的焦点。技术的进步和应用场景的扩大,为企业抢占XR市场先机、实现商业化带来了巨大机遇,同时也带来了技术挑战和成本压力。如何在竞争激烈的市场中脱颖而出,成…

【每日挠头算法题(3)】字符串解码|数组中重复的数字

每日挠头算法题 一、字符串解码思路:栈具体代码如下: 二、数组中重复的数字思路1:计数法具体代码如下: 思路2:原地交换法具体代码如下: 总结 一、字符串解码 点我直达~ 思路:栈 这道题怎么看都…

python 爬虫某东网商品信息 | 没想到销量最高的是

哈喽大家好,我是咸鱼 好久没更新 python 爬虫相关的文章了,今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息 网址链接:https://www.jd.com/ 完整源码在文章最后 元素定位 我们需要找到网页上元素的位置信息&#x…

Spring内容

(195条消息) 超高频面试题系列之----Spring全家桶(面试亲测)_spring全家桶面试题_zyyn_未来可期的博客-CSDN博客 1、推断构造方法: (1)如果只有一个构造方法,没问题就用这个 (2)如…

Java学习路线(26)——XML与设计模式

一、XML (一)XML的概念: XML是可扩展标记语言(Extensible Markup Language),一种数据表示形式,可以描述非常复杂的数据结构,常用于传输和存储数据。 (二)XM…

day50|动态规划11-买卖股票的最佳实际3-4(限制买卖次数的情况)

123.买卖股票的最佳时机III 确定递归函数,当前的每一个状态都由前一天决定。 以dp[i][1]和dp[i][2]为例讲解递归函数的含义: dp[i][1]max(dp[i-1][1],dp[i-1][0]-prices[i]) 含义: 第i天的股票第一天持有状态有两种,一种是前一…

电脑msvcr100.dll丢失的解决方法(一键修复方法)

msvcr100.dll是Microsoft Visual C运行时库的组成部分之一,它是一个重要的动态链接库(DLL)文件,可在Windows操作系统上运行。它包含了许多C/C语言程序库函数的实现,常常被用于支持和调用不同软件程序的运算&#xff0c…

POSTGRES、MYSQL插入数据的UPDATE_INSERT实践

POSTGRES: 1、创建表 create table tbl_user( id serial PRIMARY KEY, name varchar(256), addr varchar(256), age int, score int, fav varchar(256) ); 2、创建唯一约束 alter table tbl_user add constraint name_add_age_unique unique(name,addr,age); 3、首先插入两条数…

Ansible自定义静态资产以及常用模块

静态资产 文件文件,一个格式类似于INI的文件 默认情况下,Ansible的资产文件位于/etc/ansible/host,如果使用pip安装的则可能没有这文件,可以自己创建。 1、自定义资产 #自定义编写inventory.ini文件 1.1.1.1 2.2.2.2 3.3.3.[1:15]…

【C++】—— 模板介绍

前言: 在之前的学习中,我们已经对几个常见的STL库容器进行了详细的讲解,并且进行了模拟实现帮助大家立即。接下来,我们要介绍的就是关于 “模板” 的基本知识。 目录 前言 (一)非类型模板参数 1、基本介…

Splashtop 推出首款专门面向创作者和创意工作室的高性能远程软件

2023年5月3日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公的远程解决方案领域处于领先地位,公司今天宣布推出 Splashtop Business Access Performance,这是一款全新的远程访问解决方案,针对独立艺术家、游戏玩家、建筑与设计以及创意公司…

Opencv项目实战:基于dlib的疲劳检测

文章目录 一、项目简介二、算法原理三、环境配置3.1、dlib人脸检测器:dlib.get_frontal_face_detector()3.2、dlib关键点定位工具:shape_predictor_68_face_landmarks.dat 四、项目实战(加载视频)五、项目实战(摄像头获…

软件测试猿和bug的爱恨情仇

对程序猿来说改bug可以位列开发过程中最讨厌的事之首了,这么讲应该没有人会反对吧?因为就连Java之父詹姆斯高斯林也很讨厌Bug。 另一方面对于测试猿来说工作职责就是尽可能多地找出bug,并确保其得以解决。所以被程序猿视为眼中钉肉中刺的bug可…

Doris半结构化数据分析(倒排索引使用)快速入门

1. 背景 Apache Doris2.0 基于Apache Doris向量化MPP引擎,增加了倒排索引和半结构化JSON数据支持,更好地满足日志存储、检索、分析需求。与基于ES的日志存储方案相比,有如下优势: 性价比提升:存储成本降低50%以上&am…

‍☠️stm32Cubemx欠采样原理讲解与实现 采集高频信号

🏴‍☠️STM32Cubemx ADCTIMDMA欠采样采集高频信号 本文主要讲解ADC借助欠采样采集高频信号,比如使用100k左右的采样率去采集1M的信号。 所需工具: 开发板:STM32F103RCT6STM32CubeMXIDE: Keil-MDK 相关文章: STM32HAL ADCTIM…

2核4G轻量服务器阿里云和腾讯云区别对比

阿里云轻量应用服务器2核4G4M带宽297.98元12个月,腾讯云轻量2核4G5M服务器168元一年,628元3年,2核4G轻量应用服务器阿里云和腾讯云怎么选择?哪个性能比较好?阿腾云分享轻量应用服务器2核4G配置阿里云和腾讯云CPU、带宽…

打破互联网思维,我们该如何思考?

在会议上,你是否流程规范讲到一半突然卡逻辑、测分会议疯狂输出周围却一脸问号?提交缺陷时,你又是否被告知看不懂,要求补充信息?受挫时捶胸顿足“表达可太太太重要了,难道我天生脑子转的就比别人慢&#xf…

基于深度学习的高精度红外行人车辆检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度红外行人车辆检测识别系统可用于日常生活中或野外来检测与定位红外行人车辆目标,利用深度学习算法可实现图片、视频、摄像头等方式的红外行人车辆目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系…

围绕中国旅行商问题完成综合性实验报告 旅行商问题

题目:围绕中国旅行商问题完成综合性实验报告 旅行商问题(TSP问题)。 假设有一个旅行商人要拜访全国31个省会城市,它需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。…

【裸机驱动LED】使用C代码驱动LED(三)—— C代码编写篇

前面只使用了汇编代码来驱动LED,但是对于后续一些比较复杂的逻辑,使用汇编代码编写驱动的难度太大,因此,这次我们要使用C语言代码来驱动LED。 除了C代码外,依然需要编写汇编代码,在没有OS的情况下&#xf…