本章目录

凸优化与 KKT 条件

约束力经过质量矩阵改变加速度。接触求解器还需要决定:哪些接触承载,哪些接触保持零力,各处的力应当有多大。一个非负变量上的抛物线已经包含了这项选择的基本结构。

本章从球与平面的法向接触出发,把导数推广为梯度,再由乘子建立 Karush–Kuhn–Tucker 最优性条件(KKT)和对偶下界。最后用两个相互耦合的接触完整演算活动集,并与 MuJoCo 的约束数组对应。

约定

球的姿态固定,仅质心平移,质量为 m=2\,\mathrm{kg}。平面到球的单位法线为 \boldsymbol n=(0,0,1)^{\mathsf T},法向力记作 f_n\geq0。一般优化变量用 x,接触力数组用 f,不等式乘子用 \alpha。本章的 R 表示正则矩阵。

01

单个法向接触

先只考虑一个能够推开物体的法向力。给定当前自由加速度,如果它已经让物体离开接触目标,就可以取零力;如果物体仍加速压向表面,则需要正的支撑力。下面把这个选择写成一个带非负边界的最小化问题。

式(12.3)已求出一条软双边行的响应。接触再要求力非负,负的无约束试算力便要改成零;这一条简单边界将引出后面的最优性条件。

设不含接触力时的加速度为 a_u,参考法向伪加速度为 a_{\rm ref}。定义零力残差 b=\boldsymbol n^{\mathsf T}a_u-a_{\rm ref}。对固定平面和平移球,法线保持不变,因此这一行的伪加速度也等于普通相对法向加速度。

a=a_u+\frac{f_n}{m}\boldsymbol n,\qquad j=\boldsymbol n^{\mathsf T}a-a_{\rm ref}=\frac{f_n}{m}+b.

软约束引入正则量 R\geq0。令 h=1/m+R>0,把正则化残差记作 w:

w=j+Rf_n=hf_n+b.

将这条线性关系作为代价对力的导数,就得到非负半轴上的二次问题:

\min_{f_n\geq0}\ \Phi(f_n)=\frac12hf_n^2+bf_n,\qquad \Phi^{\prime}(f_n)=w.
(13.1)

非负半轴上的极小点为 f_n^*=\max(0,-b/h)。零力残差为负时,增加正法向力可以降低目标;零力残差非负时,允许区间的起点已经最优。

推导由导数构造代价并求极小值f_n^*=\max(0,-b/h)
\begin{aligned}\Phi(f_n)-\Phi(0)&=\int_0^{f_n}(hs+b)\,\mathrm ds\\&=\frac12hf_n^2+bf_n.\end{aligned}

取 \Phi(0)=0。无约束驻点满足 hf_n+b=0,所以 f_n=-b/h。当 b<0 时驻点位于正半轴;当 b\geq0 时函数在非负半轴上单调不减,极小点位于端点。

f_n^*=\max(0,-b/h),\qquad w^*=hf_n^*+b.
\boxed{f_n^*\geq0,\qquad w^*\geq0,\qquad f_n^*w^*=0.}

这三个条件也可直接从允许的微小力变化得到。若 f_n>0,力可以增大也可以减小,所以最优点要求导数 w=0。若 f_n=0,允许变化只有 \Delta f_n\geq0;为使代价的一阶变化 w\Delta f_n 非负,必须有 w\geq0。

三式称为互补条件。正的接触力对应零正则化残差;正残差对应零接触力。两者同时为零时,接触位于两类状态的交界处。实际加速度偏差仍由 j=w-Rf_n 给出。

以 a_{\rm ref}=0、a_u=(0,0,-9.81)^{\mathsf T}\,\mathrm{m/s^2} 和 R=0.1\,\mathrm{kg^{-1}} 为例,h=0.6\,\mathrm{kg^{-1}}、b=-9.81\,\mathrm{m/s^2},故 f_n^*=16.35\,\mathrm N、w^*=0、j^*=-1.635\,\mathrm{m/s^2}。有限正则量允许参考加速度存在有限偏差。

一个接触何时承载,可以从抛物线最低点是否落在非负半轴看出。切换为导数图后,同一判断变成:允许区间内能否到达零导数,或者在零力边界处导数已经非负。

思考抛物线的无约束极小点落在负半轴时,法向力应取多少?

法向力只能取非负值。此时 b>0,在允许半轴上有 \Phi^{\prime}(f_n)=hf_n+b>0,目标从边界起增加。因此最优点位于零力边界,即 f_n^*=0。下图可以同时核对抛物线与导数的变化。

实验 01法向二次问题

改变正则量和零力残差,观察极小点何时进入允许半轴。纵轴可切换为导数。

曲线、导数与互补条件描述同一个选择。内部最优点允许力向两侧微调,所以导数为零;边界点只允许增大力,因此最优时的右导数非负。

