Skip to main content

不变式构造本构模型并计算Hessian

参考论文:Smith, B., F. D. Goes, and T. Kim (2019, February). Analytic eigensystems for isotropic distortion energies. ACM Trans. Graph. 38(1).

请确保对张量缩并有所了解

本构模型能量密度对位置的二阶导需要计算能量密度对形变梯度的二阶导2ΨF2\frac{\partial^2\Psi}{\partial{\bf F}^2},这个量是一个3×3×3×33\times3\times3\times3的四维张量,所以请先确保你对张量的缩并有所了解。我的博客中给出了一个比较通俗的解释,通过一些平坦化的手段让物理模拟场景下的张量计算能够简化为矩阵和向量之间的计算,传送门:张量计算

什么是不变式(invariants)?

不变式和应变的感觉有一些像,就是一系列用来正确表征形变的物理量,那么什么东西不会带来形变呢?是平移和旋转,所以不变式就是能够在平移和旋转的时候保持不变的,由形变梯度构成的式子。

下面给出论文中所提出的三个不变式:

I1=tr(S)I2=tr(S2)I3=det(F)=det(RS)=det(R)det(S)=det(S)I_1=\operatorname*{tr}({\bf S}) \qquad I_2=\operatorname{tr}({\bf S}^2)\qquad I_3=\operatorname{det}(F)=\operatorname{det}({\bf RS})=\operatorname{det}({\bf R})\operatorname{det}({\bf S})=\operatorname{det}({\bf S})

目前已知的大量本构模型的能量密度函数都可以用三个不变式进行构建,例如:

ARAP

ΨARAP=FRF2=FF22tr(FTR)+RF2\begin{aligned} \Psi_{\text{ARAP}}&=||{\bf F}-{\bf R}||^2_F\\ &=||{\bf F}||^2_F-2\operatorname{tr}({\bf F}^T{\bf R})+||{\bf R}||^2_F\\ \end{aligned}

因为有:

  • FF2=ijFij2=tr(FTF)=tr(STRTRS)=tr(S2)||{\bf F}||_F^2=\sum_i\sum_jF_{ij}^2=\operatorname{tr}({\bf F}^T{\bf F})=\operatorname{tr}({\bf S}^T{\bf R}^T{\bf R}{\bf S})=\operatorname{tr}({\bf S}^2)S\bf S为对称阵)
  • RF2=tr(RRT)=tr(I)=3||{\bf R}||_F^2=\operatorname{tr}({\bf RR}^T)=\operatorname{tr}({\bf I})=3

所以:

ΨARAP=FF22tr(FTR)+RF2=tr(S2)2tr(S)+3=I22I1+3\begin{aligned} \Psi_{\text{ARAP}}&=||{\bf F}||^2_F-2\operatorname{tr}({\bf F}^T{\bf R})+||{\bf R}||^2_F\\ &=\operatorname{tr}({\bf S}^2)-2\operatorname{tr}({\bf S})+3\\ &=I_2-2I_1+3 \end{aligned}

Bonet and Wood (2008)-style Neo-Hookean

Bonet, J. and R. D. Wood (2008). Nonlinear continuum mechanics for finite element analysis. Cambridge university press.

ΨNHBW=μ2(FF23)μlog(J)+λ2(log(J))2\Psi_{NHBW}=\frac{\mu}{2}(||{\bf F}||_F^2-3)-\mu\operatorname{log}(J)+\frac{\lambda}{2}(\operatorname{log}(J))^2

其中JJ即为det(F)\operatorname{det}(F),从而有:

ΨNHBW=μ2(I23)μlog(I3)+λ2(log(I3))2\Psi_{NHBW}=\frac{\mu}{2}(I_2-3)-\mu\operatorname{log}(I_3)+\frac{\lambda}{2}(\operatorname{log}(I_3))^2

其他能量的不变式表示请见本系列的其他文章。

不变式的梯度

