Division durch Null

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Plotten, womit? Wie?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

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()
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

entschuldige das fehlende indent
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Hier ist der Wert der Spunstelle gleich 2755, aber die Anzeige bleibt die gleiche.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

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()
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Deshalb brauchst Du halt irgendeine Heuristik, die die Sprungstelle erkennt. Liest Du eigentlich meine Beiträge?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

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
Antworten