\Phi 的单位为 \mathrm{kg\,m^2/s^4},由力乘加速度得到。它是选取约束力的优化代价;与机械能对应的焦耳单位各有用途。

单个法向接触只有一个斜率。多接触中,一个力的改变会影响多个残差,因此需要同时记录各方向的一阶变化和相互影响。梯度收集这些斜率,Hessian 记录斜率怎样随力向量改变;二次目标中,它们都能从矩阵直接读出。

02

梯度、Hessian 与凸性

单个力的代价是一条抛物线,最小点可以从斜率为零找到。多个力一起变化时,代价成为曲面:梯度描述当前位置的上升方向,Hessian 描述各方向的弯曲程度。这两个量将决定求解方向,也用于判断找到的驻点是否为全局最小值。

多个接触力组成列向量 f。对一般变量 x\in\mathbb R^n,梯度收集每个分量的一阶偏导,Hessian 矩阵(二阶导数矩阵)收集二阶偏导:

\nabla F=\begin{bmatrix}\partial F/\partial x_1\\\vdots\\\partial F/\partial x_n\end{bmatrix},\qquad (\nabla^2F)_{ij}=\frac{\partial^2F}{\partial x_i\partial x_j}.

梯度给出小位移上的一阶变化:F(x+\Delta x)=F(x)+\nabla F(x)^{\mathsf T}\Delta x+O(\|\Delta x\|^2)。对于对称矩阵 H 构成的二次函数,这个展开可以精确写到二阶:

F(x)=\frac12x^{\mathsf T}Hx+b^{\mathsf T}x+c,\quad \nabla F=Hx+b,\quad \nabla^2F=H.
(13.2)
推导二次函数的逐分量求导\nabla F=Hx+b
\begin{aligned}\frac{\partial}{\partial x_k}\left(\frac12\sum_{i,j}x_iH_{ij}x_j\right)&=\frac12\sum_jH_{kj}x_j+\frac12\sum_ix_iH_{ik}\\&=\sum_jH_{kj}x_j,\end{aligned}

最后一步使用 H_{ik}=H_{ki}。再对 x_\ell 求导得到 H_{k\ell};一次项的梯度为 b,常数项的梯度为零。

F(x+z)-F(x)=(Hx+b)^{\mathsf T}z+\frac12z^{\mathsf T}Hz.

凸集包含任意两点之间的整条线段。凸函数在每条线段上位于端点连弦之下。精确地说,对 0\leq\theta\leq1:

\theta x+(1-\theta)y\in\mathcal C,\qquad F(\theta x+(1-\theta)y)\leq\theta F(x)+(1-\theta)F(y).

沿任意方向切开二次曲面,得到一元二次函数。它的二阶导数为 z^{\mathsf T}Hz;所有方向的曲率非负,恰好保证整张曲面位于任意端点连弦下方。

推导方向曲率与二次函数的凸性H\succeq0\ \Longleftrightarrow\ F\text{ 为凸二次函数}

沿方向 z 定义 \varphi(t)=F(x+tz)。链式法则给出

\varphi^{\prime}(t)=\nabla F(x+tz)^{\mathsf T}z,\qquad \varphi^{\prime\prime}(t)=z^{\mathsf T}Hz.

若任意 z 都满足 z^{\mathsf T}Hz\geq0,称 H 半正定,记作 H\succeq0。直接展开连弦与函数值之差:

\theta F(x)+(1-\theta)F(y)-F(\theta x+(1-\theta)y)=\frac12\theta(1-\theta)(x-y)^{\mathsf T}H(x-y)\geq0.

若每个非零方向均有严格正曲率,则 H\succ0,二次函数严格凸。在凸可行域中,严格凸性保证最优点至多一个。二次正定目标还随 \|x\|\to\infty 趋于无穷,因此在非空闭可行域上能够取得极小值。

Hessian 的符号可以通过实际截线理解。下图使用 H=\operatorname{diag}(1,k):旋转截线方向时,绿色曲线的曲率是 z^{\mathsf T}Hz;铜色连弦检验凸函数的线段定义。

实验 02二次曲面的方向曲率

第二方向曲率从正值经过零再变为负值,依次产生碗形、平坦方向和鞍形。绿色截线与铜色端点连弦可以分别显示。

当 k<0 时,总能找到向下弯曲的方向;当 k=0 时存在平坦方向;当 k>0 时每个方向都向上弯曲。这个逐方向判断将用于确认接触目标有没有唯一极小点。

在凸可行域上的凸函数中,一个局部极小点已经达到全局最小值。原因是任意更低的可行点都会通过连接线段,在当前点附近也产生更低的函数值。

推导凸问题的局部极小点为何也是全局极小点F(x^*)\leq F(x)\quad(x\in\mathcal C)

设可行点 x 附近已经没有更小的目标值。若另有可行点 y 满足 F(y)<F(x),凸集中的点 x_t=(1-t)x+ty 对任意充分小的 t>0 都靠近 x。凸性却给出

