本文来自:cv_guide.pdf
2.1 IVP solution
IVP问题的形式:
The methods used in cvode are variable-order, variable-step multistep methods, based on formulas
of the form
CVODE使用的是变阶,变步长的多步迭代方法,最基本的形式是2.2
nonstiff 问题,使用Adms迭代方法
stiff问题,使用BDF方法。
2.2中,an一开始是等于-1,这个值很大,会导致误差很大。这也是为什么开始计算的时候,会迭代好多次的原因。
无论是Adms形式还是BDF形式,非线性系统通过多步的迭代,最后变成两种形式来近似解决:
- roodfinding形式:2.3
- fixed-point形式:2.4
CVODE默认是使用线性系统的牛顿迭代法来对线性系统进行迭代
CVODE中,求解非线性系统的线性方法分为两种类型:
- a direct family:g direct linear solvers for dense, banded, or sparse matrices
- spils family:scaled preconditioned iterative (Krylov) linear solvers
对于大规模的stiff问题(比如机器人问题),direct方法通常不能用,最好的选择是使用组合了BDF的带预测器的Krylov方法。
CVODE对于误差的控制,是基于当前的值和设置的atol,rtol计算的。根据2.7,W<=1,则表示误差比较小,可以接受,可以进行下次迭代。因此,atol,rtol越大,计算的速度就越快,但是精度就越低。
为避免矩阵计算的消耗问题,矩阵M(公式2.5中的)和预测矩阵P,会尽量少地更新。只在有需要的时候更新。
error test 是检测误差是否过大的测试,需要在当前步更改步长再次计算。
迭代的时候,CVODE会对迭代过程中的误差进行控制,要求本次迭代的结果和开始点的数值
的误差保持在一定范围内。这个范围用户也可以设置。
(那是不是说,如果我不要求太高的精度,而要求高速计算,是不是可以放大范围,从而减少迭代的次数?)
误差检测不通过,会导致在当前步进行步长更改后再次迭代。这个过程重复几次后,误差测试还是不通过,就会停止计算了。这种情况很容易出现在ATOL,RTOL很小,或者min step 比较大的时候,报的错误类似:
At t= 0.44 and h = 0.002,the error test failed repeatedly or with |h| = hmin
用户可以提供雅可比,如果没有,CVODE会根据一定的规则自定构建一个近似的雅可比。
CVODE对迭代过程的误差有控制,会要求||LTE|<=1(LTE:local test error的缩写?)
error test失败,会导致在当前点,进行补偿的变小后再次计算。多次失败之后,就会报错。
2.2 Preconditioning
非线性系统的线性求解法,如果没有预测器,一般很难求解。
而预测器都是跟待求解的问题高度相关的,比较难在快速收敛和计算成本两个点上同时表现优秀。
预测器分为左式,右式和左右式。
一般建议使用只使用左式预测,或只使用右式预测,不要两个一起用。
CVODE典型的预测器是基于对雅可比的近似估计。
我们发现,同样的Newton-Krylov iteration,如果使用了预测器,即使预测器十分粗糙,效果也远远比没有用好得多。
2.3 BDF stability limit detection
2.4 Rootfinding
3.2 CVODE organization
Additionally, cvode includes the diagonal linear solver interface, cvdiag, that creates an internally
generated diagonal approximation to the Jacobian.