2016-05-02 10 views
0

Problem: Ich möchte eine Funktion f(t,N) numerisch integrieren, die als eine lineare Kombination von N anderen bekannten Funktionen g_1(t), ..., g_N(t) geschrieben werden kann.Lineare Kombination von Funktionsobjekten in Python

Meine Lösung I: Ich kenne die Funktionen g_i und auch die Koeffizienten, so dass meine ursprüngliche Idee war, einen Zeilenvektor der Koeffizienten und einen Spaltenvektor mit den Lambda-Funktionen g_i und verwenden Sie dann np.dot für das innere Produkt zu schaffen Holen Sie sich das gewünschte Funktionsobjekt. Leider können Sie nicht einfach zwei Funktionsobjekte hinzufügen oder ein Funktionsobjekt mit einem Skalar multiplizieren.

Meine Lösung II: Natürlich habe ich etwas tun kann, wie (im Grunde definieren Punkt weise, was ich will):

def f(t,N,a,g): 
""" 
a = numpy array of coefficients 
g = numpy array of lambda functions corresponding to functions g_i 
""" 
    res = 0 
    for i in xrange(N): 
     res += a[i] * g[i](t) 
    return res 

Aber die for Schleife ist natürlich nicht sehr groß, vor allem, wenn:

  1. ich brauche diese Funktion bei vielen vielen Zeit laufen die Schritte t
  2. ich diese Funktion f in eine numerische Integration Routine wie scipy.integrate.quad passieren.
+0

Wenn Ihre 'g [i]' Polynome sind, können Sie sie im Voraus leicht mit einer Polynomklasse kombinieren. Aber wenn das nicht der Fall ist, dann denke ich, dass du daran festhältst, sie für jedes "t" in eine Schleife zu schreiben. –

+0

Wie wäre es mit NUMEXPR, Cython, Theano oder Sympy? –

+0

@ PM2Ring: Sie sind Sinus und Cosinus und bilden eine verkürzte Basis von L^2 [0,1]. Also gibt es wirklich keine Möglichkeit, ein Array von Lambda-Funktionen auf einmal aufzurufen? – sbm

Antwort

0

kurz:

In Cython könnten Sie beschleunigen Indizierung memoryviews verwenden.

Wenn diese Gleichungen linear sind, könnten Sie sie sympy mit superimpose:

Beispiel:

import sympy as sy 
x,y = sy.symbols('x y') 

g0 = x*0.33 + 6 
g1 = x*0.72 + 1.3 
g2 = x*11.2 - 6.5 
gn = x*3.3 - 7.3 

G = [g0,g1,g2,gn] 
#this is superimposition 
print sum(G).subs(x,15.1) 
print sum(gi.subs(x,15.1) for gi in G) 
''' 
output: 
228.305000000000 
228.305000000000 
''' 

Wenn sie nicht, was Sie wollen, einige Beispiele Ein- und Ausgabe geben, damit ich versuchen kann, und nicht, blind gehen ...

Mit niedrigem Ram available Sie könnten finall Gleichung zu numexpr bekommen und es mit einigen Eingaben auswerten. Ansonsten ist es am besten, auf numply Arrays zu arbeiten.

Verwandte Themen