Homework 1: 多种显式/隐式方法求解弹簧质点系统

因为初学simulation,还只会写一个弹簧质点系统,就用这个把最近学习的数值方法都实现了一遍。
目前实现的显式时间积分器:Explicit Euler(貌似非常不稳定),Semi-implicit Euler, Midpoint法和 Runge-Kutta (RK4) 法。
隐式时间积分器迭代解线性方程组:Jacobi迭代,Gauss-Seidel迭代和 Conjugate Gradients(还在调试中)。

隐式法最直观的感受就是stiffness取到很大也不会炸,而且damping很小的时候弹簧的振荡会很快收敛。但局部爆炸后矩阵没法收敛,整个系统会同时爆炸。
gif
加了颜色指示后很容易看清楚受力情况(红色拉伸,绿色收缩)和振荡。

求导和Jacobi矩阵的部分参考了:https://forum.taichi-lang.cn/t/hw-0-5/707/3
解线性方程部分参考了:https://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf

代码托管在:https://github.com/g1n0st/GAMES201/tree/master/hw1

7.1 Update
写了测试代码和benchmark,用taichi导出了视频,不同方法对比起来看差异还是很大的。

演示和数据分析slide见:https://github.com/g1n0st/GAMES201/blob/master/hw1/analysis/slide.pptx

测试代码见:https://github.com/g1n0st/GAMES201/tree/master/hw1/analysis/test_codes

10 个赞

很棒呀!!!期待conjugate gradients的结果。

可以看出implicit方法自带numerical damping,这一方面使得模拟更稳定,另一方面也会间接造成能量损失。在很多游戏或者影视的应用里面,大家还是更喜欢稳定的模拟,所以有时候更青睐implicit方法。

2 个赞