最近在做通信网络相关的仿真,今天拿到了一些别人仿真的代码来学习,其中看到了一个double Lambda[T_Node_Number][M][Low_iteration];的参数,注释写着拉格朗日乘子式。本来对于这个名词感觉很陌生,后来查了一些资料,才回忆起这似乎是大一高数曾经学过的知识,经查书,果不其然,高数下P113页 条件极值拉格朗日法讲的就是这个内容。以前被忽视的知识点,再次重现,我觉得要好好学习一下。一下是学习笔记:
如何理解
先看一个二维的例子:假设有函数:f(x,y),要求其极值(最大值/最小值),且
c 为常数。对不同dn的值,不难想像出
的等高线。而方程g的等高线正好是g(x,y) = c。想像我们沿着g = c的等高线走;因为大部分情况下f和g的等高线不会重合,但在有解的情况下,这两条线会相交。想像此时我们移动g = c上的点,因为f是连续的方程,我们因此能走到更高或更低的等高线上,也就是说dn可以变大或变小。只有当g = c和相切,也就是说,此时,我们正同时沿着g = c和走。这种情况下,会出现极值或鞍点。
气象图中就很常出现这样的例子,当温度和气压两列等高线同时出现的时候,切点就意味着约束极值的存在。
用向量的形式来表达的话,我们说相切的性质在此意味着f和g的斜率在某点上平行。此时引入一个未知标量λ,并求解:
且λ ≠ 0.
一旦求出λ的值,将其套入下式,易求在无约束极值和极值所对应的点。
- =
新方程F(x,y)在达到极值时与f(x,y)相等,因为F(x,y)达到极值时g(x,y) − c总等于零。
方法
假设需要求极值的目标函数 (objective function) 为 f(x,y),约束条件为 φ(x,y)=M
设g(x,y)=M-φ(x,y)
定义一个新函数
F(x,y,λ)=f(x,y)+λg(x,y)
∂F/∂x=0
∂F/∂y=0
∂F/∂λ=0
求出x,y,λ的值,代入即可得到目标函数的极值
扩展为多个变量的式子为:
F(x1,x2,...λ)=f(x1,x2,...)+λg(x1,x2...)
则求极值点的方程为:
∂F/∂xi=0(xi即为x1、x2……等自变量)
∂F/∂λ=g(x1,x2...)=0
以上内容在《数学手册》当中有。另外,可以将这种把约束条件乘以λ(即不定乘子)后加到待求函数上的求极值方法推广到变分极值问题及其它极值问题当中,理论力学当中对非完整约束的处理方法就是利用变分法当中的拉格朗日乘子法。
很简单的例子
求此方程的最大值:
- f(x,y) = x2y
同时未知数满足
- x2 + y2 = 1
因为只有一个未知数的限制条件,我们只需要用一个乘数λ.
- g(x,y) = x2 + y2 − 1
- Φ(x,y,λ) = f(x,y) + λg(x,y) = x2y + λ(x2 + y2 − 1)
将所有Φ方程的偏微分设为零,得到一个方程组,最大值是以下方程组的解中的一个:
- 2xy + 2λx = 0
- x2 + 2λy = 0
- x2 + y2 − 1 = 0
另一个例子
所有概率的总和是1,因此我们得到的约束是g(p)= 1即
可以使用拉格朗日乘数找到最高熵(概率的函数)。对于所有的k 从1到n,要求
由此得到
计算出这n个等式的微分,我们得到:
这说明pi都相等 (因为它们都只是λ的函数). 解出约束∑k pk = 1,得到
因此,使用均匀分布可得到最大熵的值。
心得体会:经过这次学习,深切地体会到在学习知识时,一次学会是多么重要的一件事情。由于课程安排不合理和个人时间利用的问题,在大学期间的课程,有好多都学的一知半解,不够深入,不够扎实,大多都是为了应付考试,考前突击学成的,致使考试不考的内容根本不会,考试考了的内容考完以后很快也就淡忘了,时间久了根本连印象都没有。这样子学习是不行的,可是应该如何学习呢?是应该第一次学习就尽可能学好,还是更依赖于经过一段时间的温故知新呢。我不敢轻易相信已有的所谓学习,还需在实践中检验考证。
拉格朗日乘子法 那些年学过的高数