Interpolation的InterpolationOrder选项的奇怪行为

Ale*_*kov 4 wolfram-mathematica mathematica-8 mathematica-7

当试图重新创建一个InterpolationFunctionNDSolve我面临非常奇怪的问题与InterpolationOrder选项Interpolation.请考虑以下内容InterpolationFunction(文档中的示例函数):

ifun = First[
  x /. NDSolve[{x'[t] == Exp[x[t]] - x[t], x[0] == 1}, x, {t, 0, 10}]]
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试重建它.这是数据:

Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"]
data = Transpose@{InterpolatingFunctionGrid[ifun], 
   InterpolatingFunctionValuesOnGrid[ifun]};
Run Code Online (Sandbox Code Playgroud)

这是InterpolationOrder:

interpolationOrder = InterpolatingFunctionInterpolationOrder[ifun]
(*=> {3}*)
Run Code Online (Sandbox Code Playgroud)

现在我们尝试构建InterpolatingFunction:

Interpolation[data, InterpolationOrder -> interpolationOrder];
Run Code Online (Sandbox Code Playgroud)

并得到错误Message:

Interpolation :: inord:选项的值InterpolationOrder - > {3}应该是一个非负的机器大小的整数或一个长度等于维数的整数列表,1.>>

但如果我们InterpolationOrder用手指定,那就没关系:

Interpolation[data, InterpolationOrder -> {3}]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么InterpolationOrder -> interpolationOrder在工作时不起作用InterpolationOrder -> {3}虽然interpolationOrder必须用{3}BEFORE Interpolation根据标准评估序列进行调用来替换?

PS问题出现在Mathematica 7.0.1和8.0.1中,但不出现在Mathematica 5.2中.

UPDATE

我找到了这个bug的一个解决方法:

Interpolation[data, 
 ToExpression@ToString[InterpolationOrder -> interpolationOrder]]
Run Code Online (Sandbox Code Playgroud)

按预期工作.

似乎表达式通过评估生成Rule[InterpolationOrder,interpolationOrder]并且Rule[InterpolationOrder,{3}]具有不同的内部结构,尽管它们是相同的:

ByteCount // Attributes
ByteCount[InterpolationOrder -> interpolationOrder]
ByteCount[InterpolationOrder -> {3}]
Order[InterpolationOrder -> interpolationOrder, 
 InterpolationOrder -> {3}]

(*=> 
{Protected}
192
112    
0
*)
Run Code Online (Sandbox Code Playgroud)

Ale*_*kov 5

似乎我找到了这种行为的原因.这是因为InterpolatingFunctionInterpolationOrder函数返回PackedArray:

Developer`PackedArrayQ@InterpolatingFunctionInterpolationOrder[ifun]
(*=> True*)
Run Code Online (Sandbox Code Playgroud)

我们可以转化{3}PackedArray自己:

Interpolation[data, 
  InterpolationOrder -> Developer`ToPackedArray@{3}];

(*=> gives the error Message*)
Run Code Online (Sandbox Code Playgroud)

所以原因是Interpolate不支持PackedArray作为InterpolationOrder期权的价值.解决方法是手动解压缩:

Interpolation[data, 
 InterpolationOrder -> Developer`FromPackedArray@interpolationOrder]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)
Run Code Online (Sandbox Code Playgroud)