4

当尝试重新创建一个InterpolationFunction由我制作的选项时,NDSolve我遇到了非常奇怪的问题。考虑以下内容(文档中的示例函数):InterpolationOrderInterpolationInterpolationFunction

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

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

但是如果我们InterpolationOrder手动指定就OK了:

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

谁能解释为什么InterpolationOrder -> interpolationOrder在工作时不起作用,InterpolationOrder -> {3}尽管必须根据标准评估顺序在调用之前interpolationOrder替换?{3}Interpolation

PS 该问题出现在Mathematica 7.0.1 和 8.0.1 中,但不在Mathematica 5.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
*)
4

2 回答 2

5

看来我已经找到了这种行为的原因。这是因为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-10T10:13:27.330 回答
2

确实非常奇怪的行为。就像是

a = {3};
Interpolation[data, InterpolationOrder -> a]

工作正常,两者??interpolationOrderOwnValues[interpolationOrder]似乎都表明它interpolationOrder等于{3}. 更奇怪的是,这似乎确实有效

interpolationOrder = 2 InterpolatingFunctionInterpolationOrder[ifun]/2
Interpolation[data, InterpolationOrder -> interpolationOrder]
于 2011-10-10T10:13:53.803 回答