模拟速度慢的原因
今晚经过测时,发现模拟慢的主要原因有两点:
1. 计算Hessian
2. 一维搜索的过程中,需要反复获取内力。而corotational 模型的内力计算需要极分解。
其中在一般情况下,一维搜索可以快速退出,因此Hessian是主要问题
而在某些情况下(例如,参数很多的时候,第一帧从静止开始),一维搜索需要很多次,而且通常是失败的。主要时间耗在内力计算。
这种情况的原因已经查明,就是一些参数根本不会对形状产生影响,因此解方程Ax = b时矩阵A不满秩,而之前采用LU分解的方法解方程,此方法要求矩阵必须满秩,于是解出的值为无效值(+inf)。改用Eigen的 ColPivHouseholderQR 求解器,此求解器不要求矩阵满秩。此后模拟不再出现计算出错的情况(矩阵A某一行全0时,x的对应分量解出也是0)。修复后发现,一维搜索中获取内力的时间显著减少(在0.05秒以下),估计是之前数据不正常(+inf / nan)导致极分解时间显著升高。
于是主要问题就是Hessian了。下一步打算采用BFGS方法,看看能不能提高速度,同时保证准确性。