F(x_t)\leq(1-t)F(x)+tF(y)<F(x).

这与局部极小的条件矛盾,因此该点已经达到全局最小值。

03

等式约束与乘子

取目标点 p=(2,1)^{\mathsf T},在直线 x_1+x_2=s 上寻找离它最近的点。距离平方的一半为

F(x)=\frac12\|x-p\|^2,\qquad h(x)=x_1+x_2-s=0.

直线上的允许微小位移满足 \nabla h^{\mathsf T}\Delta x=0。在最优点,目标沿正、反两个切向方向的导数都为零,因此目标梯度沿直线法向。用乘子 \beta 写成

\nabla F(x)+\beta\nabla h(x)=0,\qquad \mathcal L(x,\beta)=F(x)+\beta h(x).

等式乘子可取任意实数。其符号表示约束法向的哪一侧需要与目标梯度平衡。

在这条直线上,最优乘子为 \beta=(3-s)/2,最优点为 ((1+s)/2,(s-1)/2)^{\mathsf T}。当 s=1 时得到点 (1,0)^{\mathsf T},目标梯度与乘子项正好相反。

计算最近点和等式乘子的完整计算\beta=(3-s)/2
\begin{aligned}x_1-2+\beta&=0,\\x_2-1+\beta&=0,\\x_1+x_2&=s.\end{aligned}
\begin{aligned}x_1&=2-\beta,\qquad x_2=1-\beta,\\3-2\beta&=s,\qquad \beta=\frac{3-s}{2},\\x^*&=\begin{bmatrix}(1+s)/2\\(s-1)/2\end{bmatrix}.\end{aligned}

取 s=1,得到 \beta=1、x^*=(1,0)^{\mathsf T}。此时 \nabla F=(-1,-1)^{\mathsf T},乘子项为 (1,1)^{\mathsf T},相加为零。

约束乘子把边界施加的限制写成梯度平衡。下图先用直线等式观察两支相反的梯度箭头,再改为半空间:目标点进入可行内部时,可以直接到达它,乘子随之降为零。

实验 03边界上的梯度平衡

切换为半空间后,目标点进入内部时乘子变为零。箭头长度以同一比例缩放。

同一边界在等式模型中必须始终满足,在不等式模型中则允许进入内部。两种情况的差别由乘子的符号和互补条件表达,下一节将把它推广到多条边界。

04

不等式约束与 KKT 条件

把直线改为半空间 g(x)=x_1+x_2-s\leq0。其梯度指向可行域外侧。最优点位于边界时,目标梯度的反方向正好被边界挡住,于是

\mathcal L=F+\alpha g,\qquad \nabla F+\alpha\nabla g=0,\qquad \alpha\geq0.

乘子的非负号可以用可行方向核对。边界上的 \nabla g 指向外侧,因此 d=-\nabla g 指向内部。若 \nabla F=-\alpha\nabla g,沿该方向的变化为 \nabla F^{\mathsf T}d=\alpha\|\nabla g\|^2。边界最优点要求这项非负,故 \alpha\geq0。

例如上节取 s=1 时,边界点 (1,0) 的负梯度指向被约束挡住的外侧。增大到 s=4 后,目标点 (2,1) 已位于允许内部,距离目标可以降为零,乘子也取零。

若最优点位于内部,附近各方向都可移动,必须有 \nabla F=0,并可取 \alpha=0。边界与内部统一为互补松弛 \alpha g(x)=0。本例的乘子为 \alpha^*=\max(0,(3-s)/2)。

对于多条不等式 g_i(x)\leq0 和仿射等式 h_j(x)=0,Lagrange 函数与四组 KKT 条件为

\mathcal L(x,\alpha,\beta)=F(x)+\sum_i\alpha_i g_i(x)+\sum_j\beta_jh_j(x),
\boxed{\begin{aligned}g_i(x^*)&\leq0,\quad h_j(x^*)=0&&\text{原始可行},\\\alpha_i^*&\geq0&&\text{对偶可行},\\\alpha_i^*g_i(x^*)&=0&&\text{互补松弛},\\\nabla_x\mathcal L(x^*,\alpha^*,\beta^*)&=0&&\text{驻点}.\end{aligned}}
(13.3)

等号成立的不等式叫作活跃约束。活跃约束的乘子可以为零;互补关系允许这种边界交会状态。

若目标和不等式约束可微且凸、等式约束仿射,一组满足 KKT 的点与乘子足以证明全局最优。证明把原始目标夹在同一个 Lagrange 函数的两侧,依次使用驻点、互补和可行性。

推导凸问题中 KKT 条件足以保证最优F(x^*)\leq F(x)\quad(x\text{ 可行})

假定 F 与各 g_i 可微且凸,h_j 仿射。固定一组满足 KKT 的乘子后,\mathcal L 关于 x 凸;驻点条件使 x^* 成为它的全局极小点。对任意可行 x:

