拉格朗日求解最优问题——条件极值

一、问题描述

在这里插入图片描述

二、拉格朗日和KKT条件的最优化问题

  1. 等式约束的优化
    在这里插入图片描述
  2. 不等式约束的优化
    在这里插入图片描述

三、利用拉格朗日手工求解问题

说明:上述问题是等式约束

  1. 构造拉格朗日函数
    F ( x , λ ) = f ( x ) + ∑ j = 0 n λ j h j ​ ( x ) {F(x,\lambda)=f(x)+\displaystyle\sum_{j=0}^n\lambda_jh_j​(x)} F(x,λ)=f(x)+j=0nλjhj(x)
    其中,f ( x ) 为原来的目标函数,j表示第j个等式约束条件, λ j {\lambda_j} λj为对应的约束系数。
    构造的拉格朗日函数如下
    F ( x , y , z , λ ) = f ( x , y , z ) + ∑ j = 0 n λ j h j ​ ( x ) = 8 x y z + λ ( x 2 a 2 + y 2 b 2 + z 2 c 2 − 1 ) {F(x,y,z,\lambda)=f(x,y,z)+\displaystyle\sum_{j=0}^n\lambda_jh_j​(x)}=8xyz+\lambda(\frac{x_2}{a_2}+\frac{y_2}{b_2}+\frac{z_2}{c_2}-1) F(x,y,z,λ)=f(x,y,z)+j=0nλjhj(x)=8xyz+λ(a2x2+b2y2+c2z21)
  2. 解变量的偏导方程
    对每个变量进行求偏导,得到一个关于变量的方程组如下
    { ∂ F ( x , y , z , λ ) ∂ x = 8 y z + 2 λ x a 2 = 0 ∂ F ( x , y , z , λ ) ∂ y = 8 x z + 2 λ y b 2 = 0 ∂ F ( x , y , z , λ ) ∂ z = 8 x y + 2 λ z c 2 = 0 ∂ F ( x , y , z , λ ) ∂ λ = x 2 a 2 + y 2 b 2 + z 2 c 2 = 1 = 0 \begin{cases} \frac{\partial F(x,y,z,\lambda)}{\partial x}=8yz+\frac{2\lambda x}{a_2}=0\\ \frac{\partial F(x,y,z,\lambda)}{\partial y}=8xz+\frac{2\lambda y}{b_2}=0\\ \frac{\partial F(x,y,z,\lambda)}{\partial z}=8xy+\frac{2\lambda z}{c_2}=0\\ \frac{\partial F(x,y,z,\lambda)}{\partial \lambda}=\frac{x_2}{a_2}+\frac{y_2}{b_2}+\frac{z_2}{c_2}=1=0 \end{cases} xF(x,y,z,λ)=8yz+a22λx=0yF(x,y,z,λ)=8xz+b22λy=0zF(x,y,z,λ)=8xy+c22λz=0λF(x,y,z,λ)=a2x2+b2y2+c2z2=1=0
    求解得到的结果如下
    { x = 3 3 a y = 3 3 b z = 3 3 z \begin{cases} x=\frac{\sqrt{3}}{3}a\\ y=\frac{\sqrt{3}}{3}b\\ z=\frac{\sqrt{3}}{3}z \end{cases} x=33 ay=33 bz=33 z
  3. 带入目标函数
    V m a x = 8 x y z = 8 3 9 a b c {Vmax=8xyz=\frac{8\sqrt{3}}{9}abc} Vmax=8xyz=983 abc

四、利用拉格朗日编程求解问题

代码内容

# 导入包
from sympy import *
# 设置变量
x,y,z,k = symbols('x,y,z,k')
a,b,c=symbols('a,b,c')
f = 8*x*y*z
g = x**2/a**2+y**2/b**2+z**2/c**2-1
#构造拉格朗日函数
L=f+k*g
#求导
dx = diff(L, x)   # 对x求偏导
print("dx=",dx)
dy = diff(L,y)   #对y求偏导
print("dy=",dy)
dz = diff(L,z)   #对z求偏导
print("dz=",dz)
dk = diff(L,k)   #对k求偏导
print("dk=",dk)
dx= 8*y*z + 2*k*x/a**2
dy= 8*x*z + 2*k*y/b**2
dz= 8*x*y + 2*k*z/c**2
dk= -1 + z**2/c**2 + y**2/b**2 + x**2/a**2
#求出个变量解
m= solve([dx,dy,dz,dk],[x,y,z,k])   
print(m)
#变量赋值
x=sqrt(3)*a/3
y=sqrt(3)*b/3
z=sqrt(3)*c/3
k=-4*sqrt(3)*a*b*c/3
#计算方程的值
f = 8*x*y*z
print("方程的最大值为:",f)

通过diff函数求解的偏导结果
在这里插入图片描述
通过solve函数求解变量的结果(根据题目要求,可知变量的值应该为正数)
在这里插入图片描述
最终求解结果
在这里插入图片描述

五、总结

手工求解结果需要比较大的计算量,而且很有可能会出现计算错误的现象。python编程求解,就很快捷,不易出现错误。但是,python求解对理论理解方向就没有手工求解来的更加清晰具体。

参考链接

Python编程实现对拉格朗日和KKT条件求极值
最优化问题(二) 之 拉格朗日乘子法和KKT
拉格朗日乘子法和KKT条件求解最优化方法

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值