Seite 1 von 1

solve_ivp: Eventfunktion implementieren

Verfasst: Sonntag 30. Mai 2021, 17:25
von Timo0906
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

Re: solve_ivp: Eventfunktion implementieren

Verfasst: Sonntag 30. Mai 2021, 20:16
von rogerb
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

Re: solve_ivp: Eventfunktion implementieren

Verfasst: Sonntag 30. Mai 2021, 20:49
von Timo0906
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.