F(x^*)=\mathcal L(x^*,\alpha^*,\beta^*)\leq\mathcal L(x,\alpha^*,\beta^*)\leq F(x).

第一个等号来自互补松弛和等式可行性,最后一个不等号来自非负乘子与非正约束函数。

要从一个最优点推出乘子的存在,还需约束资格条件。一个常用的充分条件是 Slater 条件:在目标和约束的共同定义域相对内部,存在满足仿射等式、并严格满足各凸不等式的点。结合有限且可达的原始最优值,它保证强对偶及最优乘子的存在。因此在这些条件下,KKT 同时给出必要条件与充分条件。

法向力的可行条件可写成 -f_i\leq0。在这一符号约定下,不等式乘子恰好等于正则化残差 w_i,四组一般 KKT 条件便收敛为接触的三组互补条件。

推导法向接触的 KKT 化简f\geq0,\quad w\geq0,\quad f_iw_i=0

在力空间中令 g_i(f)=-f_i,于是

\mathcal L(f,\alpha)=\frac12f^{\mathsf T}Hf+b^{\mathsf T}f-\alpha^{\mathsf T}f,\qquad Hf+b-\alpha=0.

记 w=Hf+b,驻点条件给出 \alpha=w。其余条件依次变为

f\geq0,\qquad w\geq0,\qquad f_iw_i=0.

KKT 能检查一个候选点是否达到最优。计算尚未结束时,还可以分别构造最优值的上界和下界:可行力产生上界,乘子产生下界。二者的差保留了“还有多少改进余地”的定量信息。

05

对偶下界与最优性证书

一个候选解给出了已经达到的代价,还需要判断是否可能存在更好的解。如果另一个计算能够给出所有可行解代价的下界,那么候选值与下界之间的差距,就能衡量剩余的优化空间。对偶函数用约束乘子构造这个下界。

固定 \alpha\geq0 和任意 \beta,让原始变量遍历整个定义域,得到对偶函数

\mathcal D(\alpha,\beta)=\inf_x\mathcal L(x,\alpha,\beta).
(13.4)

对于每个原始可行点,非负乘子乘上非正约束值,得到一个非正修正。因此

\mathcal D(\alpha,\beta)\leq\mathcal L(x,\alpha,\beta)\leq F(x).

右侧给出可行方案的代价,左侧给出任何方案都无法低于的下界。对偶问题在允许乘子中最大化该下界。即使原问题存在非凸部分,这条弱对偶不等式仍成立。强对偶表示最佳下界与原始最优值相等;上一节的凸性和 Slater 条件提供了一个常用保证。

对正定二次目标,固定非负乘子后可通过配方消去力。得到的对偶函数只含乘子;任意原始可行力与任意非负乘子都给出一个可计算的上下界差。差值为零即可同时确认两者最优。

推导非负二次问题的显式对偶函数\mathcal D(\alpha)=-\tfrac12(b-\alpha)^{\mathsf T}H^{-1}(b-\alpha)

令 c=b-\alpha。当 H\succ0 时,固定乘子的 Lagrange 函数可以配方:

\begin{aligned}\mathcal L(f,\alpha)&=\frac12f^{\mathsf T}Hf+c^{\mathsf T}f\\&=\frac12(f+H^{-1}c)^{\mathsf T}H(f+H^{-1}c)-\frac12c^{\mathsf T}H^{-1}c.\end{aligned}

第一个二次项在 f=-H^{-1}c 时为零。故

\boxed{\mathcal D(\alpha)=-\frac12(b-\alpha)^{\mathsf T}H^{-1}(b-\alpha),\qquad\alpha\geq0.}

对任意 f\geq0 和 \alpha\geq0,两侧差为

\Phi(f)-\mathcal D(\alpha)=\frac12\|f+H^{-1}(b-\alpha)\|_H^2+\alpha^{\mathsf T}f\geq0,\qquad \|z\|_H^2=z^{\mathsf T}Hz.

第一项检验驻点偏差,第二项检验互补。差值为零时,两项同时为零,原始点和对偶乘子共同提供最优性证书。

下图先取 h=1、b=-1、\alpha=0,对偶下界为 -1/2。原始力取 f=0 时,目标为零,间隙为 1/2;移到 f=1 时,目标也降到 -1/2,间隙归零。分别改变力与乘子,就能比较上界和下界怎样接近。

实验 04原始值与对偶下界

本图取 h=1。分别移动原始可行点和对偶乘子,观察二者何时在最优值处相遇。

在这个例子中,即使原始力已经到达最优值,任取一个较差的乘子仍会留下正的间隙。要让上下界相等,原始力与乘子需要同时满足驻点和互补关系;下面将这组条件用于多个接触。

单变量中 \mathcal D(\alpha)=-(b-\alpha)^2/(2h)。若 b<0,最优乘子为零,f_n^*=-b/h;若 b\geq0,最优乘子为 b,f_n^*=0。两种情况的对偶间隙都为零。

