避免重复调用Interpolation

我想在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]时都会构造插值! 我将如何避免这种情况?

谢谢阅读。


尝试一下这些方面的内容:

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


第一步是用aapprox参数化:

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

通过这个定义, G可以被定义如下:

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

但是,正如在问题中所观察到的,每次调用G都会重新构造插值。 为了避免这种情况的一个方法是重新定义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}]])

对于这个版本的approx cache可以使用Block cache进行本地化,例如:

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

插值功能依然暂时存储的每个不同的值a ,但现在这些后保存的定义被释放Block退出。

有关Mathematica中内存函数的更多信息,请参阅SO问题:

用内存构造函数的最佳方法

Mathematica中的动态编程:如何自动定位和/或清除memoized函数的定义


你可以使用我发布在Mathematica工具包中的什么是CacheIndex的定义。 使用这个函数的一个好处是你可以缓存值或部分代码,而不必定义一个新的函数(尽管我们在这里要与示例一致)。

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

我添加了Pause [3],只是为了清楚说明插值的定义在每个a被计算一次后被缓存。

然后,您可以使用删除CacheIndex中缓存的插值

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

我调整了我的Cache和CacheIndex函数,使它们与WReach使用块中定义的单独符号的想法兼容。 这里不实际的一点是你必须将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}]
]
链接地址: http://www.djcxy.com/p/35515.html

上一篇: Avoid repeated calls to Interpolation

下一篇: How to export graphics in "Working" style environment rather than "Printout"?