目录
[1 单粒子模拟](#1 单粒子模拟)
[1.1 欧拉方法](#1.1 欧拉方法)
[1.2 不稳定性及其改进](#1.2 不稳定性及其改进)
[1.2.1 误差(Errors)](#1.2.1 误差(Errors))
[1.2.2 不稳定性(Instability)](#1.2.2 不稳定性(Instability))
[1.2.3 解决不稳定性(Combating Instability)](#1.2.3 解决不稳定性(Combating Instability))
[(3)隐式欧拉方法(Implicit Euler Method)](#(3)隐式欧拉方法(Implicit Euler Method))
[(4)龙格-库塔 系列方法](#(4)龙格-库塔 系列方法)
[(5)非物理(Position-Based / Verlet Integration)](#(5)非物理(Position-Based / Verlet Integration))
[2 刚体模拟(Rigid Body Simulation)](#2 刚体模拟(Rigid Body Simulation))
[3 流体仿真(Fluid Simulation)](#3 流体仿真(Fluid Simulation))
[3.1 质点法vs网格法](#3.1 质点法vs网格法)
[3.2 材质点方法(Material Point Method (MPM))](#3.2 材质点方法(Material Point Method (MPM)))
1 单粒子模拟
我们模拟出一个粒子的运动
也就是我们想知道:一个物体在t0的时候在某个位置,在t1时刻的时候它在哪里呢?
假设一个理想情况:粒子处在一个速度场中:只要知道粒子的位置,就可以知道它的速度。
在任何一个位置、任何一个时间都知道速度:定义为位移的一阶导数
这个写法叫做常微分方程(单变量微分方程,其中只存在对一个量的导数)。
定义起始点为x0,给出任意的时间t都能解出位置。
那么该怎么解出这个位置呢?
1.1 欧拉方法
欧拉方法:在时间上进行离散化,用上一个时刻的数值来算下一个时刻的数值,步长很小
1.2 欧拉方法的不稳定性及其改进
1.2.1 误差(Errors)
步长Δt越小,误差越小,就更精确。反之,补偿越大,模拟就越不准确。
1.2.2 不稳定性(Instability)
螺旋形出现的问题:无论取多大的步长,都不可能沿着螺旋形的轨迹走,一定会离开螺旋形。
下面的放射状图形,越模拟和实际的结果相距越远,直到无限远。
一切用数值解解微分方程都会遇到的问题:误差、不稳定性
不稳定性这个问题比较大,有可能会在实际中导致一些难以解释的问题,例如下面这个小轿车撞上摩托车之后在空中进行的一些迷惑翻滚运动。
1.2.3 解决不稳定性(Combating Instability)
(1)中点法
原本在速度场中,从起始点应该往a方向走。
但现在不使用指向a的速度方向,而使用起始点和a点连线的中点b点处的速度方向。
此时用b这个速度方向来更新起始点的位置,会发现更新后,当前点到达了c点。
实际上,这个方法用了两次欧拉方法。
第一次用欧拉方法是为了得到中点的速度,而第二次用是为了算出结果。
观察公式可知:中点法更加准确的原因在于它有个Δt的二次方项,能模拟出类似抛物线的形状,能比一次的线性模型更准确一点。
(2)自适应改变步长
有人想要结合a点和c点的信息。
先按照欧拉方法计算出一个xT
再把Δt分成两半,应用两次欧拉方法得到xT/2
如果xT 和xT/2 相差很大,那就说明xT/2更接近真实的情况,此时,继续细分Δt,逼近真实值。
如果xT 和xT/2 相差不大,那就说明目前计算出的下一个点的位置精确度已经足够,可以进行下一步计算。
(3)隐式欧拉方法(Implicit Euler Method)
也叫:后向欧拉方法
用下一个时刻的速度(未知量)、下一时刻的加速度(未知量)来计算下一个时刻的位移和速度。
最后形式是一个方程组,需要解出来,一般用求根公式或者优化方法来解,这样会慢很多。但隐式欧拉方法的稳定性比较好。
如何定义一个方法的稳定性和稳定程度?
局部截断误差:每一步的误差
整体累积误差
人们认为研究这两个数值没意义,应该研究这两个误差的阶,也就是和误差如何随着Δt的减小而减少的。
直接给结论:隐式欧拉方法的全局误差是一阶的。
一阶:如果把h减小一半,那么期望得到的误差也减小到一半
二阶:h小一半,得到的误差减小到1/4
···
阶数越高越稳定
(4)龙格-库塔 系列方法
解常微分方程很好的一类方法。
其中,RK4是一个4阶的方法,这个应用比较广泛。
相当于中点法的一个推广,里面的权重经过精心设计。
想要深入学习可以学习数值分析课程。
(5)非物理(Position-Based / Verlet Integration)
这种的方法直接改变粒子的位置
2 刚体模拟(Rigid Body Simulation)
刚体不会发生形变,会让其内部所有的点按照同一种情况运动,可以把刚体看作一个粒子。在刚体模拟中,在原本的位置和速度的基础上,会关注更多的量:
位置、朝向、速度、角速度······
3 流体仿真(Fluid Simulation)
主要思想:
水体是由许多、不可压缩的、刚体小球组成的,需要模拟出每个小球的位置。
认为水在任何一个位置都不可以压缩
给任何一个时刻,小球分布的位置,如果任何一个地方的密度和原本水的密度不一样,那么就通过移动小球,修正这种密度。
我们需要知道:任何一个点的密度对任何小球位置的梯度。
然后进行梯度下降方法来修正。
3.1 质点法vs网格法
模拟大规模物质的两个思路:质点法(拉格朗日方法) vs网格法(欧拉方法)
网格法是盯着一个固定的空间,关注每个空间的密度变化等。
3.2 材质点方法(Material Point Method (MPM))
结合了质点法和网格法
首先认为不同的粒子具有一些属性:密度、质量,这些信息存在质点上
融化的过程在网格中完成。
然后将网格中的数据写回给粒子。