什么是拉格朗日乘子法
按照维基百科的定义,拉格朗日乘数法是一种寻找多元函数在其变量受到一个或多个条件的约束时的极值的方法。用数学式子表达为:
拉格朗日乘子法的原理
一个约束条件
我们先从只有一个约束条件的情况入手,看看拉格朗日乘子法到底是怎么做的。
假设,我们的问题如下:
首先我们画出 f(x,y) 的图像,这个图像应该是 3 维的,但为了方便讲解,这里给出它的 2 维投影:
图中的红色圆表示 f(x,y) ,越靠近原点的部分,值越小(表示“谷底”),这些圆又称为「等高线」,因为同一个圆代表的函数值相同。
图中的蓝线代表 g(x,y) ,这里只取 g(x,y)=0 的部分。
整幅图像可以想象成一个巨大的山谷,原点是谷底,而我们的任务是在蓝线表示的道路上,找到最低的位置。
那要如何找到这个最低点呢?注意,图中用橙色和黑色标记了两个点。如果我们走到了橙色这个位置,那么很明显,可以发现这个点肯定不是最低的,因为我们可以沿着蓝线继续往内部的圆走,当我们走到黑色这个点时,会发现没法再往里面走了,而且,这个时候如果继续沿蓝线走,我们的位置反而升高了,这时,我们基本可以认为:我们找到了在蓝线这个限制条件下的最低点。
那么橙色这个点和黑色这个点有什么本质区别呢?拉格朗日观察到,黑点位置,蓝线和圆是相切的,而橙点位置显然不满足这个性质。那相切是否是必然的呢?拉格朗日告诉我们,是的,一定是相切的。而这一点,正是拉格朗日乘子法的核心。
梯度
在正式理解拉格朗日乘子法的原理之前,我们要回顾一下梯度的概念。
在数学里面,梯度指的是函数变化最快的方向。例如:在一元函数 f(x) 中,梯度只能沿 x 轴正方向或负方向,而在二元函数 f(x,y) 中,梯度则是一个二维向量 (∂f/∂x,∂f/∂y) 。
现在,我们要用到梯度一个重要的性质:梯度跟函数等高线是垂直的。
证明需要用到一点极限的知识。
梯度的数学定义为: ∇f=(∂f/∂x,∂f/∂y) 。假设 Δx , Δy 是两个极小的变化量,根据全微分的知识,可以得到:
拉格朗日乘子法的几何认识
现在,我们来感性地认识一下,为什么拉格朗日认为相切才能找到最低点(只是感性认识,不添加任何数学推导)。
在橙点这个位置,由于两条曲线不相切,所以橙线的梯度(上图橙色箭头)和蓝线的切线(蓝色虚线)肯定不垂直。在这种情况下,蓝线的两个切线方向,必定有一个往函数高处走(与梯度的夹角小于 90 度),有一个往函数低处走(与梯度的夹角大于 90 度)。所以,在两条曲线相交时,我们肯定不在最低点或最高点的位置。
那么,反过来想,如果两条曲线相切(上图),那么在切点这个位置,蓝线的切线和橙线的梯度是垂直的,这个时候,蓝线的切线方向都指向橙线的等高线方向。换句话说,在切点的位置沿蓝线移动很小的一步,都相当于在橙线的等高线上移动,这个时候,可以认为函数值已经趋于稳定了。所以,我们认为这个点的值“可能”是最低(高)的(之后解释为什么是“可能“。另外,个人觉得拉格朗日乘子法最好用反证法从不相切的点入手思考,从相切的点思考总有点别扭)。
既然相切可以帮助我们找到最低点,那么接下来我们要研究的便是如何利用相切来找出最低点。
相切,意味着在切点的位置,两条曲线的等高线方向是平行的,考虑到梯度与等高线垂直, 我们可以用两条曲线的梯度平行来求出切点位置(最低点)。
因此,根据梯度平行,我们能够得到一个方程组: ∇f=λ∇g ,其中 λ 表示一个标量,因为我们虽然能保证两个梯度平行,但不能保证它们的长度一样(或者方向相同)。在高维函数中, ∇f 表示的是函数在各个自变量方向的偏导。对于上面的例子,我们可以求出函数 f 和 g 的偏导,再根据方程组:
在实际求解时,人们会使用一个统一的拉格朗日函数: L(x,y,λ)=f(x,y)+λg(x,y) ,令这个函数偏导为 0,我们可以得到:
多个约束条件
多个约束条件和单个约束条件是一样的。如果是多个约束条件,那么这些约束函数肯定是相交的,否则无解。多个约束条件一般会把变量约束到一个更低维的空间,例如,下图中,紫色球面和黄色平面将变量约束到黑色线的位置。
求解过程和单个约束条件是一样的,我们定义一个新的拉格朗日函数:
总结
根据拉格朗日乘子法的定义,这是一种寻找极值的策略,换句话说,该方法并不能保证找到的一定是最低点或者最高点。事实上,它只是一种寻找极值点的过程,而且,拉格朗日乘子法找到的切点可能不只一个(也就是上面的方程组可能找到多个解),例如下图:
图中相切的点有两个,而红点的函数值明显比黑点小。事实上,要想判断找到的点是极低点还是极高点,我们需要将切点代入原函数再进行判断。
另外,在写作本文时,我仍然有一个疑惑没有解决:拉格朗日乘子法在哪些情况下无解(也就是上面的方程组 ∇L 无解)?换句话说,约束条件和函数没有切点时,我们要怎么求出最低点或最高点。这个问题留待之后想通再补上。