模拟速度慢的原因

今晚经过测时,发现模拟慢的主要原因有两点:

1. 计算Hessian

2. 一维搜索的过程中,需要反复获取内力。而corotational 模型的内力计算需要极分解。


其中在一般情况下,一维搜索可以快速退出,因此Hessian是主要问题


而在某些情况下(例如,参数很多的时候,第一帧从静止开始),一维搜索需要很多次,而且通常是失败的。主要时间耗在内力计算。

这种情况的原因已经查明,就是一些参数根本不会对形状产生影响,因此解方程Ax = b时矩阵A不满秩,而之前采用LU分解的方法解方程,此方法要求矩阵必须满秩,于是解出的值为无效值(+inf)。改用Eigen的 ColPivHouseholderQR 求解器,此求解器不要求矩阵满秩。此后模拟不再出现计算出错的情况(矩阵A某一行全0时,x的对应分量解出也是0)。修复后发现,一维搜索中获取内力的时间显著减少(在0.05秒以下),估计是之前数据不正常(+inf / nan)导致极分解时间显著升高。


于是主要问题就是Hessian了。下一步打算采用BFGS方法,看看能不能提高速度,同时保证准确性。

posted @ 2014-12-31 22:47  dydx  阅读(228)  评论(0编辑  收藏  举报