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]