NDSolve 中的范数

NDSolve 使用误差估计范数来确定误差容差何时得到满足. 在几乎所有的情况下,范数都已被加权或比例化,以使得若满足误差容差时,它小于1;若不满足误差容差时,它大于1. 这种比例化范数最大的优势之一是写一个给定的方法时可以无需明确提及误差:通过把比例化范数和1相比找到误差满足与否,从而在方法中简化检查误差估计所需的代码.

假设 是向量, 是一个用于计算权重的参考向量(通常 是近似解向量). 那么,应用范数,缩放向量 有如下分量表示式:

其中绝对和相对容差 分别根据 ,由选项 AccuracyGoal->agPrecisionGoal->pg 来得到.

实际上使用的范数是由设置 NDSolve 中的 NormFunction 选项来决定.

选项名称
缺省值
NormFunctionAutomaticNDSolve 中计算误差估计范数的函数

NDSolve 中的 NormFunction 选项

NormFunction 选项可以是任意一个参变量为一个矢量,返回一个标量并满足范数性质的函数. 如果您指定的函数不满足一个范数所需要的性质,NDSolve 几乎肯定会遇到问题,即使给出答案,也是不正确的.

缺省值 Automatic 的意思是 NDSolve 对不同的方法可能使用不同的范数. 大多数方法使用无穷范数,但是DAE中的 IDA 方法使用2-范数,因为这有助于维持价值函数(merit function)的光滑性以便寻找残根. 我们强烈建议您使用带有一个特定值 Norm . 因此,您可以使用缩写 NormFunction->p 来替代NormFunction->(Norm[#,p]/Length[#]^(1/p)&). 对于 最常用的应用已经进行了特别的优化以提高速度.

比较在100个周期内,用不同的范数计算简谐振子的解总误差:

随着 的增加误差减小的原因是因为范数是通过乘以 进行规一化的,其中 是向量的长度. 这一点在 NDSolve 中尤其重要,因为在许多情况下都在尝试检查对一个函数的近似,点越多,越近似,误差越小.

考虑一个周期函数 的一阶导数在等间距 的网格上的 有限差分 近似,函数由 给出,其中 . 在 Wolfram 语言,这可以很容易地使用 ListCorrelate 来计算.

以下计算了在 区间有16个点的网格上,余弦函数一阶导数近似的误差:
以下计算了在 区间有32个点的网格上,余弦函数一阶导数近似的误差:

非常明显点数较多时,逐点误差显著减小.

这两个向量的范数是同一数量级的:

向量的范数之所以没有多大差别是因为向量的分量数目增加了,所以通常的线性代数范数不能正确地反映收敛性. 通过乘以 的归一化可以正确地反映函数空间的收敛性.

规一化的两个向量的范数反映了朝向真实函数的收敛. 因为近似是一阶的,网格点数增倍,误差差不多减半:

请注意,如果您指定一个函数的选项值,并且您打算把它用在偏微分方程(PDE)或函数逼近中,您应确保在函数中包括适当的规一化.

ScaledVectorNorm

有误差控制的方法需要确定一个步长是否满足局部容许误差. 为了简化该过程,效用函数 ScaledVectorNorm 使用缩放(1) 并计算范数. 该表包括 为特定值时的公式以供参考.

ScaledVectorNorm[p,{tr,ta}][v,u]使用缩放(1)计算向量 v 的规一化的 p 范数,其中u 是参考向量, tatr 是相对和绝对容差
ScaledVectorNorm[fun,{tr,ta}][v,u]使用缩放(1)计算向量 v 的范数,其中u 是参考向量, tatr 是相对和绝对容差, fun 是范数函数
ScaledVectorNorm[2,{tr,ta}][v,u]计算 ,其中 n 是向量 vu 的长度
ScaledVectorNorm[,{tr,ta}][v,u]计算 ,其中 n 是向量 vu 的长度

ScaledVectorNorm.

以下使用 NDSolve 中默认的机器精度误差设置缩放向量的范数:
把样本误差和解参考向量应用于缩放范数:
因为绝对容差项,结果是合理的,即使参考解的某些分量是零:

设置 NDSolve 的方法时,可以通过使用 NDSolve`StateData 对象中的 "Norm" 方法函数,获得合适的 ScaledVectorNorm 对象.

以下是一个 NDSolve`StateData 对象:
以下从 StateData 中获得适当的缩放范数:
以下使用初试条件作为参考向量,将其应用于样本误差向量中: