Seite 1 von 1
Division durch Null
Verfasst: Montag 12. Juni 2023, 16:54
von hubertgrassmann
Wenn ich z.B. die Funktion y = x/(a*x**3 +b*x**2+c) plotten will, wird an der x-Koordinate, wo der Nenner gleich Null ist, eine senkrechte Linie gezeichenet und es wird eine Warnung angezeigt.
Die senkrechte Linie ist einfach falsch, denn dort gibt es keine Funktionswerte.
Kann man beides vermeiden?
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:10
von __blackjack__
Plotten, womit? Wie?
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:11
von Sirius3
Bitte zeige Deinen Code. Niemand weiß hier, mit welchen Werten Du was berechnest und wie Du dann versuchst, das ganze zu plotten.
Wenn ich die exakte Nullstelle treffe, dann wird alles korrekt geplottet.
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:18
von hubertgrassmann
import numpy as np
import matplotlib.pyplot as plt
def f(x,a,b,c):
y = x/(a*x**3 +b*x**2+c)
return y
x = np.arange(-2, 2, 0.001)
fig, ax = plt.subplots()
s = f(x,1,1,-1)
l, = plt.plot(x, s, lw=2)
plt.show()
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:20
von hubertgrassmann
entschuldige das fehlende indent
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:38
von Sirius3
Du berechnest numerisch eine Funktion, und jeder Funktionswert wird beim Plotten mit einer Linie mit dem nächsten verbunden, so natürlich auch von -267 nach 1917, woher soll auch die Plotfunktion wissen, dass Du da kein Linie möchtest.
Du kannst die Sprungstelle ermitteln und drumrum plotten:
Code: Alles auswählen
sprungstelle = np.argmax(abs(np.diff(s))) + 1
plt.plot(x[:sprungstelle], s[:sprungstelle])
plt.plot(x[sprungstelle:], s[sprungstelle:])
plt.show()
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:44
von hubertgrassmann
Hier ist der Wert der Spunstelle gleich 2755, aber die Anzeige bleibt die gleiche.
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:45
von __deets__
Nach dem mehr als 50sten Post darfst auch du gerne den Code-Tags-Button bemuehen, damit dein Code vernuenftig formatiert wird. Das ist der </>-Knopf im vollstaendigen Editor, zu erreichen ueber den Button unten.
Zu deinem Problem: ein Line-Plot verbindet alle aufeinanderfolgenden Punkte. Daher die Linie. Das kann man durch das einfuegen des Wertes NaN an der Stelle verhiendern. Siehe
https://matplotlib.org/2.0.2/examples/p ... _test.html
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 17:56
von hubertgrassmann
import numpy as np
import matplotlib.pyplot as plt
def f(x,a,b,c):
y = x/(a*x**3 +b*x**2+c)
return y
x = np.arange(-2, 2, 0.001)
fig, ax = plt.subplots()
s = f(x,1,1,-1)
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.plot(x, s, lw=2)
plt.show()
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 18:01
von hubertgrassmann
das mit dem </>-Knopf funktioniert nicht wie gedacht.
Aber ich kann doch nicht ahnen, wo der Wert Unendlich wird, er kann ja auch irrational sein.
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 18:03
von Sirius3
Deshalb brauchst Du halt irgendeine Heuristik, die die Sprungstelle erkennt. Liest Du eigentlich meine Beiträge?
Re: Division durch Null
Verfasst: Montag 12. Juni 2023, 18:09
von __deets__
hubertgrassmann hat geschrieben: Montag 12. Juni 2023, 18:01
das mit dem </>-Knopf funktioniert nicht wie gedacht.
Du musst den Code markieren, und dann den Knopf druecken. Und da ja genug Beispiele existieren, die belegen, dass es grundsaetzlich geht, liegt das Problem wohl auf der Benutzeseite. Und der Benutzer muss dann noch eine Minute oder zwei mit der Vorschau spielen.
Was die Frage nach den Werten angeht: entweder bestimmst du die Nullstellen selbst, und streichst die raus. Oder eine relativ simple Heuristik, die bei einem zu grossen Unterschied bei aufeinander folgenden Werten NaN einfuegt. Aber das geht natuerlich nicht bei Definitionsluecken, die in der gleichen Richtung liegen. Doch da ist die Darstellung dann ja auch nicht problematisch.
Re: Division durch Null
Verfasst: Dienstag 13. Juni 2023, 14:09
von hubertgrassmann
Problem gelöst!
Durch eine drastische Vergrößerung des arange-Abstands merkt man, dass die "senkrechte" Linie gar nicht senkrechtn ist; wenn ich nun beim plot den Parameter '.' einfüge, ist alles ok