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}},<>]*)

標準の評価シーケンスに従って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
*)
4

2 に答える 2

5

私はこの行動の理由を見つけたようです。InterpolatingFunctionInterpolationOrder関数が返すためですPackedArray

Developer`PackedArrayQ@InterpolatingFunctionInterpolationOrder[ifun]
(*=> True*)

{3}私たちは自分自身に変換できますPackedArray

Interpolation[data, 
  InterpolationOrder -> Developer`ToPackedArray@{3}];

(*=> gives the error Message*)

その理由は、それがオプションの値としてInterpolateサポートされていないためです。回避策は、手動で解凍することです。PackedArrayInterpolationOrder

Interpolation[data, 
 InterpolationOrder -> Developer`FromPackedArray@interpolationOrder]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)
于 2011-10-10T10:13:27.330 に答える
2

確かに非常に奇妙な行動。何かのようなもの

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

と の両方が正常に動作し、 と??interpolationOrderがちょうど等しいことOwnValues[interpolationOrder]を示しているようです。さらに奇妙なのは、これが機能しているように見えることですinterpolationOrder{3}

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