Python编程实现对拉格朗日和KKT条件求极值

  • 一、拉格朗日和KKT条件求极值概念
  • 二、手工推导计算
  • 三、Python编程实现
  • 四、总结

一、拉格朗日和KKT条件求极值概念

求解最优化问题中,拉格朗日乘子法和KKT条件是两种最常用的方法。在有等式约束时使用拉格朗日乘子法,在有不等式约束时使用KKT条件。这个最优化问题指某一函数在作用域上的全局最小值(最小值与最大值可以相互转换)。

最优化问题通常有三种情况(这里说两种):

无约束条件
求解办法是求导等于0得到极值点。将结果带回原函数验证。

等式约束条件
设目标函数f(x),约束条件hk(x),
min f(x)  s.t. hk(x)=0   (k = 1,2…l)
l表示有l个约束条件。
该类问题解决办法是消元法或拉格朗日法。消元法简单,这里讲拉格朗日法,后面提到的KKT条件是对拉格朗日乘子法的泛化。

例题:
椭球内接长方体的最大体积,即求 f(x,y,z) = 8xyz 的最大值。
方法1:消元法
根据条件消去z,然后带入函数转化为无条件极值问题。(有时这种方法麻烦,甚至解不出来)
方法2:拉格朗日乘法
思想:通过引入拉格朗日乘子将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。
首先定义拉格朗日函数F(x),f(x)为目标函数,h(x)为约束条件:
(λk是各个约束条件的待定系数)
对各个变量求偏导:

方程组的解就可能是最优化值,将结果带回原方程验证。
上面的函数,通过拉格朗日乘数法将问题转化为:

对 F(x,y,z,λ) 求偏导得到

联立前面3个方程得到 bx = ay 和 az = cx,带入第4个方程:

带入原函数得到最大体积:

为什么这么做是最优解?
举个例子:min f(x,y)  s.t.  g(x,y) = c
画出 z = f(x,y)的等高线

绿线是约束g(x,y) = c的轨迹。蓝线是f(x,y)的等高线。箭头表示斜率,和等高线的发现平行。从梯度的方向看,d1>d2(梯度下降法越接近目标,步长越小,前进越慢)。
在没有约束条件,f(x,y)的最小值是落在最里面等高线内部的某一点。加上约束条件的 f(x,y) 最小值是 f(x,y)的等高线和约束线相切的位置,因为如果只是相交意味着还存在其它的等高线在该等高线的内部或外部,使新的等高线与目标函数的交点值更大或更小,只有等高线与目标函数的曲线相切时,取到最优值。

从图看出,想让目标函数 f(x,y) 的等高线和约束 g(x,y) 相切,则他们切点的梯度在一条直线上( f 和 g 斜率平行)。
即在最优解的时候:∇f(x,y)=λ(∇g(x,y)-C) (∇为梯度算子,即:f(x)的梯度 = λ*g(x)的梯度,λ是非0常数)
即:▽[f(x,y)+λ(g(x,y)−c)]=0  (λ≠0)
那么拉格朗日函数: F(x,y)=f(x,y)+λ(g(x,y)−c) 在达到极值时与 f(x,y) 相等,因为 F(x,y) 达到极值时 g(x,y)-c 总等于0。
min(F(x,λ))取得极小值时其导数为0,即f(x)和h(x)的梯度共线。
简单的说,在F(x,λ)取最优解的时候,即F(x,λ)取极值的时候(导数为0,▽[f(x,y)+λ(g(x,y)−c)]=0)。f(x)与g(x)梯度共线,此时就是在条件约束g(x)下,f(x)的最优解。

不等式约束
设目标函数f(x),不等式约束为g(x),等式约束条件h(x)。此时的约束优化问题描述如下:
我们定义不等式约束下的拉格朗日函数L:

其中f(x)是目标函数,hj(x)是第j个等式约束条件,λj是对应的约束系数,gk(x)是第k个不等式约束,uk是对应的约束系数。
不等式约束常用的方法是KKT条件,同样的,把所有的不等式约束、等式约束和目标函数全部写为一个式子L(a, b, x)= f(x) + ag(x)+bh(x)
KKT条件是说最优值必须满足以下条件:
L(a, b, x)对x求导为零;
h(x) =0;
a*g(x) = 0;
求取这些等式之后就能得到候选最优值。其中第三个式子,因为g(x)<=0,如果要满足这个等式,必须a=0或者g(x)=0。

二、手工推导计算

例题:

推导解答:

三、Python编程实现

from sympy import *
x1,x2,k = symbols('x1,x2,k')
f = 60-10*x1-4*x2+(x1)**2+(x2)**2-x1*x2
g = x1+x2-8
#构造拉格朗日等式
L=f-k*g
#求导,构造KKT条件
dx1 = diff(L, x1)   # 对x1求偏导
print("dx1=",dx1)
dx2 = diff(L,x2)   #对x2求偏导
print("dx2=",dx2)
dk = diff(L,k)   #对k求偏导
print("dk=",dk)
dx1= -k + 2*x1 - x2 - 10
dx2= -k - x1 + 2*x2 - 4
dk= -x1 - x2 + 8
#求出个变量解
m= solve([dx1,dx2,dk],[x1,x2,k])
print(m)
{x1: 5, x2: 3, k: -3}
#给变量重新赋值
x1=m[x1]
x2=m[x2]
k=m[k]
#计算方程的值
f = 60-10*x1-4*x2+(x1)**2+(x2)**2-x1*x2
print("方程的极小值为:",f)

