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}},<>]*)
標準の評価シーケンスに従ってBEFORE 呼び出しに置き換える必要があるにもかかわらInterpolationOrder -> interpolationOrder
ず、動作中に動作しない理由を誰でも説明できますか?InterpolationOrder -> {3}
interpolationOrder
{3}
Interpolation
PS この問題はMathematica 7.0.1 と 8.0.1 で発生しますが、Mathematica 5.2 では発生しません。
アップデート
このバグの回避策を 1 つ見つけました。
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
*)