我们用不变式来表示能量密度的主要目的就是为了简化能量密度的梯度和Hessian(相对形变梯度,本文中在没有注明的情况下所提到的梯度和Hessian,都是相对于形变梯度,而非位置!)的计算,对任意可以用不变式来表示的能量,他们的梯度具有这样一个通式:

tip

根据The Matrix Cookbooktr(AXT)X=A\frac{\partial \operatorname{tr}({\bf AX}^T)} {\partial {\bf X}}={\bf A}

ΨF=ΨI1I1F+ΨI2I2F+ΨI3I3F\frac{\partial \Psi}{\partial {\bf F}}=\frac{\partial \Psi}{\partial I_1}\frac{\partial I_1}{\partial {\bf F}}+\frac{\partial \Psi}{\partial I_2}\frac{\partial I_2}{\partial {\bf F}}+\frac{\partial \Psi}{\partial I_3}\frac{\partial I_3}{\partial {\bf F}}

其中ΨIi\frac{\partial \Psi}{\partial I_i}的计算非常简单,就是单纯的标量求导,高中知识就能算。接下来要计算的就是IiF\frac{\partial I_i}{\partial {\bf F}},接下来分别计算一下:

I1F=tr(S)F=tr(RFT)F=RI2F=tr(S2)F=FF2F=2F\begin{aligned} \frac{\partial I_1}{\partial {\bf F}}=\frac{\operatorname*{tr}({\bf S})}{\partial {\bf F}}=\frac{\partial \operatorname{tr}({\bf RF}^T)}{\partial {\bf F}}={\bf R}\\ \frac{\partial I_2}{\partial {\bf F}}=\frac{\partial \operatorname{tr}({\bf S}^2)}{\partial {\bf F}}=\frac{\partial ||{\bf F}||_F^2}{\partial {\bf F}}=2{\bf F} \end{aligned}

I3I_3的梯度计算会稍微麻烦一些,这里给出结论(TODO 找到一个好一点的参考材料): 在三维空间中,形变梯度F\bf F可以表示为:

F=[f0f1f2]{\bf F}=\left[ \begin{array}{c|c|c} {\bf f}_0 & {\bf f}_1 & {\bf f}_2 \end{array} \right]

那么有:

I3F=JF=[f1×f2f2×f0f0×f1]\frac{\partial I_3}{\partial {\bf F}}=\frac{\partial J}{\partial {\bf F}}= \left[ \begin{array}{c|c|c} {\bf f}_1\times{\bf f}_2 & {\bf f}_2\times{\bf f}_0 & {\bf f}_0\times{\bf f}_1 \end{array} \right]

不变式的Hessian

与梯度类似,使用不变式构造的能量密度的Hessian同样也具有一个计算通式,不同的是,此处的Hessian它是一个3×3×3×33\times3\times3\times3的四维张量,我们需要将其“平坦化”为一个矩阵后,再使用下面这个公式去计算能量密度相对于位置Hessian

2Ψx2=vec(Fx)Tvec(2ΨF2)vec(Fx)\frac{\partial^2\Psi}{\partial {\bf x}^2} = \text{vec}\left(\frac{\partial {\bf F}}{\partial {\bf x}}\right)^T\text{vec}\left(\frac{\partial^2 \Psi}{\partial {\bf F}^2}\right)\text{vec}\left(\frac{\partial {\bf F}}{\partial {\bf x}}\right)

中间那一项就是平坦化后的不变式的Hessian,其计算通式为:

