Plotten von Piecewise-fkt mit sympy

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mbh
User
Beiträge: 10
Registriert: Montag 9. Mai 2016, 19:35

Hallo,

ich habe mit Piecewise eine Funktion (Rechteckimpuls) erstellt und möchte diese Plotten.

Code: Alles auswählen

import sympy
from sympy import *
from sympy.mpmath import *
from sympy.plotting import *
from sympy.abc import x, y, z, p, r, w
from IPython.display import display
a, b = -1.5, 1.5
I = [a,b]
m = (2 * pi)/(b-a)

p = Function('p')
f = Function('f')
p = sympy.Piecewise((0,w>1),(0,w<-1),(1,True))
f = lambda u: p.subs(w,u)
    
def ff(n):
    k = 0
    c, s = fourier(f, I, n)
    fkt = 0
    while k <= n:
        fkt += c[k]*sympy.cos(k*m*x) + s[k]*sympy.sin(k*m*x)
        #fkt += c[k]*x + s[k]*x
        k += 1
    return fkt

plot(ff(10),f(x),(x,a,b))
Allerdings erhalte ich immer folgenden fehler
TypeError: unorderable types: complex() < int()
Beim Einsetzen einzelner Werte funktioniert es, auch das Plotten der zugehörigen Fourierreihe haut hin.

Für jegliche Hilfe wär ich sehr dankbar!
Zuletzt geändert von Anonymous am Samstag 28. Mai 2016, 13:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Also ich bekomme da einen anderen Fehler:
[codebox=text file=Unbenannt.txt]$ python forum4.py
Traceback (most recent call last):
File "forum4.py", line 29, in <module>
plot(ff(10),f(x),(x,a,b))
File "/usr/lib/python2.7/dist-packages/sympy/mpmath/visualization.py", line 49, in plot
a, b = xlim
TypeError: 'Piecewise' object is not iterable[/code]
BlackJack

Die Zeilen 11 und 12 kannst Du übrigens weglassen, die haben keinen Effekt. Falls Du denkst die machen irgendetwas sinnvolles, liegt dort vielleicht ein Verständnisproblem bezüglich Python.
mbh
User
Beiträge: 10
Registriert: Montag 9. Mai 2016, 19:35

BlackJack hat geschrieben:Die Zeilen 11 und 12 kannst Du übrigens weglassen, die haben keinen Effekt. Falls Du denkst die machen irgendetwas sinnvolles, liegt dort vielleicht ein Verständnisproblem bezüglich Python.
Ja, das hab ich dann auch bemerkt, aber vergessen die Zeilen wieder zu löschen.. Kenn mich prinzipiell mit sympy wenig aus

Ich bekomme immer den selben Fehler, egal ob ich versuche Piecewise 'direkt' zu plotten oder mittels subs. Ich versteh nicht, woher er auf einmal die komplexen Zahlen nimmt oder was ich da prinzipiell vl falsch verstehe..

Code: Alles auswählen

test1 = lambda u: 1 if u <= 1 else u
plot(test1(y), (y,-1,4))
bringt übrigens den Fehler
TypeError: cannot determine truth value of
y <= 1

Code: Alles auswählen

test2 = lambda u: 0 if u == 1 else u
plot(test2(y), (y,-1,4))
bringt keinen Fehler, zeichnet aber einfach eine f(x) = x Fkt
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@mbh: Dein Problem ist, dass Du versuchst, Python-Ausdrücke mit Sympy zu mischen. Bei "1 if u<=1 else 0" versucht Python zuerst Die Bedingung Symbol u <= 1 aufzulösen, was natürlich nicht geht, weil u eine Unbekannte ist, man also nicht sagen kann, ob die nun größer oder kleiner 1 ist. Daher gibt es ja die Piecewise-Funktion. Im ersten Beispiel versuchst Du die Imaginäre Einheit mit der Piecewise-Funktion zu verwenden, was natürlich auch fehlschlägt, weil bei Komplexen Zahlen es kein größer oder kleiner gibt.
mbh
User
Beiträge: 10
Registriert: Montag 9. Mai 2016, 19:35

Sirius3 hat geschrieben:@mbh: Dein Problem ist, dass Du versuchst, Python-Ausdrücke mit Sympy zu mischen. Bei "1 if u<=1 else 0" versucht Python zuerst Die Bedingung Symbol u <= 1 aufzulösen, was natürlich nicht geht, weil u eine Unbekannte ist, man also nicht sagen kann, ob die nun größer oder kleiner 1 ist. Daher gibt es ja die Piecewise-Funktion.
Ok, macht Sinn..[/quote]
Im ersten Beispiel versuchst Du die Imaginäre Einheit mit der Piecewise-Funktion zu verwenden, was natürlich auch fehlschlägt, weil bei Komplexen Zahlen es kein größer oder kleiner gibt.
Woher kommt diese imaginäre Einheit? Wie bringe ich es hin, dass nur die reellen Werte zwischen -1.5 und 1.5 geplottet werden?
mbh
User
Beiträge: 10
Registriert: Montag 9. Mai 2016, 19:35

Hab's - mit adaptive=false, aber verstehen tu ich's nicht wirklich :?
BlackJack

@mbh: Ich vermute mal es gibt Probleme die Anzahl der Punkte an denen gezeichnet werden soll, damit der Plot möglichst genau ist, zu ermitteln wenn man eine nicht-stetige Funktion hat.
mbh
User
Beiträge: 10
Registriert: Montag 9. Mai 2016, 19:35

@BlackJack: Wenn python mir das nur so mitteilen würde, dass ich es auch verstehe... :mrgreen:
Antworten