Vermeiden Sie wiederholte Aufrufe der Interpolation

8

Ich möchte eine Funktion in Mathematica interpolieren.

Die Funktion hängt von einem Parameter a ab, in der Tat ist es die Umkehrung einer Funktion F , die auch von a abhängt, also bilde ich meine Approximation wie folgt,

%Vor%

jetzt kann ich einfach approx[x] aufrufen, um die Umkehrfunktion an einem Punkt auszuwerten.

Stattdessen würde ich gerne so etwas tun: Definieren Sie eine Funktion, die einen Parameter übernimmt,

%Vor%

Schreiben Sie dann G [x, a], um die Funktion zu bewerten. Ansonsten müsste ich die Interpolation für alle Parameter wiederholen, an denen ich interessiert bin und viele Variablen herumliegen haben. Ich habe versucht, den Aufruf von Interpolation [] in ein Modul zu setzen, aber das konstruiert die Interpolation jedes Mal, wenn ich G [x, a] anrufe! Wie würde ich das vermeiden?

Danke fürs Lesen.

    
mark 16.10.2011, 02:34
quelle

3 Antworten

6

Versuchen Sie etwas in diesen Zeilen:

%Vor%

Sie werden G nur beim ersten Aufruf für jeden bestimmten Wert von a auswerten.

    
Verbeia 16.10.2011, 04:34
quelle
12

Der erste Schritt besteht darin, approx mit a :

zu parametrisieren %Vor%

Mit dieser Definition kann G dann folgendermaßen definiert werden:

%Vor%

Aber, wie in der Frage beobachtet, führt dies dazu, dass die Interpolation jedes Mal rekonstruiert wird, wenn G aufgerufen wird. Eine Möglichkeit, dies zu vermeiden, besteht darin, approx mithilfe von Memoization neu zu definieren:

%Vor%

Nun speichert approx die Interpolationsfunktion für ein beliebiges gegebenes a und vermeidet die Rekonstruktion in nachfolgenden Aufrufen mit demselben a . Natürlich verbraucht dies viel Speicher. Wenn also eine große Anzahl unterschiedlicher Werte von a vorhanden ist, könnte der Speicher knapp werden. Es ist möglich, den von approx verwendeten Cache zu lokalisieren, indem die gespeicherten Werte mit einem anderen Symbol verknüpft werden ( cache in diesem Fall):

%Vor%

Bei dieser Version von approx kann cache mit Block lokalisiert werden, z. B.:

%Vor%

Die Interpolationsfunktionen werden immer noch vorübergehend für jeden einzelnen Wert von a gespeichert, aber jetzt werden diese gespeicherten Definitionen nach dem Beenden von Block freigegeben.

Weitere Informationen zu Funktionen mit Speicher in Mathematica finden Sie in den SO-Fragen:

Der beste Weg, um eine Funktion mit Speicher zu erstellen

Dynamische Programmierung in Mathematica: Wie man die Definitionen der Memo-Funktion automatisch lokalisiert und / oder löscht

    
WReach 16.10.2011 04:30
quelle
6

Sie könnten die Definition von CacheIndex verwenden, die ich in Was ist in Ihrer Mathematica Werkzeugtasche? . Eine gute Sache bei der Verwendung dieser Funktion ist, dass Sie Werte oder Teile des Codes zwischenspeichern können, ohne eine neue Funktion definieren zu müssen (obwohl wir hier in Übereinstimmung mit dem Beispiel vorgehen).

%Vor%

Ich habe Pause [3] hinzugefügt, um klarzustellen, dass die Interpolationsdefinition für jedes a nach der Berechnung einmal gespeichert wird.

Sie können dann die zwischengespeicherten Interpolationswerte in CacheIndex mit

löschen %Vor%

Ich habe meine Cache- und CacheIndex-Funktionen so angepasst, dass sie mit der Idee von WReach kompatibel sind, ein separates Symbol zu verwenden, das in einem Block definiert ist. Eine Sache, die hier nicht praktisch ist, ist, dass Sie Hold-Attribute für das als Cache verwendete Symbol definieren müssen, aber die Idee ist immer noch interessant.

Hier ist die Definition von CacheSymbol

%Vor%

Sie können diese Implementierung mit den folgenden Anweisungen testen, in einem realen Beispiel wäre der Cache in einem Block definiert.

%Vor%

Hier ist die Definition von CacheSymbolIndex

%Vor%

Sie können diese Implementierung mit den folgenden Anweisungen testen, in einem realen Beispiel wäre der Cache in einem Block definiert.

%Vor%

und ähnlich zum Beispiel von WReach hätten wir

%Vor%     
faysou 16.10.2011 14:42
quelle