vec(2ΨF2)=2ΨI12g1g1T+ΨI1H1+2ΨI22g2g2T+ΨI2H2+2ΨI32g3g3T+ΨI3H3=i=132ΨIi2gigiT+ΨIiHi\begin{aligned} \operatorname{vec}\left(\frac{\partial^2 \Psi}{\partial {\bf F}^2}\right)&=\frac{\partial^2\Psi}{\partial I_1^2}{\bf g}_1{\bf g}_1^T+\frac{\partial \Psi}{\partial I_1}{\bf H}_1+\frac{\partial^2\Psi}{\partial I_2^2}{\bf g}_2{\bf g}_2^T+\frac{\partial \Psi}{\partial I_2}{\bf H}_2+\frac{\partial^2\Psi}{\partial I_3^2}{\bf g}_3{\bf g}_3^T+\frac{\partial \Psi}{\partial I_3}{\bf H}_3\\ &=\sum_{i=1}^3\frac{\partial^2\Psi}{\partial I_i^2}{\bf g}_i{\bf g}_i^T+\frac{\partial \Psi}{\partial I_i}{\bf H}_i \end{aligned}

其中gi=vec(IiF){\bf g}_i=\operatorname{vec}\left(\frac{\partial I_i}{\partial {\bf F}}\right)Hi=vec(2IiF2){\bf H}_i=\operatorname{vec}\left(\frac{\partial^2 I_i}{\partial {\bf F}^2}\right)。首先我们先来看看平坦化的I2,I3I_2,I_3的Hessian,I1I_1的Hessian计算比较麻烦,所以最后再讲,首先是I2I_2

H2=vec(2FF)=2vec([[100000000][010000000][001000000][000100000][000010000][000001000][000000100][000000010][000000001]])=2vec([[dF0][dF1][dF2][dF3][dF4][dF5][dF6][dF7][dF8]])=2[vec([dF0])vec([dF3])vec([dF6])vec([dF0])vec([dF0])vec([dF0])]=2[100000000010000000001000000000100000000010000000001000000000100000000010000000001]=2I9×9\begin{aligned} {\bf H}_2&=\operatorname{vec}\left(\frac{\partial 2{\bf F}}{\partial {\bf F}}\right)= 2\operatorname{vec}\left( \begin{bmatrix} \begin{bmatrix}1&0&0\\0&0&0\\0&0&0\end{bmatrix}&\begin{bmatrix}0&1&0\\0&0&0\\0&0&0\end{bmatrix}&\begin{bmatrix}0&0&1\\0&0&0\\0&0&0\end{bmatrix}\\\\ \begin{bmatrix}0&0&0\\1&0&0\\0&0&0\end{bmatrix}&\begin{bmatrix}0&0&0\\0&1&0\\0&0&0\end{bmatrix}&\begin{bmatrix}0&0&0\\0&0&1\\0&0&0\end{bmatrix}\\\\ \begin{bmatrix}0&0&0\\0&0&0\\1&0&0\end{bmatrix}&\begin{bmatrix}0&0&0\\0&0&0\\0&1&0\end{bmatrix}&\begin{bmatrix}0&0&0\\0&0&0\\0&0&1\end{bmatrix} \end{bmatrix} \right)\\ &=2\operatorname{vec}\left( \begin{bmatrix} [{\bf dF}_0]&[{\bf dF}_1]&[{\bf dF}_2]\\\\ [{\bf dF}_3]&[{\bf dF}_4]&[{\bf dF}_5]\\\\ [{\bf dF}_6]&[{\bf dF}_7]&[{\bf dF}_8] \end{bmatrix} \right)\\ &=2\begin{bmatrix} \operatorname{vec}\left([{\bf dF}_0]\right) & \operatorname{vec}\left([{\bf dF}_3]\right) & \operatorname{vec}\left([{\bf dF}_6]\right)& \cdots& \operatorname{vec}\left([{\bf dF}_0]\right)& \operatorname{vec}\left([{\bf dF}_0]\right)& \operatorname{vec}\left([{\bf dF}_0]\right) \end{bmatrix}\\ &=2\begin{bmatrix} 1&0&0&0&0&0&0&0&0\\ 0&1&0&0&0&0&0&0&0\\ 0&0&1&0&0&0&0&0&0\\ 0&0&0&1&0&0&0&0&0\\ 0&0&0&0&1&0&0&0&0\\ 0&0&0&0&0&1&0&0&0\\ 0&0&0&0&0&0&1&0&0\\ 0&0&0&0&0&0&0&1&0\\ 0&0&0&0&0&0&0&0&1\\ \end{bmatrix}=2{\bf I}_{9\times9} \end{aligned}

