读文献primal dual PBD

Posted beidou111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读文献primal dual PBD相关的知识,希望对你有一定的参考价值。

文章目录

基于最优化的时间积分(变分法)

首先写出equation of motion,实际上就是动量方程或者f=ma


这里M是质量矩阵。他是对角阵,每一项分别是对应顶点的质量。

  • u+代表下一时刻开始时的速度(或者是这一时刻结束时的速度),
  • u-代表这一时刻开始时的速度。
  • u~代表惯性作用下的下时刻速度,或者说,无约束情况下的下一时刻速度,或者说,仅仅在外力作用下的下一时刻速度。
  • q代表广义坐标。如果是直角坐标系,就是位置x。之所以用广义坐标代替是因为这里还考虑了例如摆线的极坐标。和速度一样,+代表下一时刻。

我们能够通过变分原理将动量方程转换为能量最小化问题。目标函数定义为

  • 其中Ui代表势能。如果是最简单情况我们就可以认为是弹性力对应的弹性势能。

补充:为什么势能的导数是保守力?见附录

最小化问题就是求使得目标函数g最小的下一时刻速度。

求解最小化问题的时候,需要用到目标函数的梯度(例如梯度下降法)。求导得g的梯度为

其中广义力为

(把f带进去试试,会发现求导公式就是公式4)

其中G是kinematic map。它是广义速度与广义坐标的导数之间的转换矩阵。

显然,假如在笛卡尔坐标系下,G就是单位阵。

如果用最简单的显示时间积分,这一时刻的广义坐标与下一时刻的广义坐标的关系就是

梯度下降法

一个求解最小化问题(公式3)的最简单的方法就是使用梯度下降法。

首先我们有了梯度d,如公式4所示。

然后我们向着梯度d的方向下降一小步,步长是alpha

如前所述,使用最简单的显示时间积分,那么下一时刻的广义位置就是

梯度下降法的缺陷是很慢。我们可以通过预处理来进行加速。为此我们需要找到预处理矩阵P。然后用P乘以d即可。于是公式5变为。

一个对于矩阵P的简单的选择是:选取Hessian矩阵的逆的近似值。

补充:为什么预处理矩阵P应该选择Hessian的逆呢? 见附录

加了预处理的梯度下降,此时就相当于是牛顿法了。

二次势能(primal space)

对于目标函数g(公式2)来说,可以分为惯性项和势能项。对于势能来说,使用基于约束的公式,最简单的是二次势能。

k是刚度系数。C是约束。约束可以是向量也可以是标量(后面我们主要用标量)。

根据能量最小化原理,势能的导数就是保守力。

补充:为什么会有一个G? 见附录

这里J是Constraint的Jacobian

如前所述,使用Newton style的preconditioner,那个preconditioner取Hessian矩阵。

上式中,M是质量矩阵。他是对角阵,每个元素是顶点的质量。剩下的唯一不确定的就是f对u的导数。也就是force Jacobian。 f = − ∑ i G T ∂ U i T ∂ q + \\mathbff=-\\sum_i \\mathbfG^T \\frac\\partial U_i^T\\partial \\mathbfq^+ f=iGTq+UiT。对每个单元来说,我们对u求导得到

推导我们放到附录

其中第二项叫做几何刚度,geometric stiffness。 忽略几何刚度,只考虑第一项,则H的逆,也就是预处理矩阵,近似为

(GN for Gauss-Newton)

这就是Gauss Newton法迭代(一种quasi-Newton 法)的预处理矩阵。

由于求逆会耗费大量时间,所以一般用对角的倒数矩阵代替

其中下标d代表degree of freedom,也就是节点(三维每个坐标摊平了)。

附录

附录1:为什么势能的导数就是保守力。

首先我们说保守力的概念。

保守力就是做功与路径无关的力。只和起点和重点有关。

因此保守力积分就是个定积分。积分上下限分别是终点和起点。

于是积分出来的原函数,就是功。我们随便取一个零点,功就是能量。这种保守力积分出来的能量叫做势能。也就是说,势能就是保守力积分。

所以反过来,势能求导,就是保守力。

附录2:为什么预处理矩阵P应该选择Hessian的逆呢?

关于这点,请看

https://blog.csdn.net/weixin_43940314/article/details/121125847

简单来说,就是求 a r g m i n g ( u ) argmin g(u) argming(u)相当于求解其导数得0的点(驻点)。令其导数就恰好取为某个Au=b的线性方程组。也就是

g ′ ( u ) = A u − b = 0 g'(u)=Au-b = 0 g(u)=Aub=0

那么求解Au=b就得到了期望的u。

而求解该方程最直接的办法就是直接对A求逆。也就是
u = A − 1 b u = A^-1b u=A1b
就直接得到了解。

于是梯度下降法对于g来说,相当于二阶导数(第一阶导数是求驻点,第二阶导数来自于梯度)

附录3:为什么会有一个G?

