因为初学simulation,还只会写一个弹簧质点系统,就用这个把最近学习的数值方法都实现了一遍。
目前实现的显式时间积分器:Explicit Euler(貌似非常不稳定),Semi-implicit Euler, Midpoint法和 Runge-Kutta (RK4) 法。
隐式时间积分器迭代解线性方程组:Jacobi迭代,Gauss-Seidel迭代和 Conjugate Gradients(还在调试中)。
隐式法最直观的感受就是stiffness取到很大也不会炸,而且damping很小的时候弹簧的振荡会很快收敛。但局部爆炸后矩阵没法收敛,整个系统会同时爆炸。
加了颜色指示后很容易看清楚受力情况(红色拉伸,绿色收缩)和振荡。
求导和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