Wolfram mathematica 插值的怪异行为插值的顺序选项

Wolfram mathematica 插值的怪异行为插值的顺序选项,wolfram-mathematica,mathematica-8,mathematica-7,Wolfram Mathematica,Mathematica 8,Mathematica 7,在尝试重新创建由NDSolve生成的插值函数时,我遇到了一个非常奇怪的问题,即插值的插值顺序选项。考虑下面的插值函数< /代码>(示例函数): 现在让我们尝试重建它。以下是数据: Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"] data = Transpose@{InterpolatingFunctionGrid[ifun], InterpolatingFunctionValuesOnGrid[ifun]}; 这

在尝试重新创建由
NDSolve
生成的
插值函数时,我遇到了一个非常奇怪的问题,即
插值
插值顺序
选项。考虑下面的<代码>插值函数< /代码>(示例函数):

现在让我们尝试重建它。以下是数据:

Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"]
data = Transpose@{InterpolatingFunctionGrid[ifun], 
   InterpolatingFunctionValuesOnGrid[ifun]};
这是
插值顺序

interpolationOrder = InterpolatingFunctionInterpolationOrder[ifun]
(*=> {3}*)
现在我们尝试构造
插值函数

Interpolation[data, InterpolationOrder -> interpolationOrder];
并获取错误
消息

Interpolation::inord:选项InterpolationOrder->{3}的值应为 是一个非负的机器大小的整数或一组具有 长度等于尺寸数量,1.>>

但如果我们手动指定
插值顺序
,则可以:

Interpolation[data, InterpolationOrder -> {3}]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)
一切正常

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

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

(*=> 
{Protected}
192
112    
0
*)

看来我已经找到了这种行为的原因。这是因为
interpolingfunctioninterpolationorder
函数返回
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}},<>]*)
插值[数据,
插值顺序->开发人员`FromPackedArray@interpolationOrder]
(*=>插值函数[{0,0.516019}},]*)

的确是非常奇怪的行为。差不多

a = {3};
Interpolation[data, InterpolationOrder -> a]
工作正常,
??interpolationOrder
OwnValues[interpolationOrder]
似乎表明
interpolationOrder
正好等于
{3}
。更奇怪的是,这似乎确实有效

interpolationOrder = 2 InterpolatingFunctionInterpolationOrder[ifun]/2
Interpolation[data, InterpolationOrder -> interpolationOrder]

除以2会导致解包,因为有理数无法打包。更多细节见我的回答。
a = {3};
Interpolation[data, InterpolationOrder -> a]
interpolationOrder = 2 InterpolatingFunctionInterpolationOrder[ifun]/2
Interpolation[data, InterpolationOrder -> interpolationOrder]