【笔记】拉格朗日乘数法
【笔记】拉格朗日乘数法
这是多元函数微积分领域的内容。
偏导数
在多元函数 \(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)\) 并构造拉格朗日函数
这个函数没有额外的限制,它可能的极值点和 \(f\) 的一样。为了求解 \(f\) 的极值点,只需要解方程:
例题
题目描述
有 \(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\) 个二次函数的最小值。
拉格朗日乘数法
构造拉格朗日函数
对 \(f_i\) 求偏导有
对 \(\lambda\) 求偏导有
解这个方程只需要将 \(f_i=\lambda/2c_i\) 带入到 \(\sum_{i=1}^nf_i=w\) 中就能求出所有 \(f_i\)。
QOJ8135 Minimum Cost Flow²
题目描述
这是一个奇怪的费用流问题,有一个 \(n\) 个点 \(m\) 条边的有向图,请给每条边确定流量 \(f_i\) 使得:
- \(1\) 号点的流出 \(-\) 流入 \(=1\)。
- \(n\) 号点的流入 \(-\) 流出 \(=1\)。
- 其它点的流入 \(=\) 流出。
然后最小化 \(\sum c_if_i^2\)。输出答案对 \(998244353\) 取模的结果。\(n\leq 100, m\leq 300\)。
拉格朗日乘数法
限制函数共 \(n\) 条,第 \(i\) 条为
需要最优化的函数为
构造拉格朗日函数,这里懒得敲 lambda 了就用 \(p\) 代替:
对 \(f_i\) 求偏导得到
对 \(p_i\) 求偏导得到
高斯消元解决。
电路图(基尔霍夫定律)做法
事实上,我们可以从另一个角度得到这个方程,观察\(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\) 个点的推出。因此直接高斯消元,即可解出答案。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18769315
浙公网安备 33010602011771号