回到物理系统,前面抽象的二次矩阵有明确来源。第十一章的 A 描述行力通过刚体和关节产生的加速度,十二章的 R 描述软约束容许的目标偏差。将两者相加,就得到本章用于求力的曲率矩阵 H。

06

多接触的力空间二次问题

设 M\succ0 为质量矩阵,J 按约束行排列,a_u 为自由广义加速度。接触力经 J^{\mathsf T} 回传后得到

约束响应矩阵的物理来源见式(11.6),正则力律见式(12.2)。本节将它们合成为同一个力空间目标,并继续保留每行非负的接触条件。

a=a_u+M^{-1}J^{\mathsf T}f,\qquad j=Ja-a_{\rm ref}.

将力引起的广义加速度先投影,再减去目标,得到 j=Af+b。这里的三个系数分别为

A=JM^{-1}J^{\mathsf T},\qquad b=Ja_u-a_{\rm ref},\qquad H=A+R.
(13.5)

A 给出惯性响应,b 给出零力时的目标偏差,R 给出软约束正则量。加上正则项后,残差为 w=Hf+b,恰好是以下二次目标的梯度:

\Phi(f)=\tfrac12f^{\mathsf T}Hf+b^{\mathsf T}f,\qquad\nabla\Phi=w.
(13.6)
推导约束空间逆惯量与正则残差w=(A+R)f+b
\begin{aligned}j&=J(a_u+M^{-1}J^{\mathsf T}f)-a_{\rm ref}\\&=JM^{-1}J^{\mathsf T}f+(Ja_u-a_{\rm ref}).\end{aligned}
A=JM^{-1}J^{\mathsf T},\qquad b=Ja_u-a_{\rm ref},\qquad H=A+R,\qquad w=j+Rf=Hf+b.

对称性使残差成为二次函数的梯度:

\Phi(f)=\frac12f^{\mathsf T}(A+R)f+b^{\mathsf T}f,\qquad\nabla\Phi=w.

前两章的伪加速度约定在此继续使用:参考项与 Ja 采用相同的约束行定义。若要把它换成某个几何间隙的普通二阶时间导数,还应按该间隙的定义加入曲率项。

当每条行的正则量均为正时,H=A+R 正定,即使几何约束存在冗余也有唯一最优力。约束行独立时,硬约束极限仍保证力的唯一性;存在冗余时,还需结合允许力域与零力残差判断。

推导正则化保证严格凸性H=A+R\succ0
z^{\mathsf T}Az=(J^{\mathsf T}z)^{\mathsf T}M^{-1}(J^{\mathsf T}z)\geq0.

因此 A\succeq0。重复或线性相关约束可使 A 奇异。若每条约束的正则量均为正,R\succ0,则对每个 z\ne0:

z^{\mathsf T}Hz=z^{\mathsf T}Az+z^{\mathsf T}Rz>0.

于是 H\succ0,非负二次问题具有唯一最优力。若取硬约束极限 R=0,独立约束仍可给出正定 A;存在冗余时,力的分配可能有多个解。

所有变量均为法向力时,可行域是非负正交象限 f\geq0。取各分量均为正的向量即可严格满足这些线性不等式,因而本章的正定问题具备 KKT 和强对偶所需条件。下一章将把可行域替换成摩擦锥。

用加速度表示同一个软接触问题

求解还可以从物体加速度出发。对一个候选 a,先计算第 i 行低于参考值的程度 j_i=J_i a-a_{{\rm ref},i},再按式(12.2)的软关系得到 f_i=\max(0,-j_i/R_i)。所有法向行的代价加到第七章的惯性代价上,构成

F(a)=\frac12(a-a_u)^{\mathsf T}M(a-a_u)+\sum_i\frac{\min(0,J_i a-a_{{\rm ref},i})^2}{2R_i},\qquad R_i>0.
(13.7)

第一项是式(7.4)的质量度量,第二项让低于参考值的接触加速度付出代价。这称为以加速度为变量的原始问题。式(13.6)则以接触力为变量,消去了广义加速度,称为力空间对偶问题。两者的极小点通过物体动力学一一对应;第十五章的 PGS 使用后者,CG 与 Newton 使用前者。

推导加速度目标与力空间互补条件式(13.7)与式(13.6)的对应

先对标量 j 求导。j<0 时,\min(0,j)^2/(2R) 的导数为 j/R;j\geq0 时导数为零。在零点,两侧一阶导数接续为零。因此导数可统一写作 -f,其中 f=\max(0,-j/R)。链式法则给出

\nabla F(a)=M(a-a_u)-J^{\mathsf T}f.

极小点的梯度为零,故 a=a_u+M^{-1}J^{\mathsf T}f,与式(11.6)一致。由逐行力律再分情况:

\begin{array}{c|c|c}j_i<0&f_i=-j_i/R_i>0&j_i+R_if_i=0\\j_i\geq0&f_i=0&j_i+R_if_i\geq0\end{array}

