CVODE常微分方程求解器(变阶变步长多步法)
CVODESolver
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| AllocateResources | 1 | 分配所有内部资源(不依赖初值)。 |
| EstimateInitialStep | 1 | 估计初始步长(用户指定优先,否则基于初值规模)。 |
| ComputeErrorWeights | 1 | 计算误差权重 w_i = 1 / (rtol*|y_i| + atol_i)。 |
| AttemptStep | 1 | 尝试前进一步。成功则提交历史并返回 Success; 误差过大返回 TestFail(hNext 为建议的更小步长); 不收敛/线性求解失败返回相应状态且不提交。 |
| Commit | 1 | 提交一步成功结果到历史。 |
| Predict | 1 | 计算预测值 yPred(写入 yPred)。 Adams:对过去 f 做多项式积分;BDF:对过去 y 做多项式外推。 历史点不足时自动降阶使用可用点数。 |
| EstimateBDFFrror | 1 | 估计 BDF(q) 的局部截断误差(加权 RMS 范数)。 LTE_i = C_{q+1} · h^{q+1} · q! · DD_q[f]_i 其中 DD_q[f] 为 f 在节点 (tNew, t_n, ..., t_{n-q+1}) 上的 q 阶差商, C_{q+1} = (1/(q+1)!) · Σ_{k=0}^{q} α_k·(-k)… |
| EstimateAdamsError | 1 | 估计 Adams(q) 正确器(阶 p=q+1)的局部截断误差(加权 RMS 范数)。 LTE_i = C_AM · h^{p+1} · p! · DD_p[f]_i 其中 DD_p[f] 为 f 在节点 (tNew, tHist(0..q)) 上的 p 阶差商, C_AM = (-1)^p/(p+1)! · [1 - (p+1)·Σ_{j=0… |
| ComputeNumericalJacobian | 1 | 前向差分数值 Jacobian:J(i,j) = (f_i(y+e_j) - f_i(y)) / e_j。 |
| BuildAndFactorizeSystem | 1 | 构造 A = I - gamma*J 并 LU 分解。 |
| LagrangeBasisValue | 1 | Lagrange 基函数 L_j(x) = Π_{m≠j} (x - x_m)/(x_j - x_m)。 |
| LagrangeBasisDeriv | 1 | Lagrange 基函数在 x 处的导数(乘积法则形式,对任意 x 包括节点均正确)。 L'_j(x) = Σ_{k≠j} [ 1/(x_j - x_k) · Π_{m≠j,k} (x - x_m)/(x_j - x_m) ] 注意:原公式 L_j(x)·Σ_{m≠j}1/(x-x_m) 在 x 与其它节点重合时因 L_j(x)=0 而给出错误结果… |
| Factorial | 1 | 小整数阶乘(q ≤ BDF_MAX_ORDER=5,足够)。 |
| IntegrateLagrangeBasis | 1 | ∫_{a}^{b} L_j(τ) dτ,通过展开单根多项式后逐项积分。 |
| PolyFromRoots | 1 | 由根构造多项式系数(升幂):Π (τ - root)。 |
| PolyMul | 1 | 多项式乘法(卷积,升幂)。 |
| PolyIntegrate | 1 | 多项式不定积分(升幂,常数项为 0)。 |
| PolyEval | 1 | Horner 法求值多项式。 |
| Initialize | 1 | |
| Step | 1 | |
| Integrate | 1 | |
| SetJacobianFunction | 1 | |
| SetAbsoluteTolerance | 1 | |
| SetRelativeTolerance | 1 | |
| SetMaxStep | 1 | |
| SetMinStep | 1 | |
| Dispose | 1 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| CurrentTime | 1 | |
| CurrentState | 1 | |
| CurrentStep | 1 | |
| CurrentOrder | 1 | |
| TotalSteps | 1 | |
| RHSFunctionEvaluations | 1 | |
| NewtonIterations | 1 | |
| LinearSolves | 1 |
04 Members
分配所有内部资源(不依赖初值)。
估计初始步长(用户指定优先,否则基于初值规模)。
计算误差权重 w_i = 1 / (rtol*|y_i| + atol_i)。
Double, Double, Double)尝试前进一步。成功则提交历史并返回 Success; 误差过大返回 TestFail(hNext 为建议的更小步长); 不收敛/线性求解失败返回相应状态且不提交。
Double, NVector)提交一步成功结果到历史。
计算预测值 yPred(写入 yPred)。 Adams:对过去 f 做多项式积分;BDF:对过去 y 做多项式外推。 历史点不足时自动降阶使用可用点数。
估计 BDF(q) 的局部截断误差(加权 RMS 范数)。 LTE_i = C_{q+1} · h^{q+1} · q! · DD_q[f]_i 其中 DD_q[f] 为 f 在节点 (tNew, t_n, ..., t{n-q+1}) 上的 q 阶差商, C{q+1} = (1/(q+1)!) · Σ_{k=0}^{q} α_k·(-k)^{q+1} 为 BDF 误差常数(α 为 BDF 系数)。
Int32, Double, Double)估计 Adams(q) 正确器(阶 p=q+1)的局部截断误差(加权 RMS 范数)。 LTE_i = C_AM · h^{p+1} · p! · DD_p[f]_i 其中 DD_p[f] 为 f 在节点 (tNew, tHist(0..q)) 上的 p 阶差商, C_AM = (-1)^p/(p+1)! · [1 - (p+1)·Σ{j=0}^{p-1} β̄j·j^p], β̄j = Icoeff(j)/Icoeff(0),Icoeff(j)=∫{t_n}^{tNew} L_j dτ。 调用前需保证 _histCount >= q+1(即拥有 q+1 个历史 f 点)。
Double, NVector)前向差分数值 Jacobian:J(i,j) = (f_i(y+e_j) - f_i(y)) / e_j。
Double)构造 A = I - gamma*J 并 LU 分解。
Double(), Int32, Double)Lagrange 基函数 L_j(x) = Π_{m≠j} (x - x_m)/(x_j - x_m)。
Double(), Int32, Double)Lagrange 基函数在 x 处的导数(乘积法则形式,对任意 x 包括节点均正确)。 L'j(x) = Σ{k≠j} [ 1/(x_j - x_k) · Π_{m≠j,k} (x - x_m)/(x_j - x_m) ] 注意:原公式 L_j(x)·Σ_{m≠j}1/(x-x_m) 在 x 与其它节点重合时因 L_j(x)=0 而给出错误结果,BDF 中 x=tNew 正是节点,故此处改用乘积法则。
Int32)小整数阶乘(q ≤ BDF_MAX_ORDER=5,足够)。
Double(), Int32, Double, Double)∫_{a}^{b} L_j(τ) dτ,通过展开单根多项式后逐项积分。
Double())由根构造多项式系数(升幂):Π (τ - root)。
Double(), Double())多项式乘法(卷积,升幂)。
Double())多项式不定积分(升幂,常数项为 0)。
Double(), Double)Horner 法求值多项式。
Double, NVector)Double)Double, NVector)Double)Double)Double)Double)