非线性规划的拉格朗日乘子法的手工数学推导,考虑有约束情况的python代码

一、拉格朗日乘子法和KKT的介绍

拉格朗日乘子法拉格朗日乘子λ代表当约束条件变动时,目标函数极值的变化。是一种经典的求解条件极值的解析方法,求函数f(x1,x2,…)在约束条件g(x1,x2,…)=0下的极值的方法。这种引进待定乘子,将有等式约束的寻优问题转化为无约束的寻优问题的做法,称为拉格朗日乘子法,又叫升维法。
  • 等式约束条件
    设目标函数为f(x),约束条件为hk(x),形如
    在这里插入图片描述
    s.t. 表示subject to ,“受限于”的意思,l表示有l个约束条件。
    定义拉格朗日函数F(x)
    在这里插入图片描述
    其中λk是各个约束条件的待定系数
    然后解变量的偏导方程:
    在这里插入图片描述
    如果有n个约束条件,就应该有n+1个方程;求出的方程组的解就是最优化值,将结果带回原方程验证就可得到解。
KKT条件KKT条件在约束条件下求解非线性规划问题很有用,是确定某点为最优点的一阶必要条件。
  • 标准约束优化问题
    在这里插入图片描述
    考虑g(x)≤0,此时最优解x∗ 或者在g(x)<0 的区域中,或者在边界g(x)=0 上
    定义拉格朗日函数
    在这里插入图片描述
    其中λ是对应h(x)=0的拉格朗日乘数,μ是对应g(x)⩽0的拉格朗日乘数,对应的KKT条件
    在这里插入图片描述
    当g(x)<0时,μ=0,原式中就不考虑g(x);当g(x)=0时,λ 可取任何大于等于0的值。

  • 例题:(我用下面这个例题来对这两种求解非线性规划的拉格朗日乘子法的手工数学推导,考虑有约束情况的python代码统一进行比较,我觉得这样效果更加的明确、直观和对各种方法的对比更有针对性!)
    在这里插入图片描述

二、手工数学推导

如图
在这里插入图片描述
综上所述,假设当 a = b = c = 1时
可以知道 Vmax=(8*根号3) / 9 = 1.5396007
x = y = z = 根号3 / 3 = 0.5773503

三、拉格朗日乘子法的有约束情况

在这里插入图片描述
代码如下:

from scipy.optimize import minimize
import numpy as np
e = 1e-10 # 非常接近0的值
fun = lambda x : 8 * (x[0] * x[1] * x[2]) # 约束函数f(x,y,z) =8 *x*y*z
cons = ({'type': 'eq', 'fun': lambda x: x[0]**2+ x[1]**2+ x[2]**2 - 1}, # x^2 + y^2 + z^2=1
        {'type': 'ineq', 'fun': lambda x: x[0] - e}, # x>=e,即 x > 0
        {'type': 'ineq', 'fun': lambda x: x[1] - e},
        {'type': 'ineq', 'fun': lambda x: x[2] - e}
       )
x0 = np.array((1.0, 1.0, 1.0)) # 设置初始值
res = minimize(fun, x0, method='SLSQP', constraints=cons)
print('最大值:',res.fun)
print('最优解:',res.x)
print('迭代终止是否成功:', res.success)
print('迭代终止原因:', res.message)

在 jupyter notebook 中运行
在这里插入图片描述
运行结果:
在这里插入图片描述

四、手工数学推导,考虑有约束情况的比较

综上所述,非线性规划的拉格朗日乘子法的手工数学推导,考虑有约束情况的结果都是一样的,都是假设当 a = b = c = 1时,可以知道 Vmax=(8*根号3) / 9 = 1.5396007;x = y = z = 根号3 / 3 = 0.5773503。但是我觉得作为一个学编程的学生,还是应该多练习用写代码的方式求解数学问题!

五、参考文献

1.KKT条件
2.利用SciPy求解非线性规划问题

我的用大M法的excel求解、python编程求解和python包分别求解线性规划中的单纯形法在另外的一篇博客里面。

加油!
在这里插入图片描述

人工智能中的优化问题通常可以通过线性规划和非线性规划来求解。线性规划是一种优化问题的数学建模方法,通过将目标函数和约束条件都表示为线性关系,求解可以使目标函数最大或最小的决策变量的取值。线性规划的一个经典求解方法是单纯形法。 单纯形法是一种逐步靠近最优解的迭代算法。它从任意可行解开始,通过交替寻找基变量和基变量,利用单纯形表格进行计算,在每一次迭代中使目标函数达到更优解。这种方法适用于线性规划问题,并且在数学理论上能够保证最优解的存在性。 大M法是单纯形法的一种改进方法,用于处理带有人工变量和松弛变量的问题。通过引入一个大的正数M,将目标函数中的人工变量转化为一个与目标函数无关的惩罚项,从而将问题转化为标准的线性规划问题。大M法可以解决含有无穷边界解或无可行解的线性规划问题。 非线性规划是指目标函数或约束条件中存在线性项的优化问题。对于非线性规划问题,可以使用拉格朗日乘子法进行求解。拉格朗日乘子法通过构建拉格朗日函数来将线性约束转化为等式约束,从而将非线性规划问题转化为无约束问题。通过求解拉格朗日函数的稳定点,可以得到原始非线性规划问题的解。 总而言之,线性规划是一种用于求解目标函数和约束条件都具有线性关系的优化问题的方法,单纯形法和大M法是线性规划的两种常用解法;非线性规划则用于处理目标函数或约束条件中存在线性项的优化问题,拉格朗日乘子法是一种求解非线性规划问题的常用方法。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值