8

Mathematica で関数を補間したい。

関数はパラメータ に依存しますa。実際には、Fこれも に依存する関数の逆関数なaので、次のように近似を作成します。

approx = Interpolation[Table[{F[0.1 n, a], 0.1 n}, {n, -100, 100}]]

approx[x]これで、ある時点で逆関数を評価するために簡単に呼び出すことができます。

代わりに、次のようなことをしたいと思います: パラメータを取る関数を定義し、

G[x_,a_] = "construct the interpolating function,
            and return the value of the function at x"

次に、G[x,a] を書き、関数を評価します。そうしないと、関心のあるすべてのパラメーターに対して補間を繰り返す必要があり、多くの変数が横たわっています。Interpolation[] 呼び出しをモジュール内に配置しようとしましたが、G[x,a] を呼び出すたびに補間を構築するだけです! どうすればこれを回避できますか?

読んでくれてありがとう。

4

3 に答える 3

12

最初のステップは、次のようにパラメータ化approxすることaです。

approx[a_] := Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]

この定義により、次のGように定義できます。

G[x_, a_] := approx[a][x]

Gしかし、質問で観察されたように、これは呼び出されるたびに補間を再構築することになります。これを回避する1つの方法は、approxメモ化を使用して再定義することです。

m: approx[a_] := m = Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]

ここで、approx任意の与えられたの補間関数を保存aし、同じでの後続の呼び出しでの再構築を回避しaます。もちろん、これはメモリを使い果たすため、の個別の値が多数ある場合a、メモリが不足する可能性があります。approx保存された値を別のシンボル(cacheこの場合)に関連付けることにより、使用されるキャッシュをローカライズすることができます。

approx[a_] := cache[a] /.
  _cache :> (cache[a] = Interpolation[Table[{F[0.1` n,a],0.1` n},{n,-100,100}]])

このバージョンのapproxcacheを使用してローカライズできますBlock。例:

Block[{cache}
, Table[G[x, a], {x, 0, 5}, {a, 0, 1, 0.1}]
]

補間関数は、の個別の値ごとに一時的に保存されますがa、保存された定義はBlock終了後に解放されます。

Mathematicaのメモリを備えた関数の詳細については、SOの質問を参照してください。

メモリを使用して関数を作成するための最良の方法

Mathematicaでの動的計画法:メモ化された関数の定義を自動的にローカライズおよび/またはクリアする方法

于 2011-10-16T04:30:24.197 に答える
6

これらの線に沿って何かを試してください:

G[a_]:=G[a]=Interpolation[Table[{F[0.1 n, a], 0.1 n}, {n, -100, 100}]]

G[0.2]  (* particular value of G[a] *)

G[0.2][0.3] (* the value you want *)

Gの特定の値ごとに、初めて呼び出すときにのみ評価しますa

于 2011-10-16T04:34:38.707 に答える
6

Mathematica ツール バッグの中身は?に投稿したCacheIndexの定義を使用できます。. この関数を使用する利点の 1 つは、新しい関数を定義しなくても、値またはコードの一部をキャッシュできることです (ただし、ここでは、例に合わせるためです)。

G[x_,a_] :=
   CacheIndex[a,
      Pause[3];
      Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
   ][x];

Pause[3] を追加したのは、Interpolation の定義が一度計算された後に a ごとにキャッシュされることを明確にするためです。

次に、CacheIndex でキャッシュされた Interpolation 値を削除できます。

DeleteCachedValues[CacheIndex] (*or*) 
DeleteCachedValues[CacheIndex,1].

Cache 関数と CacheIndex 関数を調整して、ブロックで定義された個別のシンボルを使用するという WReach の考え方と互換性を持たせました。ここで実用的でないことの 1 つは、キャッシュとして使用されるシンボルに Hold 属性を定義する必要があることですが、アイデアは興味深いものです。

これがCacheSymbolの定義です

SetAttributes[CacheSymbol,HoldAll];
CacheSymbol[cacheSymbol_,expr_]:=cacheSymbol[expr]/.(_cacheSymbol:>(cacheSymbol[expr]=expr));

次の手順を使用してこの実装をテストできます。実際の例では、キャッシュはブロックで定義されます。

ClearAll[cache]
SetAttributes[cache,HoldFirst] 
CacheSymbol[cache,Pause[3];2+2]
?cache
CacheSymbol[cache,Pause[3];2+2]

これがCacheSymbolIndexの定義です

SetAttributes[CacheIndexSymbol,HoldAll];
CacheIndexSymbol[cacheSymbol_,index_,expr_]:=cacheSymbol[index,expr]/.(_cacheSymbol:>(cacheSymbol[index,expr]=expr));

次の手順を使用してこの実装をテストできます。実際の例では、キャッシュはブロックで定義されます。

ClearAll[cache] 
SetAttributes[cache,HoldRest]
CacheIndexSymbol[cache,2+2,Pause[3];2+2]
?cache
CacheIndexSymbol[cache,2+2,Pause[3];2+2]

WReach の例と同様に、

G[x_,a_] :=
   CacheIndexSymbol[cache,a,
      Print["Caching"];
      Interpolation[Table[{F[0.1 n,a],0.1 n},{n,-100,100}]]
   ][x]

Block[{cache}, 
   SetAttributes[cache,HoldRest];
   Table[G[x, a], {x, 0, 5}, {a, 0, 1, 0.1}]
]
于 2011-10-16T14:42:58.287 に答える