2D弹簧质点系统的隐式求解

本文主要记录如何用隐式方法求解弹簧质点系统,也是对Games201课程作业一的总结。

本文主要分为以下几个部分:

  • 弹簧质点系统的简单介绍

  • 隐式方法的推导

  • Jacobi矩阵的推导

  • 数值方法的简单介绍

  • 程序验证

  • 总结

一、弹簧质点系统

弹簧质点系统在柔体、弹性体中有广泛的应用。根据胡克定律对弹簧系统建模:

Fs=−K(∣xij−r∣)x^ij(1)\boldsymbol{F}_s=-K(|\boldsymbol{x}_{ij}-r|)\hat{\boldsymbol{x}}_{ij}\tag{1} Fs​=−K(∣xij​−r∣)x^ij​(1)

其中xij=xi−xj\boldsymbol{x}_{ij}=\boldsymbol{x}_{i}-\boldsymbol{x}_{j}xij​=xi​−xj​ 。系统中两个质点受力相反。x^ij\hat{\boldsymbol{x}}_{ij}x^ij​为单位向量。

二、隐式方法的推导

相对于显式的方法,隐式方法更稳定,允许较大时步。关于显式、隐式方法的概述,可参考这个course note。

下面进行隐式方法的推导:
xt+1=xt+△tvt+1(2)\boldsymbol{x}_{t+1}=\boldsymbol{x}_t+\triangle{t}\boldsymbol{v}_{t+1}\tag{2} xt+1​=xt​+△tvt+1​(2)

vt+1=vt+△tM−1f(xt+1)(3)\boldsymbol{v}_{t+1}=\boldsymbol{v}_t+\triangle{t}\boldsymbol{M}^{-1}\boldsymbol{f}(\boldsymbol{x}_{t+1})\tag{3} vt+1​=vt​+△tM−1f(xt+1​)(3)

其中:
x=[x1,...,xn]T\boldsymbol{x}={[\boldsymbol{x}_{1},...,\boldsymbol{x}_{n}]}^T x=[x1​,...,xn​]T

v=[v1,...,vn]T\boldsymbol{v}={[\boldsymbol{v}_{1},...,\boldsymbol{v}_{n}]}^T v=[v1​,...,vn​]T

f(x)=[f1(x1,...,xn)T,...,fn(x1,...,xn)T]T\boldsymbol{f(\boldsymbol{x})}={[\boldsymbol{f}_1{(\boldsymbol{x}_1,...,\boldsymbol{x}_n)}^T,...,\boldsymbol{f}_n{(\boldsymbol{x}_1,...,\boldsymbol{x}_n)}^T]}^T f(x)=[f1​(x1​,...,xn​)T,...,fn​(x1​,...,xn​)T]T

将(2)代入(3)得:
vt+1=vt+△tM−1f(xt+△tvt+1)(4)\boldsymbol{v}_{t+1}=\boldsymbol{v}_t+\triangle{t}\boldsymbol{M}^{-1}\boldsymbol{f}(\boldsymbol{x}_{t}+\triangle{t}\boldsymbol{v}_{t+1})\tag{4} vt+1​=vt​+△tM−1f(xt​+△tvt+1​)(4)
注意到(4)式右侧f\boldsymbol{f}f里的参数,(4)式是非线性的,所以对参数进行一阶泰勒展开,得:
vt+1=vt+△tM−1[f(xt)+∂f∂x(xt)△tvt+1](5)\boldsymbol{v}_{t+1}=\boldsymbol{v}_t+\triangle{t}\boldsymbol{M}^{-1}[f(\boldsymbol{x}_{t})+\frac{\partial\boldsymbol{f}}{\partial\boldsymbol{x}}(\boldsymbol{x}_t)\triangle{t}\boldsymbol{v}_{t+1}]\tag{5} vt+1​=vt​+△tM−1[f(xt​)+∂x∂f​(xt​)△tvt+1​](5)
整理一下,得:
Mvt+1=Mvt+△t[f(xt)+∂f∂x(xt)△tvt+1](6)\boldsymbol{M}\boldsymbol{v}_{t+1}=\boldsymbol{M}\boldsymbol{v}_t+\triangle{t}[f(\boldsymbol{x}_{t})+\frac{\partial\boldsymbol{f}}{\partial\boldsymbol{x}}(\boldsymbol{x}_t)\triangle{t}\boldsymbol{v}_{t+1}]\tag{6} Mvt+1​=Mvt​+△t[f(xt​)+∂x∂f​(xt​)△tvt+1​](6)
令J=∂f∂x(xt)\boldsymbol{J}=\frac{\partial{\boldsymbol{f}}}{\partial{\boldsymbol{x}}}(\boldsymbol{x}_t)J=∂x∂f​(xt​),也就是雅可比矩阵。

