【笔记】拉格朗日乘数法

【笔记】拉格朗日乘数法

这是多元函数微积分领域的内容。

偏导数

在多元函数 \(f(x_1, x_2, \cdots, x_n)\) 中,选取某一个元 \(x_i\),当其它元固定,而 \(x_i\) 有一个增量 \(\Delta x_i\) 的时候,函数也有对应的增量 \(f(x_1, \cdots, x_i+\Delta x_i,\cdots, x_n)-f(x_1, \cdots,x_i,\cdots, x_n)\)。如果函数对应的增量比上 \(x_i\) 的增量的极限存在,则该极限为函数在点 \(x_1, x_2, \cdots, x_n\) 上对 \(x_i\) 的偏导数,记作 \(\frac{\partial}{\partial x_i}f(x_1, x_2, \cdots, x_n)\)

计算法则:求偏导数时,将其它自变量看作常数,只对需要求导的自变量进行求导。例如 \(f(x, y)=x^2y+3xy^2\)\(x\) 的偏导数 \(\frac{\partial}{\partial x}f(x, y)=2xy+3y^2\),对 \(y\) 的偏导数 \(\frac{\partial}{\partial y}f(x, y)=x^2+6xy\)

梯度

梯度是一个向量,在多元函数 \(z=f(x_1, x_2, \cdots, x_n)\) 中,\(\nabla f(x_1, x_2, \cdots, x_n)=(\frac{\partial z}{\partial x_1},\frac{\partial z}{\partial x_2}, \cdots, \frac{\partial z}{\partial x_n})\)

梯度的方向是函数在该点处变化最快的方向,也就是函数值增长最快的方向,而梯度的模(长度)则表示函数在该方向上的变化率(增长率)的大小。例如,在一个地形曲面函数中,梯度向量指向地势上升最快的方向,其模表示上升的速率。

想要求一个多元函数的极值点,只需要令这个函数的梯度为 \(\boldsymbol0\),列出方程组并求解,得到的点就有可能是极值点。

梯度下降法

为了求出一个多元函数的极值点,以极小值为例,先写成向量的形式 \(\boldsymbol x=(x_1, x_2, \cdots, x_n)\),然后多元函数 \(f(\boldsymbol x)\)。先选定一个初始值 \(\boldsymbol x_0\),然后迭代若干次,第 \(i+1\) 次迭代将 \(\boldsymbol x_{i+1}\) 设为 \(\boldsymbol x_i-\eta\nabla f(\boldsymbol x_i)\),其中 \(\eta\) 为学习率,是一个常数。