于是 f\geq0,w=j+Rf\geq0,f_iw_i=0。再把动力学代入 j=Ja-a_{\rm ref},恰好得到 w=(A+R)f+b,即力空间问题的 KKT 条件。反过来,从这组 KKT 条件定义 a=a_u+M^{-1}J^{\mathsf T}f,逐行可恢复相同软力律,且 \nabla F=0。

标量接触代价的斜率随 j 单调不减,因此各行代价凸;M\succ0 的惯性项又保证严格凸。原始驻点是唯一极小点,以上两向验证完成了两个问题的对应。

原始问题与对偶问题的名称取决于所选起点。第五节从力的非负二次问题出发,使用边界乘子构造下界;这里从加速度目标出发,接触力本身成为对偶变量。两组关系可以分别通过各自的拉格朗日函数核对。

推导从加速度目标消去物体加速度\min_a F(a)=-\min_{f\geq0}\Phi(f)

对每一行配方或直接求导,可得下面的标量恒等式。最大值处 f=\max(0,-j/R),代入两种分支即可核对左右两侧:

\frac{\min(0,j)^2}{2R}=\max_{f\geq0}\left(-jf-\frac12Rf^2\right).

于是原始目标等于对非负力最大化下面的函数:

\mathcal L(a,f)=\frac12(a-a_u)^{\mathsf T}M(a-a_u)-f^{\mathsf T}(Ja-a_{\rm ref})-\frac12f^{\mathsf T}Rf.

固定 f,对 a 求导并令其为零,得到 a=a_u+M^{-1}J^{\mathsf T}f。令增量 \Delta a=M^{-1}J^{\mathsf T}f,逐项代入:

\begin{aligned}\min_a\mathcal L(a,f)&=\frac12f^{\mathsf T}Af-f^{\mathsf T}Ja_u-f^{\mathsf T}Af+f^{\mathsf T}a_{\rm ref}-\frac12f^{\mathsf T}Rf\\&=-\frac12f^{\mathsf T}(A+R)f-(Ja_u-a_{\rm ref})^{\mathsf T}f\\&=-\Phi(f).\end{aligned}

固定任一可行 f 时,这个极小值给出原始最小值的下界;最大化下界就等于最小化 \Phi。前一推导已构造同时满足物体动力学和局部软力律的 (a^*,f^*):前者使它对 a 极小,后者使它对 f 极大,故此点上下界相等。由此得到 F(a^*)=-\Phi(f^*),以及两种变量的最优解对应。

07

叠放方块的承载接触

继续采用第十一章的叠放方块。两物体质量各为一千克,只沿竖直方向运动,重力加速度大小取每二次方秒十米。地面反力记为第一行,层间反力记为第二行。现在对上方块施加向上的外力,观察上方块何时离开下方块。

外力大小记为 P。先取参考加速度和正则化为零,得到一个硬接触的可手算模型。自由加速度、接触响应与零力残差为

a_u=\begin{bmatrix}-10\\-10+P\end{bmatrix},\quad J=\begin{bmatrix}1&0\\-1&1\end{bmatrix},\quad H=A=\begin{bmatrix}1&-1\\-1&2\end{bmatrix},\quad b=Ja_u=\begin{bmatrix}-10\\P\end{bmatrix}.

这里 H 的单位为每千克,b 的单位为加速度。两行独立,且 u^{\mathsf T}Hu=(u_1-u_2)^2+u_2^2>0,所以这个硬模型仍有唯一极小点。由 w=Hf+b,两行残差分别为 w_1=f_1-f_2-10 与 w_2=-f_1+2f_2+P。

上拉力引起的接触分离

取 P=15\,\mathrm N。若先假定两处都承载,就令两行残差为零。由第一行 f_1=10+f_2,代入第二行得 f_2=-5\,\mathrm N,再得 f_1=5\,\mathrm N。层间负力违反非负条件,说明“两处都承载”的假设需要调整。

直接把负分量截成零,会留下 f=(5,0)^{\mathsf T}\,\mathrm N。此时地面行残差为 w_1=-5\,\mathrm{m/s^2}:下方块仍在向地面加速。层间力改为零后,地面力也必须重新计算。由 f_2=0,w_1=0 得到 f_1=10\,\mathrm N;另一行随后给出 w_2=5\,\mathrm{m/s^2},上方块开始分离。

f^*=\begin{bmatrix}10\\0\end{bmatrix}\!\mathrm N,\qquad w^*=\begin{bmatrix}0\\5\end{bmatrix}\!\mathrm{m/s^2},\qquad a=\begin{bmatrix}0\\5\end{bmatrix}\!\mathrm{m/s^2}.
(13.8)

活动集方法把“哪些力固定为零”作为一个候选假设,再求其余力并核对该假设。对于两个接触,只有四种组合,可以完整列举。