整理后,可以得到:
[M−△t2J]vt+1=Mvt+△tf(xt)(7)[\boldsymbol{M}-{\triangle{t}}^2\boldsymbol{J}]\boldsymbol{v}_{t+1}=\boldsymbol{M}\boldsymbol{v}_{t}+\triangle{t}\boldsymbol{f}(\boldsymbol{x}_t)\tag{7} [M−△t2J]vt+1​=Mvt​+△tf(xt​)(7)

Avt+1=b(8)\boldsymbol{A}\boldsymbol{v}_{t+1}=\boldsymbol{b}\tag{8} Avt+1​=b(8)

解此方程组,得到结果。

三、Jacobi矩阵的推导

上一部分我们得到了公式(7),解这个方程组之前我们要先求出J\boldsymbol{J}J。首先罗列一些基本公式:

标量函数对矢量求导:
∂f∂x=[∂f∂xi∂f∂xj∂f∂xk](9)\frac{\partial f}{\partial\boldsymbol{x}} = [\frac{\partial f}{\partial x_i}\ \frac{\partial f} {\partial x_j}\ \frac{\partial f} {\partial x_k}]\tag{9} ∂x∂f​=[∂xi​∂f​ ∂xj​∂f​ ∂xk​∂f​](9)
矢量函数对矢量求导:
∂f∂x=(∂fi∂xi∂fi∂xj∂fi∂xk∂fj∂xi∂fj∂xj∂fj∂xk∂fk∂xi∂fk∂xj∂fk∂xk)(10)\frac{\partial\boldsymbol{f}}{\partial\boldsymbol{x}}=\left( \begin{array}{ccc} \frac{\partial f_i}{\partial x_i} & \frac{\partial f_i}{\partial x_j} & \frac{\partial f_i}{\partial x_k}\\ \frac{\partial f_j}{\partial x_i} & \frac{\partial f_j}{\partial x_j} & \frac{\partial f_j}{\partial x_k}\\ \frac{\partial f_k}{\partial x_i} & \frac{\partial f_k}{\partial x_j} & \frac{\partial f_k}{\partial x_k}\\ \end{array} \right)\tag{10} ∂x∂f​=⎝⎜⎛​∂xi​∂fi​​∂xi​∂fj​​∂xi​∂fk​​​∂xj​∂fi​​∂xj​∂fj​​∂xj​∂fk​​​∂xk​∂fi​​∂xk​∂fj​​∂xk​∂fk​​​⎠⎟⎞​(10)

单位向量对向量求导:
∂x^∂x=I−x^⋅x^T∣x∣(11)\frac{\partial \hat{\boldsymbol{x}}}{\partial \boldsymbol{x} } = \frac{\boldsymbol{I}-\hat{\boldsymbol{x}}\cdot{\hat{\boldsymbol{x}}^T}}{|\boldsymbol{x}|}\tag{11} ∂x∂x^​=∣x∣I−x^⋅x^T​(11)
其中,I\boldsymbol{I}I是单位矩阵。

对于弹力,从胡克定律着手进行雅可比矩阵推导;对于弹簧衰减力、重力等与位置无关的力,这里使用显式的方法去计算。

下面从式(1)入手,推导弹力的雅可比矩阵:

这里只考虑二维情况,首先考虑一个系统里只有两个质点iii和jjj,那么按照式(10)的定义,我们求导后会分别得到Jii\boldsymbol{J}_{ii}Jii​,Jij\boldsymbol{J}_{ij}Jij​,Jji\boldsymbol{J}_{ji}Jji​,Jjj\boldsymbol{J}_{jj}Jjj​四个小矩阵,以计算Jii\boldsymbol{J}_{ii}Jii​为例进行推导:
∂Fs∂xi=Jii=−k[(xij−r)∂x^ijxi+x^ij∂∣xij∣−rxi](12)\frac{\partial\boldsymbol{F}_{s}}{\partial\boldsymbol{x}_{i}}=\boldsymbol{J}_{ii}=-k[(\boldsymbol{x}_{ij}-r)\frac{\partial\hat{\boldsymbol{x}}_{ij}}{\boldsymbol{x}_i}+\hat{\boldsymbol{x}}_{ij}\frac{\partial|\boldsymbol{x}_{ij}|-r}{\boldsymbol{x}_i}]\tag{12} ∂xi​∂Fs​​=Jii​=−k[(xij​−r)xi​∂x^ij​​+x^ij​xi​∂∣xij​∣−r​](12)
Fs\boldsymbol{F}_sFs​为质点iii所受弹力。