运行结果:

四、总结

通过上述可以发现,使用Python编程求得的结果和经过手工推导的结果是一致的,想要编程实现的话,就必须要自己首先手工推导一遍,掌握推导过程和计算方法,这样使用Python编程思路才会更加清晰有条理,手工推导编程还是比较麻烦的,但是还是要练习的。

参考文献:
https://www.cnblogs.com/keye/p/10916118.html
https://www.cnblogs.com/ty123/p/10529541.html

Python编程实现对拉格朗日和KKT条件求极值相关推荐

  1. Python编程思想(9):条件语句(if)

    <Python编程思想>总目录 上一篇:Python编程思想(8):使用字典 目录 1. if语句基础 2. 由于缩进错误引发的血案 3. if条件的类型 4. pass语句 if语句用于 ...

  2. python编程else是什么意思_python条件判断if/else - python基础入门(8)

    文章首发微信公众号,微信搜索:猿说python 生活中我们总是面临各种选择,选择不同,结果也不同,不管我们是否愿意,总会有结果,有的快乐,也有的痛苦-- 鲁迅说:人只要有钱,烦恼就会减掉90%以上,情 ...

  3. CSS、JavaScript、PHP和Python编程合二为一

    CSS, JavaScript,PHP And Python Programming All in One Course 在一门课程中学习Javascript.PHP和Python编程语言的CSS 你 ...

  4. 最优化之凸集、凸函数、上确界、Jensen不等式、共轭函数、Fenchel不等式、拉格朗日乘子法、KKT条件

    最优化之凸集.凸函数.上确界.Jensen不等式.共轭函数.Fenchel不等式.拉格朗日乘子法.KKT条件.拉格朗日对偶 1.直线的向量表达 1.1 共线定理 对于任意两个向量a⃗,b⃗\vec{a ...

  5. 判断kkt条件的例题_kkt条件例题求解

    ◎ Karush-Kuhn-Tucker条件, KKT条件/KKT点 ◎称 为对... 2 1 的KKT条件,求出最优解及其相应的Lagrange乘子. (b) (6分) 写出求解(a)中问题的任意两 ...

  6. python解包操作_Python编程使用*解包和itertools.product()求笛卡尔积的方法

    本文实例讲述了Python编程使用*解包和itertools.product()求笛卡尔积的方法.分享给大家供大家参考,具体如下: [问题] 目前有一字符串s = "['a', 'b'],[ ...

  7. 一文理解拉格朗日对偶和KKT条件

    一. 最优化问题求解 1. 等式约束的极值求法 $$ \begin{gather*} \underset{t}{min} f(t) \; s.t.\; h_i(t)=0,i=1,\cdots,p \e ...

  8. python重复元素判定编程_从零开始学Python编程四:条件判断与循环

    前面已经介绍了不少Python基础知识,大家不要觉得不耐烦,想要学好Python,做好Python开发,一定要打牢基础.大家也发现了,Python中很多基础知识和数学算法是一样的,比如今天要教给大家的 ...

  9. python编程的条件语句_Python 条件语句

    Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和 ...

  10. 从拉格朗日乘数法到KKT条件

    从拉格朗日乘数法到KKT条件 最近看论文遇到了Karush–Kuhn–Tucker (KKT)条件,想搞清楚这是个什么东东,因此就把这个东西认真学习一下并且分享出来,希望对大家有用.学习KKT就不得不 ...

最新文章

  1. 剑指offer:面试题28. 对称的二叉树
  2. 乌托邦畅想:众筹开源城市
  3. 十八、“问余浪子今何在,唯有回头铸梦人”(2021.5.28)
  4. r k-means 分类结果_机器学习-Kmeans均值聚类算法(贪心学院)
  5. 控制是否展示_现场展示板管理不在于看,而在于管!
  6. python中三级菜单讲解_Python字典实现简单的三级菜单(实例讲解)
  7. Spring Boot中@ConfigurationProperties与@PropertySource的基本使用(读取指定的properties文件)
  8. (ContrastiveCrop)Crafting Better Contrastive Views for Siamese Representation Learning
  9. Eclipse中好用的快捷键
  10. 输入输出系统的发展概况
  11. [C#/Java] C#中调用Servlet示例
  12. 信息资源管理——基础
  13. 天下足球十大感动台词
  14. 【聚沙成塔系列】之《UML九种图
  15. 怎么录制屏幕视频?3个简单实用方法分享
  16. 奔跑吧恐龙----基于JavaSwing的一个跑酷游戏
  17. Hadoop集群配置及运行
  18. 一名叫谙忆的程序员在2021年的具体安排《打工人的那些事》
  19. Scal(三)——类与对象
  20. 从零开始SpringCloud Alibaba实战(32)——spring-cloud-starter-oauth2认证授权服务

热门文章

  1. 所谓周末,就是在家好好做饭、好好睡觉、好好玩游戏
  2. 用户账户、共享和NTFS权限
  3. HibernateTemplate.save()与HibernateTemplate.update() 无法写入数据库的问题
  4. 4.软件架构设计:大型网站技术架构与业务架构融合之道 --- 操作系统
  5. 3. XML 树结构
  6. Linux命令整理 - 通用版
  7. Python+Selenium自动化学习笔记
  8. 写出规范化的高可读性的函数代码注释
  9. Python + selenium之组织unittest单元测试用例
  10. WebAssembly 介绍