计算四种承载组合的逐一检验f^*=(10,0)^{\mathsf T}\,\mathrm N
\begin{array}{c|c|c|c}\text{允许非零的行}&f&w&\text{判定}\\\hline\{1,2\}&(5,-5)&(0,0)&f_2<0\\\{1\}&(10,0)&(0,5)&\text{满足 KKT}\\\{2\}&(0,-7.5)&(-2.5,0)&f_2<0\\\varnothing&(0,0)&(-10,15)&w_1<0\end{array}

只保留第二行时,由 2f_2+15=0 得到 f_2=-7.5,所以这个假设也被排除。四种组合中,只有地面承载符合全部条件。其目标值为 \Phi=10^2/2-10\cdot10=-50;乘子为 \alpha=w=(0,5)^{\mathsf T},代入对偶函数同样得到 -50,上下界一致。

用一般记号表示:令 \mathcal P 收集允许为正的力分量,\mathcal Z 收集固定为零的分量。在所选面内,先解

f_{\mathcal Z}=0,\qquad H_{\mathcal P\mathcal P}f_{\mathcal P}=-b_{\mathcal P}.

再检查 f_{\mathcal P}\geq0 和 w_{\mathcal Z}\geq0。构造时已有 w_{\mathcal P}=0,三者合在一起就是完整的非负力 KKT 条件。此处“活动”指力域中被压在零点的非负边界;物理上承载的接触则具有正力,图中直接写出承载行以免混淆。

实验 05叠放方块的承载组合

改变上方块外力,逐个检查四种候选。点的位置表示两股接触力,侧栏同时给出这组力产生的物体加速度。比较无约束解、分量截断与 KKT 解。

取 P=0,两处接触都承载,解为 (20,10)^{\mathsf T}\,\mathrm N。逐渐增加上拉力,在 0\leq P\leq10 范围内得到 f=(20-P,10-P)^{\mathsf T}\,\mathrm N;超过 10\,\mathrm N 后,层间力保持为零,地面力保持为 10\,\mathrm N。因而接触分离的边界可以从物体受力和最优性条件两侧互相核对。

加入正则量 R 后,图中使用 H=A+R,候选组合的检查方式保持不变。对 n 个非负变量,完整枚举有 2^n 种组合,适合小规模推导与独立校验。第十五章沿同一模型逐步更新力,说明大型求解器怎样逐渐满足这些条件。

08

MuJoCo 3.10.0 源码对应

本地头文件 mujoco.h 的版本宏为 mjVERSION_HEADER 3010000。力空间二次函数中的量与源码对应如下:

数学量数据与计算
b=Ja_u-a_{\rm ref}efc_b,由 mj_fwdConstraint 构造
H=A+Refc_AR,由 mj_makeAR 在对应路径装配
R、R^{-1}efc_R、efc_D
fefc_force,约束行顺序
j=Ja-a_{\rm ref}jar,约束状态与软代价的输入

engine_forward.c 在 mj_fwdConstraint 中先形成零力残差:

mj_mulJacVec(m, d, d->efc_b, d->qacc_smooth);
mju_subFrom(d->efc_b, d->efc_aref, nefc);

engine_core_constraint.c 的 mj_makeAR 在约束空间惯性矩阵对角线上加 efc_R。同文件的 mj_constraintUpdate_impl 先计算软响应,再处理非负分支:

force[i] = -D[i]*jar[i];
// non-negative contact row
if (jar[i] >= 0) {
  force[i] = 0;
  state[i] = mjCNSTRSTATE_SATISFIED;
}

这段分支是在给定当前加速度时计算 f_n=\max(0,-j/R)。求解器收敛后,j=Af+b 与该响应同时成立,便得到 (A+R)f+b=w 的互补条件。j 和 w 因此在代码中承担不同的计算角色。

engine_solver.c 的 residual 计算整行 efc_b + efc_AR * efc_force。PGS 对标量法向行的核心操作是

force[i] -= res[0]*ARinv[c];
if (force[i] < 0) {
  force[i] = 0;
}

这里 ARinv[c] 存放当前行对角元素的倒数。保持其他力不变时,这一步精确极小化该坐标上的抛物线。全局耦合由后续遍历持续更新。

概念说明可对照 MuJoCo 的约束模型文档;凸性、Slater 条件和对偶理论可对照 Boyd 与 Vandenberghe 的 Convex Optimization 第 2、3、5 章。

09

可运行程序与习题

下载 convex_contact.py。程序用高斯消元求每个候选面上的极小点,再检查非负性与互补。输入矩阵按嵌套行数组给出,返回力、残差及候选记录。

python3 examples/convex_contact.py

在 examples 目录可以直接运行下面的方块算例。候选记录保留每组承载假设,因此输出能够逐行对应第七节的表格。

from convex_contact import solve_contact

H = [[1.0, -1.0], [-1.0, 2.0]]
b = [-10.0, 15.0]
result = solve_contact(H, b)
print(result["force"])     # [10.0, 0.0]
print(result["residual"])  # [0.0, 5.0]
for row in result["candidates"]:
    print(row["support"], row["force"], row["residual"], row["valid"])