利用公式(11),得:
∂Fs∂xi=Jii=−k[(∣xij−r∣)(I−x^ij⋅x^ijT∣xij∣)+x^ij⋅x^ijT](13)\frac{\partial\boldsymbol{F}_{s}}{\partial\boldsymbol{x}_{i}}=\boldsymbol{J}_{ii}=-k[(|\boldsymbol{x}_{ij}-r|)(\frac{\boldsymbol{I}-\hat{\boldsymbol{x}}_{ij}\cdot{\hat{\boldsymbol{x}}_{ij}^T}}{|\boldsymbol{x}_{ij}|})+\hat{\boldsymbol{x}}_{ij}\cdot{\hat{\boldsymbol{x}}_{ij}^T}]\tag{13} ∂xi​∂Fs​​=Jii​=−k[(∣xij​−r∣)(∣xij​∣I−x^ij​⋅x^ijT​​)+x^ij​⋅x^ijT​](13)
变一下形:
∂Fs∂xi=Jii=−k[(1−r∣xij∣)(I−x^ij⋅x^ijT)+x^ij⋅x^ijT](14)\frac{\partial\boldsymbol{F}_{s}}{\partial\boldsymbol{x}_{i}}=\boldsymbol{J}_{ii}=-k[(1-\frac{r}{|\boldsymbol{x}_{ij}|})({\boldsymbol{I}-\hat{\boldsymbol{x}}_{ij}\cdot{\hat{\boldsymbol{x}}_{ij}^T}})+\hat{\boldsymbol{x}}_{ij}\cdot{\hat{\boldsymbol{x}}_{ij}^T}]\tag{14} ∂xi​∂Fs​​=Jii​=−k[(1−∣xij​∣r​)(I−x^ij​⋅x^ijT​)+x^ij​⋅x^ijT​](14)
将右侧圆括号展开后变形得:
∂Fs∂xi=Jii=−k[I−r∣xij∣(I−x^ij⋅x^ijT)](15)\frac{\partial\boldsymbol{F}_{s}}{\partial\boldsymbol{x}_{i}}=\boldsymbol{J}_{ii}=-k[\boldsymbol{I}-\frac{r}{|\boldsymbol{x}_{ij}|}(\boldsymbol{I}-\hat{\boldsymbol{x}}_{ij}\cdot{\hat{\boldsymbol{x}}_{ij}^T})]\tag{15} ∂xi​∂Fs​​=Jii​=−k[I−∣xij​∣r​(I−x^ij​⋅x^ijT​)](15)
同理,可以推出其余三个小矩阵:
Jii=−Jij=Jjj−Jji(16)\boldsymbol{J}_{ii}=-\boldsymbol{J}_{ij}=\boldsymbol{J}_{jj}-\boldsymbol{J}_{ji}\tag{16} Jii​=−Jij​=Jjj​−Jji​(16)
至此,雅可比矩阵推导完毕,我们需要在每一时步都组装这个矩阵,得到:

∂f∂x=(JiiJijJjiJjj)(10)\frac{\partial\boldsymbol{f}}{\partial\boldsymbol{x}}=\left( \begin{array}{ccc} \boldsymbol{J}_{ii} &\boldsymbol{J}_{ij}\\ \boldsymbol{J}_{ji} & \boldsymbol{J}_{jj}\\ \end{array} \right)\tag{10} ∂x∂f​=(Jii​Jji​​Jij​Jjj​​)(10)

四、数值方法的简单介绍

至此,我们就可以着手去解这个线性方程组了。本人在数值计算方法方面的学习一拖再拖,还没学多少,只知道可以用Jacobi methodGauss–Seidel MethodGradient Descent Method等。关于这些算法网上有大量资料,这里就懒得写了。

五、程序验证

用pixi.js做弹簧的可视化,实现了弹簧质点系统的显式方法,代码地址点这里

在线demo点这里

本文推导的隐式积分法的程序正在coding中…

六、总结

本文主要参考Games201第二讲、Miles Macklin博客里的文章《implict springs》、Matthias Muller等人的《Real Time Physics Class Notes》,其中貌似发现《Real Time Physics Class Notes》里 的一个公式推导的错误,第17页的公式3.32多除了一个l2l^2l2。

