当尝试重新创建一个InterpolationFunction
由我制作的选项时,NDSolve
我遇到了非常奇怪的问题。考虑以下内容(文档中的示例函数):InterpolationOrder
Interpolation
InterpolationFunction
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
*)