def candidate(H, b, support):
    n = len(b)
    f = [0.0] * n
    block = [[H[i][j] for j in support] for i in support]
    values = solve(block, [-b[i] for i in support])
    for i, value in zip(support, values):
        f[i] = value
    w = [sum(H[i][j]*f[j] for j in range(n)) + b[i]
         for i in range(n)]
    return f, w

枚举先给出有限个可核对的候选;接触数增加后可以用迭代算法替换搜索过程。保留 f\geq0、w\geq0 和 f_iw_i\approx0 作为统一检查。

1. 正则量与实际加速度

取 m=2\,\mathrm{kg}、R=0.25\,\mathrm{kg^{-1}}、a_{\rm ref}=0、b=-9\,\mathrm{m/s^2},求法向力、正则化残差与实际法向加速度。

解答计算过程与结果
h=0.5+0.25=0.75,\quad f_n=9/0.75=12\,\mathrm N,\quad w=0.
j=w-Rf_n=-3\,\mathrm{m/s^2}.

参考加速度为零,因此本例的实际法向加速度也等于该残差。

2. 梯度和曲率

令 F(x)=x_1^2+x_1x_2+2x_2^2-3x_1。求梯度、Hessian,并判断凸性。

解答计算过程与结果
\nabla F=\begin{bmatrix}2x_1+x_2-3\\x_1+4x_2\end{bmatrix},\quad H=\begin{bmatrix}2&1\\1&4\end{bmatrix}.
z^{\mathsf T}Hz=2(z_1+z_2/2)^2+\frac72z_2^2>0\quad(z\ne0).

因此目标严格凸。

3. 等式和不等式

沿用目标点 (2,1)^{\mathsf T},分别求 x_1+x_2=5 与 x_1+x_2\leq5 的最优点和乘子。

解答计算过程与结果
\beta=(3-5)/2=-1,\qquad x^*=(3,2)^{\mathsf T}.

半空间中目标点已可行,故 x^*=(2,1)^{\mathsf T}、\alpha=0。等式乘子的负号表示梯度平衡发生在法向的另一侧。

4. 对偶间隙

标量问题取 h=2、b=-4。用可行点 f=1 和乘子 \alpha=0 计算原始值、对偶下界和间隙,再求最优点。

解答计算过程与结果
\Phi(1)=1-4=-3,\quad\mathcal D(0)=-16/4=-4,\quad\Phi-\mathcal D=1.
f^*=2,\quad\Phi(f^*)=-4,\quad\alpha^*=0.

对偶下界已经达到最优值,当前原始点仍高出一个单位的代价。

5. 重复约束

设 A=\begin{bmatrix}1&1\\1&1\end{bmatrix}、b=(-2,-2)^{\mathsf T}。先取 R=0,再取 R=0.2I,比较非负最优力。

解答计算过程与结果
R=0:\quad\Phi=\tfrac12(f_1+f_2)^2-2(f_1+f_2).

所有满足 f_1+f_2=2 且分量非负的力都最优。

R=0.2I:\quad1.2f_1+f_2=2,\quad f_1+1.2f_2=2.

相减得到 f_1=f_2,所以唯一解为 f_1=f_2=10/11。正则化同时改变力大小与分配唯一性。

6. 接触承载的改变

叠放方块取 R=0,上拉力改为 P=5\,\mathrm N。求两股接触力、两行残差与物体加速度。

解答计算过程与结果
f_1-f_2=10,\quad -f_1+2f_2+5=0\quad\Longrightarrow\quad f=(15,5)^{\mathsf T}\,\mathrm N.

两力都为正,w=0;两个物体加速度都为零,上拉力分担了上方块的一部分重量。

7. 分离边界与零乘子

叠放方块取 R=0,P=10\,\mathrm N,验证 f=(10,0)^{\mathsf T}\,\mathrm N。解释第二条非负力边界及其乘子。

解答计算过程与结果
w=Hf+b=(0,0)^{\mathsf T},\qquad f_2=0,\qquad\alpha_2=w_2=0.

上拉力刚好抵消上方块的重力,层间接触无需承载,同时尚无分离加速度。力变量处于零边界、乘子也为零;两种候选集合可以给出同一解,严格凸性仍保证力向量唯一。

8. 程序中的最优性检查

对 P=15\,\mathrm N,R=0 的叠放方块,分别检查无约束解分量截断和活动集解的非负性、残差与互补积。

解答计算过程与结果
\widehat f=(5,0)^{\mathsf T},\qquad\widehat w=(-5,10)^{\mathsf T},\qquad\max_i|\widehat f_i\widehat w_i|=25.

截断后的地面行残差为负,且互补积非零。活动集解为 f=(10,0)^{\mathsf T}、w=(0,5)^{\mathsf T},互补积为零。