2D弹簧质点系统的隐式求解相关推荐

  1. 网格弹簧质点系统模拟(Spring-Mass System by Verlet Integration)附源码

    模拟物体变形最简单的方法就是采用弹簧质点系统(Spring-Mass System),由于模型简单并且实用,它已被广泛应用于服饰.毛发以及弹性固体的动态模拟.对于三角网格而言,弹簧质点系统将网格中的顶 ...

  2. 多级弹簧-质量系统瞬态分析(基于Newmark)

    该程序主要用于实现多自由度下动态系统的隐式分析,计算模型参见多级弹簧-质量系统的瞬态计算(基于中心差分法).下面是具体的Python程序. #coding:utf-8 ""&quo ...

  3. 面向程序员的数据挖掘指南-----第三章:隐式评价和基于物品的过滤算法

    本章会从用户的评价类型开始讨论,包括显式评价(赞一下.踩一脚.五星评价等等)和隐式评价(比如在亚马逊上购买了MP3,我们可以认为他喜欢这个产品). 内容: 显式评价 隐式评价 哪种评价方式更准确? 基 ...

  4. 【JY】结构动力学之显隐式

    因你精彩 即刻关注 "通俗讲动力数值算法" 随着科学研究和工程技术的不断发展,出现了诸如航天飞机.空间站.海洋石油钻井平台等大型或超大型的复杂结构,它们不但自由度高,而且还含有非线 ...

  5. 将隐式神经表示(INR)用于2D图像

    ©PaperWeekly 原创 · 作者 | 张一帆 学校 | 中科院自动化所博士生 研究方向 | 计算机视觉 以图像为例,其最常见的表示方式为二维空间上的离散像素点.但是,在真实世界中,我们看到的世 ...

  6. 图形学笔记(二十)粒子、刚体、流体的模拟—— 欧拉方法、Errors 和 Instability、中点法、自适应步长、隐式欧拉方法、Runge-Kutta方法、刚体与流体模拟(质点法、网格法、MPM)

    图形学笔记(十九)粒子.刚体.流体的模拟-- 欧拉方法.Errors 和 Instability.中点法.自适应步长.隐式欧拉方法.Runge-Kutta方法.刚体与流体模拟(质点法.网格法.MPM) ...

  7. matlab将求解sin隐式解,Matlab隐式符号方程求解和赋值

    近日处理了一个隐式方程的求解,由于方程含有较多的未知数,而且这些参数均是跟实验相关的一些参数,所以,必须得到需要求解的解与 这些参数之间的一个表达式.之前是考虑用的Maple推导求解了该隐私方程,求解 ...

  8. 使用隐式Intent打开系统浏览器的百度网页

    使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其它程序的活动,这使得Android多个应用程序之间的功能共享成为了可能.比如说你的应用程序中需要展示一个网页,这时你没有必要自己去实 ...

  9. Android 通过 “隐式意图” 打开 系统的浏览器 访问 百度页面

    在MainActivity中,通过"隐式意图"打开系统的浏览器访问百度页面: MainActivity页面: package cn.lwx.openbrowser;import a ...

最新文章

  1. 【转】关于HTTP中文翻译的讨论
  2. pcm 采样率转换_44.1KHz够用吗?我们是否需要更高的采样率?
  3. Js+Css打造的红色经典伸缩菜单代码
  4. redhat enterprise linux 5 上安装openoffice3.0 1
  5. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...
  6. 零基础入门Python:基本命令、函数、数据结构
  7. 关于cookie使用的几个方法
  8. Web前端页面设计流程及注意事项,谨记!
  9. C# 设置Excel中的数字字符串格式
  10. 纷杂的Spring-boot-starter: 2 快速 Web 应用 开发 与 spring- boot- starter- web
  11. 《UEFI原理与编程》读书笔记
  12. JQuery将用户输入的数字转换为大写
  13. 无人机+AI人工智能可以实现哪些领域的场景应用?
  14. ZPanel-开源免费的虚拟主机在线管理系统
  15. 北京城市总体总体规划 下载_总体表现
  16. 2014联通见习感悟
  17. HTML5 UI 模板
  18. Oracle的全文检索
  19. 如何处理授权和监督?
  20. 再谈windows下创建特殊文件夹

热门文章

  1. [1032]spark-3.0安装和入门
  2. 自动化运维工具之pxe+kickstart
  3. Jmeter中Python中文乱码
  4. ESXi 7.0 Update 1c中加入的systemMediaSize启动选项
  5. Geek Uninstaller:向流氓软件火力全开,超良心的软件彻底卸载工具
  6. 16.深入浅出:电压比较器——参考《模拟电子技术基础》清华大学华成英主讲
  7. 简单的CTF web密码爆破
  8. 十八 、 View 的工作原理(2)---理解 MeasureSpec
  9. 掌握这些操作技巧,设置USB调试模式不难
  10. Suomi NPP VIIRS夜间灯光遥感数据简介与下载