Ale*_*kov 4 wolfram-mathematica mathematica-8 mathematica-7
当试图重新创建一个InterpolationFunction由NDSolve我面临非常奇怪的问题与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中.
我找到了这个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)
似乎我找到了这种行为的原因.这是因为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)