I3I_3也直接给出结论:

首先我们定义一个^\hat{\quad}算子,它能够将一个向量转化为这样的矩阵:

x^=[0x2x1x20x0x1x00]\hat{\bf x}=\begin{bmatrix} 0&-x_2&x_1\\ x_2&0&-x_0\\ -x_1&x_0&0 \end{bmatrix}

那么有:

H3=[03×3f^2f^1f^203×3f^0f^1f^003×3]{\bf H}_3=\begin{bmatrix} {\bf 0}_{3\times3} & -\hat{\bf f}_2 & \hat{\bf f}_1\\ \hat{\bf f}_2 & {\bf 0}_{3\times3} & -\hat{\bf f}_0\\ -\hat{\bf f}_1 & \hat{\bf f}_0 & {\bf 0}_{3\times3} \end{bmatrix}

OK,接下来看看I1I_1的Hessian,为什么说他很难计算呢?根据前文已经了解到了I1I_1的梯度即极分解后得到的正交矩阵R{\bf R},那么其Hessian显而易见,就是RF\frac{\partial {\bf R}}{\partial {\bf F}}。问题就是出在这里,我们并不知道这个正交矩阵相对形变梯度的偏导是什么。在本篇参考的论文中,通过构造旋转梯度RF\frac{\partial {\bf R}}{\partial {\bf F}}这个四维张量的特征值系统来解决这个问题。

旋转梯度的特征值系统表征

矩阵的特征值系统具备这样的特征:

Aq0=λ0q0{\bf Aq}_0=\lambda_0{\bf q}_0

类似的,对于下面这个四维张量

A=[[a0a1a2a3][a4a5a6a7][a8a9a10a11][a12a13a14a15]]{\bf A} = \begin{bmatrix} \begin{bmatrix} a_0 & a_1\\ a_2 & a_3 \end{bmatrix} & \begin{bmatrix} a_4 & a_5\\ a_6 & a_7 \end{bmatrix} \\ \\ \begin{bmatrix} a_8 & a_9\\ a_{10} & a_{11} \end{bmatrix} & \begin{bmatrix} a_{12} & a_{13}\\ a_{14} & a_{15} \end{bmatrix} \end{bmatrix}

也存在一个特征值λ0\lambda_0和特征矩阵Q0{\bf Q}_0使得:

A:Q0=λ0Q0{\bf A}:{\bf Q}_0=\lambda_0{\bf Q}_0

将这个过程平坦化:

(vecA)T(vecQ0)=λ0vecQ0(\operatorname{vec}{\bf A})^T(\operatorname{vec}{\bf Q}_0)=\lambda_0\operatorname{vec}{\bf Q}_0

那我们要怎么找到四维张量RF\frac{\partial {\bf R}}{\partial {\bf F}}的特征值和特征矩阵呢?论文中发现,如果形变梯度的奇异值分解的结果为:

F=UΣVTΣ=[σx000σy000σz]{\bf F}={\bf U\Sigma V}^T\qquad {\bf \Sigma}=\begin{bmatrix} \sigma_x & 0 & 0\\ 0 & \sigma_y & 0\\ 0 & 0 & \sigma_z \end{bmatrix}

那么RF\frac{\partial {\bf R}}{\partial {\bf F}}的特征值系统为:

