2017-09-11 1 views
1

Mangels eines Latex-Editors, hier ist ein Bild einer stückweisen Funktion, die ich mit Sympy plotten möchte. Ich möchte zwei Arrays der Koeffizienten und einen Wert für x übergeben, dann evaluiere ich und zeichne die Funktion auf. (Edit: Es gibt genau eine mehr p, als es Alphas, Bild aktualisiert)Rekursive stückweise Funktion in SymPy und Summierung über eine Liste/Array von Koeffizienten

Piecewise Function Dies ist mein Versuch, so weit (alpha und p-Listen/Arrays, t ist eine Zahl):

def getf(alpha,p,t): 

#Create the argument list of tuples for the SymPy.Piecewise function 
argtuples = [] 
for n,number in enumerate(alpha): 
    if n == 0: 
     argtuples.append((p[0]*x, x<alpha[0])) 
    elif 0<n and n<list(enumerate(alpha))[-1][0]: 
     argtuples.append((p[0]*alpha[0] + Sum(p[i]*(alpha[i] - alpha[i-1]),(i,1,n)) + p[n+1]*(x-alpha[n]), alpha[n-1] <= x < alpha[n])) 
    else: 
     argtuples.append((p[0]*alpha[0] + Sum(p[i]*(alpha[i] - alpha[i-1]),(i,1,n)) + p[n+1]*(x-alpha[n]), x>=alpha[n])) 

f = Piecewise(argtuples) 
return f(t) 

from sympy import Piecewise, Sum 
from sympy.abc import x, i 

getf([10000,50000,100000,1000000],[0.05,0.08,0.15,0.30,0.40],1000001) 

Allerdings bekomme ich den Fehler "Listenindizes müssen Ganzzahlen oder Slices sein, nicht Symbol". Wie kann ich auf die Koeffizientenwerte verweisen, die ich an die Funktion übergeben habe, da das Array eine beliebige Länge haben kann?

Antwort

0

Sie können einen symbolischen Index für eine Python-Liste nicht verwenden (i ist hier symbolisch, da Sie ihn von abc importieren). Wenn Sie die Liste im Voraus kennen, sollten Sie die Python sum-Funktion verwenden, um die Werte zu summieren, anstatt Sum.

sum(p[i]*(alpha[i] - alpha[i-1]) for i in range(1, n)) 

Es gibt auch ein anderes Problem, das dass Sie alpha[n-1] <= x < alpha[n] haben ist. Dies wird leider nicht funktionieren, da Python verkettete Ungleichungen behandelt. Sie müssen dies als And(alpha[n-1] <= 1, x < alpha[n]) schreiben Sonst erhalten Sie TypeError: cannot determine truth value of Relational.

+0

Danke, das hat mit der SymPy.And() Funktion geholfen. Ich habe jedoch meinen Code überarbeitet, um die kumulative Summe der Alphas vor dem Erstellen der Argumentliste zu berechnen. Jetzt denke ich, ich habe die kumulative Summe funktioniert, aber wenn ich meine Argumente in sympy übergeben.PiecWise() bekomme ich den Fehler: TypeError: __new __() nimmt 3 Position Argumente, aber 7 wurden gegeben Jede Idee, warum es gewonnen hat ' t nimm 7 Argumente? In den Dokumenten sieht es so aus, als könnten Sie für Piecewise() eine beliebige Anzahl von Intervallen angeben. –

+0

Wie erstellen Sie die Piecewise? Es unterstützt tatsächlich eine beliebige Anzahl von Argumenten. Der TypeError kann von etwas anderem kommen. – asmeurer

Verwandte Themen