注意这和牛顿迭代法 \(x_{i+1}=x_i-\frac{f(x_i)}{f'(x_i)}\) 不一样。

拉格朗日乘数法

有一个 \(n\) 元函数 \(f(\boldsymbol x)\)\(m\) 条限制,第 \(i\) 条限制形如 \(g_i(\boldsymbol x)=0\)。求出在满足所有限制的前提下 \(f\) 的极值点。

拉格朗日乘数法指出可以添加拉格朗日乘数 \(\boldsymbol\lambda=(\lambda_1, \lambda_2, \cdots, \lambda_m)\) 并构造拉格朗日函数

\[L(\boldsymbol x, \boldsymbol\lambda)=f(\boldsymbol x)-\sum_{i=1}^m\boldsymbol\lambda_ig_i(\boldsymbol x) \]

这个函数没有额外的限制,它可能的极值点和 \(f\) 的一样。为了求解 \(f\) 的极值点,只需要解方程:

\[\begin{cases} \nabla_{\boldsymbol x}L(\boldsymbol x,\boldsymbol \lambda)=\boldsymbol0\\ \nabla_{\boldsymbol \lambda}L(\boldsymbol x,\boldsymbol \lambda)=\boldsymbol0\\ \end{cases} \]

例题

题目描述

\(n\) 个变量 \(f_i\)\(n\) 个非负系数 \(c_i\) 和非负常数 \(w\)。需要当 \(\sum_{i=1}^nf_i=w\) 时最小化 \(\sum_{i=1}^nc_if_i^2\)

wqs 二分做法

写一份 python 代码,计算 \(f\) 只取整数的最小值。可以发现随着 \(w\) 的增加,最小值也在增加,且最小值关于 \(w\) 的函数是凸函数,所以可以使用 wqs 二分,将问题转化为求 \(n\) 个二次函数的最小值。

拉格朗日乘数法

构造拉格朗日函数

\[L(x_1, \cdots, x_n, \lambda)=\sum_{i=1}^nc_if_i^2-\lambda\left(\sum_{i=1}^nf_i-w\right) \]

\(f_i\) 求偏导有

\[0=2c_if_i-\lambda \]

\(\lambda\) 求偏导有

\[0=\sum_{i=1}^nf_i-w \]

解这个方程只需要将 \(f_i=\lambda/2c_i\) 带入到 \(\sum_{i=1}^nf_i=w\) 中就能求出所有 \(f_i\)

QOJ8135 Minimum Cost Flow²

题目描述

这是一个奇怪的费用流问题,有一个 \(n\) 个点 \(m\) 条边的有向图,请给每条边确定流量 \(f_i\) 使得:

  1. \(1\) 号点的流出 \(-\) 流入 \(=1\)
  2. \(n\) 号点的流入 \(-\) 流出 \(=1\)
  3. 其它点的流入 \(=\) 流出。

然后最小化 \(\sum c_if_i^2\)。输出答案对 \(998244353\) 取模的结果。\(n\leq 100, m\leq 300\)

拉格朗日乘数法

限制函数共 \(n\) 条,第 \(i\) 条为

\[g_i(\boldsymbol f)=\sum_{E_j=(*,i)}f_j-\sum_{E_j=(i, *)}f_j-\begin{cases} -1,&i=1\\ +1,&i=n\\ 0,&1<i<n \end{cases} \]

需要最优化的函数为

\[h(\boldsymbol f)=\sum_{i=1}^mc_if_i^2 \]

构造拉格朗日函数,这里懒得敲 lambda 了就用 \(p\) 代替:

\[L(\boldsymbol f, \boldsymbol p)=h(\boldsymbol f)-\sum_{i=1}^np_ig_i(\boldsymbol f) \]

\(f_i\) 求偏导得到

\[0=\frac{\partial L}{\partial f_i}=2c_if_i-p_v+p_u \]

\(p_i\) 求偏导得到

\[0=\frac{\partial L}{\partial p_i}=g_i(\boldsymbol f) \]

高斯消元解决。

电路图(基尔霍夫定律)做法

事实上,我们可以从另一个角度得到这个方程,观察\(f_{i}^{2}×c_{i}\)这一让我们头痛的代价,你会发现它非常类似物理学电学中的一个式子:\(I^{2}R\),也就是一个电阻的热功率。我们可以将这张流量网络看成是一张电路图,每条边的流量就是电流,每条边的\(c_{i}\)就是电阻。

当我们将这张流量网络看成电路图时,它会自然趋向功率最小的状态,也就是我们所需要的状态。而对于一张电路图,它需要满足的就是基尔霍夫定律:

  • 对于任意一节点有流入电流等于流出电流。
  • 对于图中任意闭合回路(也就是环)所有元件两端的电势差(电压)的代数和为零。 也就是:\(\sum_{i}IR = \sum_{i}f_{i}c_{i}=0\)

借此我们就可以列出方程了,由于任意一个点都是汇点(除了超级源点),根据第一条定律可以得到所有流向点i的边的流量减所有从点i流出的边的流量为某个常数。据此可以列出 \(n\) 个方程。而图中共有\(m + k\)条边,会形成\(m - n+1\)个环,据此可以列出\(m - n+1\)个方程,因此共有\(m+1\)个方程,而我们需要解出的边流量恰好有$m $个未知数,怎么会多了一个方程呢,原来关于点的 \(n\) 个方程中 \(n\) 号点的限制可以由其它 \(n-1\) 个点的推出。因此直接高斯消元,即可解出答案。

posted @ 2025-03-13 09:38  caijianhong  阅读(208)  评论(0)    收藏  举报