NDSolve 中的范数
NDSolve 使用误差估计范数来确定误差容差何时得到满足. 在几乎所有的情况下,范数都已被加权或比例化,以使得若满足误差容差时,它小于1;若不满足误差容差时,它大于1. 这种比例化范数最大的优势之一是写一个给定的方法时可以无需明确提及误差:通过把比例化范数和1相比找到误差满足与否,从而在方法中简化检查误差估计所需的代码.
假设 是向量, 是一个用于计算权重的参考向量(通常 是近似解向量). 那么,应用范数,缩放向量 有如下分量表示式:
其中绝对和相对容差 和 分别根据 和 ,由选项 AccuracyGoal->ag 和PrecisionGoal->pg 来得到.
实际上使用的范数是由设置 NDSolve 中的 NormFunction 选项来决定.
NDSolve 中的 NormFunction 选项
NormFunction 选项可以是任意一个参变量为一个矢量,返回一个标量并满足范数性质的函数. 如果您指定的函数不满足一个范数所需要的性质,NDSolve 几乎肯定会遇到问题,即使给出答案,也是不正确的.
缺省值 Automatic 的意思是 NDSolve 对不同的方法可能使用不同的范数. 大多数方法使用无穷范数,但是DAE中的 IDA 方法使用2-范数,因为这有助于维持价值函数(merit function)的光滑性以便寻找残根. 我们强烈建议您使用带有一个特定值 的 Norm . 因此,您可以使用缩写 NormFunction->p 来替代NormFunction->(Norm[#,p]/Length[#]^(1/p)&). 对于 、 和 最常用的应用已经进行了特别的优化以提高速度.
随着 的增加误差减小的原因是因为范数是通过乘以 进行规一化的,其中 是向量的长度. 这一点在 NDSolve 中尤其重要,因为在许多情况下都在尝试检查对一个函数的近似,点越多,越近似,误差越小.
考虑一个周期函数 的一阶导数在等间距 的网格上的 有限差分 近似,函数由 给出,其中 . 在 Wolfram 语言,这可以很容易地使用 ListCorrelate 来计算.
向量的范数之所以没有多大差别是因为向量的分量数目增加了,所以通常的线性代数范数不能正确地反映收敛性. 通过乘以 的归一化可以正确地反映函数空间的收敛性.
请注意,如果您指定一个函数的选项值,并且您打算把它用在偏微分方程(PDE)或函数逼近中,您应确保在函数中包括适当的规一化.
ScaledVectorNorm
有误差控制的方法需要确定一个步长是否满足局部容许误差. 为了简化该过程,效用函数 ScaledVectorNorm 使用缩放(1) 并计算范数. 该表包括 为特定值时的公式以供参考.
ScaledVectorNorm[p,{tr,ta}][v,u] | 使用缩放(1)计算向量 v 的规一化的 p 范数,其中u 是参考向量, ta 和 tr 是相对和绝对容差 |
ScaledVectorNorm[fun,{tr,ta}][v,u] | 使用缩放(1)计算向量 v 的范数,其中u 是参考向量, ta 和 tr 是相对和绝对容差, fun 是范数函数 |
ScaledVectorNorm[2,{tr,ta}][v,u] | 计算 ,其中 n 是向量 v 和 u 的长度 |
ScaledVectorNorm[∞,{tr,ta}][v,u] | 计算 , ,其中 n 是向量 v 和 u 的长度 |
设置 NDSolve 的方法时,可以通过使用 NDSolve`StateData 对象中的 "Norm" 方法函数,获得合适的 ScaledVectorNorm 对象.