λ0=2σx+σyQ0=12U[010100000]VTλ1=2σy+σzQ0=12U[000001010]VTλ2=2σx+σzQ0=12U[001000100]VTλ3...8=0Q3...8=subspace orthogonal to Q0,1,2\begin{aligned} &\lambda_0=\frac{2}{\sigma_x+\sigma_y} \qquad {\bf Q}_0=\frac{1}{\sqrt{2}}{\bf U}\begin{bmatrix} 0 & -1 & 0\\ 1 & 0 & 0\\ 0 & 0 & 0 \end{bmatrix}{\bf V}^T\\ &\lambda_1=\frac{2}{\sigma_y+\sigma_z} \qquad {\bf Q}_0=\frac{1}{\sqrt{2}}{\bf U}\begin{bmatrix} 0 & 0 & 0\\ 0 & 0 & 1\\ 0 & -1 & 0 \end{bmatrix}{\bf V}^T\\ &\lambda_2=\frac{2}{\sigma_x+\sigma_z} \qquad {\bf Q}_0=\frac{1}{\sqrt{2}}{\bf U}\begin{bmatrix} 0 & 0 & 1\\ 0 & 0 & 0\\ -1 & 0 & 0 \end{bmatrix}{\bf V}^T\\ &\lambda_{3...8}=0 \qquad {\bf Q}_{3...8}=\text{subspace orthogonal to }{\bf Q}_{0,1,2} \end{aligned}

那么根据特征值系统的性质就可以得到:

vec(RF)=i=02λivec(Qi)vec(Qi)T\operatorname{vec}\left(\frac{\partial {\bf R}}{\partial {\bf F}}\right)= \sum_{i=0}^2\lambda_i\operatorname{vec}({\bf Q}_i)\operatorname{vec}({\bf Q}_i)^T

结论

基于上述内容,可以给出本构模型的计算通用方法如下:

g1=vec(R)H1=i=02λivec(Qi)vec(Qi)Tg2=vec(2F)H2=2I9×9g3=[f1×f2f2×f0f0×f1]H3=[03×3f^2f^1f^203×3f^0f^1f^003×3]\begin{aligned} &{\bf g}_1=\operatorname{vec}({\bf R}) &{\bf H}_1=\sum_{i=0}^2\lambda_i\operatorname{vec}({\bf Q}_i)\operatorname{vec}({\bf Q}_i)^T\\ &{\bf g}_2=\operatorname{vec}(2{\bf F}) &{\bf H}_2=2{\bf I}_{9\times9}\\ &{\bf g}_3=\left[ \begin{array}{c|c|c} {\bf f}_1\times{\bf f}_2 & {\bf f}_2\times{\bf f}_0 & {\bf f}_0\times{\bf f}_1 \end{array} \right] &{\bf H}_3=\begin{bmatrix} {\bf 0}_{3\times3} & -\hat{\bf f}_2 & \hat{\bf f}_1\\ \hat{\bf f}_2 & {\bf 0}_{3\times3} & -\hat{\bf f}_0\\ -\hat{\bf f}_1 & \hat{\bf f}_0 & {\bf 0}_{3\times3} \end{bmatrix} \end{aligned}
  1. 使用不变式I1,I2I_1, I_2I3I_3来重写能量密度函数Ψ\Psi
  2. 计算能量密度函数相对不变量的标量导数:ΨI1\frac{\partial \Psi}{\partial I_1}2ΨI12\frac{\partial^2\Psi}{\partial I_1^2}ΨI2\frac{\partial \Psi}{\partial I_2}2ΨI22\frac{\partial^2\Psi}{\partial I_2^2}ΨI3\frac{\partial \Psi}{\partial I_3}2ΨI32\frac{\partial^2\Psi}{\partial I_3^2}
  3. 使用下面两个通式来计算能量密度的和Hessian: vec(2ΨF2)=i=132ΨIi2gigiT+ΨIiHi\operatorname{vec}\left(\frac{\partial^2 \Psi}{\partial {\bf F}^2}\right)=\sum_{i=1}^3\frac{\partial^2\Psi}{\partial I_i^2}{\bf g}_i{\bf g}_i^T+\frac{\partial \Psi}{\partial I_i}{\bf H}_i