在尝试重新创建由NDSolve生成的NDSolve时,NDSolve的InterpolationOrder选项遇到了非常奇怪的问题。考虑下面的InterpolationFunction (一个示例函数从文件中):
ifun = First[
  x /. NDSolve[{x'[t] == Exp[x[t]] - x[t], x[0] == 1}, x, {t, 0, 10}]]现在让我们试着重建它。以下是数据:
Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"]
data = Transpose@{InterpolatingFunctionGrid[ifun], 
   InterpolatingFunctionValuesOnGrid[ifun]};这是InterpolationOrder
interpolationOrder = InterpolatingFunctionInterpolationOrder[ifun]
(*=> {3}*)现在我们尝试构造InterpolatingFunction
Interpolation[data, InterpolationOrder -> interpolationOrder];并获得错误Message:
插值::inord:选项InterpolationOrder -> {3}的值应该是非负机器大小的整数或长度等于维数的整数列表,1. >>。
但是,如果我们手动指定InterpolationOrder,则可以:
Interpolation[data, InterpolationOrder -> {3}]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)有人能解释为什么InterpolationOrder -> interpolationOrder不能工作,而InterpolationOrder -> {3}工作,尽管interpolationOrder必须用{3}替换,然后才能调用Interpolation (根据标准评价序列 )
这个问题出现在Mathematica 7.0.1和8.0.1中,而不在Mathematica5.2中。
更新
我找到了一个解决这个问题的方法:
Interpolation[data, 
 ToExpression@ToString[InterpolationOrder -> interpolationOrder]]按预期工作。
尽管Rule[InterpolationOrder,interpolationOrder]和Rule[InterpolationOrder,{3}]的计算结果是相同的,但它们的内部结构似乎不同:
ByteCount // Attributes
ByteCount[InterpolationOrder -> interpolationOrder]
ByteCount[InterpolationOrder -> {3}]
Order[InterpolationOrder -> interpolationOrder, 
 InterpolationOrder -> {3}]
(*=> 
{Protected}
192
112    
0
*)发布于 2011-10-10 10:13:27
我似乎找到了这种行为的原因。这是因为InterpolatingFunctionInterpolationOrder函数返回PackedArray
Developer`PackedArrayQ@InterpolatingFunctionInterpolationOrder[ifun]
(*=> True*)我们可以自己将{3}转换为PackedArray:
Interpolation[data, 
  InterpolationOrder -> Developer`ToPackedArray@{3}];
(*=> gives the error Message*)因此,原因是Interpolate不支持PackedArray作为InterpolationOrder选项的值。解决办法是手动解压它:
Interpolation[data, 
 InterpolationOrder -> Developer`FromPackedArray@interpolationOrder]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)发布于 2011-10-10 10:13:53
非常奇怪的行为。有点像
a = {3};
Interpolation[data, InterpolationOrder -> a]工作正常,??interpolationOrder和OwnValues[interpolationOrder]似乎都表明interpolationOrder与{3}是相等的。更奇怪的是,这似乎确实奏效了。
interpolationOrder = 2 InterpolatingFunctionInterpolationOrder[ifun]/2
Interpolation[data, InterpolationOrder -> interpolationOrder]https://stackoverflow.com/questions/7710168
复制相似问题