solve_ivp: Eventfunktion implementieren

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
Timo0906
User
Beiträge: 2
Registriert: Sonntag 30. Mai 2021, 17:07

Guten Abend,

ich belege dieses Semester ein Modul für mein Studium, in welchem wir mit Python modellieren und wir wöchentliche Assignments abzugeben haben. Bin kompletter Anfänger was Pyhton angeht und mehr oder weniger auch das Programmieren. Nun komme ich an einer Stelle nicht weiter und würde über eure Hilfe sehr dankbar sein.

Folgende Aufgabe:
Es geht darum, dass wir den Verlauf eines Elektrons in einer Braunschen Röhre plotten sollen, in dem wir die ODE´s aufstellen und mit der Funktion solve_ivp im Anschluss lösen. Dabei ist entscheidend, dass der solver bei Aufschlag des Elektrons auf dem Schirm stoppt. Die Funktion habe ich aufgestellt bekommen und der Plott sieht auch richtig aus. Jedoch habe ich ein Problem bei der Erstellung der Eventfunktion zum Stoppen des Solvers.
Und zwar ist der Schirm 0.15 Längeneinheiten (in x-Richtung) vom Startpunkt entfernt und demnach soll hier der Solver dann stoppen. Ich habe nun folgenden Ansatz für die Eventfunktion:

Code: Alles auswählen

def schirmaufprall(t, y, *args): # Eventfunktion für den Schirmaufprall 
    return y[0] # Ausgeben der x-Position
schirmaufprall.terminal = True
schirmaufprall.direction = 0.15 # was muss hier hin um das zu stoppen?
Ich definiere also zuerst die Eventfunktion Schirmaufprall und lasse mir dort die x-Position ausgeben. Bei Terminal ist = True gewählt um den Solver zu stoppen, wenn dieses Event eintritt. Nun kommen wir zu meinem Problem: Wie kann ich einstellen, dass bei dem Wert 0.15 der Solver nun stoppt. Ich kenne nämlich nur den "diricetion" Befehl, dieser bezieht sich aber ja nur darauf, dass ein Nulldurchgang auftritt und ist dann in diesem Fall ja unpassend.

Also mein frage lautet nun, wie ich umsetzen kann, dass mein Solver bei 0.15 stoppt, welche Befehle brauche ich dafür in meiner Eventfunktion?

Vielen Dank für eure Hilfe :)
Timo
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich würde mal versuchen den Auftreffpunkt zu "verschieben". Siehe Kommentar im Code.
Außerdem für direction "-1" verwenden.

Code: Alles auswählen

def schirmaufprall(t, y, *args): # Eventfunktion für den Schirmaufprall 
    return y[0] - 0.15 # <----- "offset" des Auftreffpunkts
schirmaufprall.terminal = True
schirmaufprall.direction = -1 
Wenn das nicht funktioniert, müsstest du vielleicht mal den gesamten Code hier posten
Timo0906
User
Beiträge: 2
Registriert: Sonntag 30. Mai 2021, 17:07

Dankeschön, das funktioniert. So einfach habe ich nicht gedacht.

Hätte gedacht, dass es da auch ganz allgemeine Befehle gibt, wo man bspw. ein Wert für x und y setzen kann und er dann stoppt. Aber halt nichts zu gefunden, sondern immer nur die Befehle direction und terminal.
Antworten