这是因为f为U对x求导。所以根据链式法则,等于
f = ∂ U / ∂ x = ( ∂ U / ∂ q ) ( ∂ q / ∂ x ) f = \\partial U/ \\partial x = (\\partial U / \\partial q) (\\partial q / \\partial x) f=U/x=(U/q)(q/x)

速度u与广义坐标导数的关系为
q ˙ = G u \\dot q = G u q˙=Gu
上市可以认为是广义坐标系下的速度(实际上是广义坐标的时间导数)与直角坐标系下的速度u的关系。又因为我们采用了最简单的显式时间积分,速度和位置之间只不过是乘以个dt的关系,而dt是个常数,因此是线性的。

Δ q / Δ t = G u \\Delta q/\\Delta t = Gu Δqt=Gu

所以广义坐标和直角坐标系位置的转换矩阵也是矩阵G。

Δ q = G Δ x \\Delta q = G \\Delta \\mathbf x Δq=GΔx

所以 ( ∂ q / ∂ x ) (\\partial q / \\partial x) (q/x)这一项就是G。而转置不转置,只是为了内积的写法。因为内积是标量,所以最后写出来都是一样的。

由于 q ˙ = G u \\dot q = G u q˙=Gu所以显式时间积分后 Δ q = G u \\Delta q = G u Δq=Gu。因为零点对导数没影响,我们这里就认为零点是0了,所以 q = G u d t q = G u dt q=Gudt

附录4:推导f对u求导

目标是推导出

∂ f ∂ u = − Δ t k [ J T J + ∂ J ∂ u C ] \\frac\\partial \\mathbff\\partial \\mathbfu=-\\Delta t k\\left[\\mathbfJ^T \\mathbfJ+\\frac\\partial \\mathbfJ\\partial \\mathbfu C\\right] uf=Δtk[JTJ+uJC]

其中

  • f是保守力
  • u是速度
  • C是constraint function: C(q)
  • J是constraint Jacobian, J = ( ∂ C / ∂ q ) G J=(\\partial C/\\partial q) G J=(C/q)G
  • k是stiffness
  • Δ t \\Delta t Δt是时间步长.

已知

f = − G T ∂ U T ∂ q \\mathbff=-\\mathbfG^T \\frac\\partial U^T\\partial \\mathbfq f=GTqUT
J = ∂ C ∂ q G J=\\frac\\partial C\\partial q G J=qCG
Δ q = G u d t \\Delta q = G u dt Δq=Gudt
U = 1 2 k C 2 U = \\frac12kC^2 U=21kC2

G是kinmatic map, 用于转换广义坐标系与直角坐标系

我们这里不加上标的q都默认是q+. 因为q-是已知量(上一时刻的广义位置),而只有下一时刻的位置q+是未知量。
由于 q ˙ = G u \\dot q = G u q˙=Gu所以显式时间积分后 Δ q = G u \\Delta q = G u Δq=Gu。因为零点对导数没影响,我们这里就认为零点是0了,所以 q = G u d t q = G u dt q=Gudt

∂ f / ∂ u = − ∂ ( G T ∂ U T ∂ q ) ∂ u = − G ∂ 2 U ∂ q 2 ∂ q ∂ u = − G 2 d t ∂ 2 U ∂ q 2 = − G 2 d t k C ∂ C ∂ q ∂ q = − G 2 d t   k ( ( ∂ C ∂ q ) 2 + C ∂ 2 C ∂ q 2 ) = − G 2 d t   k ( ( G − 1 J ) 2 + ( G − 1 ) 2 ∂ J ∂ q C ) = − d t   k ( J 2 + ∂ J ∂ q C ) \\beginalign* \\partial f/\\partial u&=- \\frac\\partial(\\mathbfG^T \\frac\\partial U^T\\partial \\mathbfq)\\partial u \\\\ &=-G\\frac\\partial^2 U\\partial q^2 \\frac\\partial q\\partial u\\\\ &=-G^2 dt \\frac\\partial^2 U\\partial q^2\\\\ &=-G^2 dt \\frackC\\frac\\partial C\\partial q\\partial q\\\\ &=-G^2 dt \\space k \\left( (\\frac\\partial C\\partial q)^2 + C\\frac\\partial^2 C\\partial q^2\\right)\\\\ &=-G^2 dt \\space k \\left((G^-1J)^2 + (G^-1)^2 \\frac\\partial J\\partial qC\\right)\\\\ &=- dt \\space k \\left(J^2 + \\frac\\partial J\\partial qC\\right) \\endalign* f/u=u(GTqUT)=Gq22Uuq

以上是关于读文献primal dual PBD的主要内容,如果未能解决你的问题,请参考以下文章

primal and dual linear problem

primal and dual linear problem

使用Python实现Primal-Dual Interior Point Method

使用Python实现Primal-Dual Interior Point Method

Andrew Ng机器学习笔记+Weka相关算法实现SVM和原始对偶问题

2.机器学习技法- Dual Support Vector Machine