Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 04:36

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Simulation von physikalischen Problemen (Python)

Discussion on Simulation von physikalischen Problemen (Python) within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Simulation von physikalischen Problemen (Python)

Da es bezüglich dessen 2 kleine Anfragen gab, trete ich das kleine Beispiel etwas aus und zeige wie man Schritt für Schritt zu einer numerischen Lösung eines physikalischen Problems kommt.

Problemstellung:
Man wirft einen Ball senkrecht nach oben bzw. lässt diesen aus einer gegebenen Höhe fallen. Die Dämpfung beim Aufprall sei der Einfachheit wegen hierals linear angenommen. In unserem ist unser Dämpfungsfaktor k=0.9.
Gesucht ist nun die Bewegung des Balles vom Zeitpunkt t0=0 bis zu einem gegebenen Zeitpunkt Tende.

Vorbereitungen:
Um ein klein wenig Physik kommt man hier nicht herum:


Numerische Lösung:
Die Lösung des Systems lassen wir einen Algorithmus übernehmen. In unserem Fall ist es das Runge-Kutta-Verfahren (obwohl hier sicherlich auch jedes andere Verfahren funktionieren würde). Auch wenn die Implementation dieses Algorithmus kein großes Problem darstellt, lassen wir das in diesem Fall von erledigen.

Benötigte Pakete:
Benötigt wird Python mit numpy, scipy und matplotlib. Installiert werden diese Paket am einfachsten mit oder man ladet sich direkt , welches neben den Paketen unter anderen auch Spyder mitbringt. Insgesamt ist Pythonxy sehr zu empfehlen.
Matplotlib wird hierbei nicht zwingend benötigt, ist aber wirklich ratsam, wenn man seine Ergebnisse grafisch darstellen möchte.

Das Programm:
Benötigt werden folgende includes:
Code:
from scipy.integrate import ode
import matplotlib.pyplot as plt
import numpy as np
ode (ordinary differential equations - (Gewöhnliche Differentialgleichungen)) wird zum tatsächlichen Lösen des Problems benötigt.
pyplot aus dem matplotlib Packet wird benötigt, um das Ergebnis später zu visualisieren.
numpy wird hier benötigt, um später ein Array zu erzeugen (kann auch drauf verzichtet werden).

Nun definieren wir uns unser System:
Code:
def f(t, y):
    return [y[1], -9.81]
Das t in der Signatur wird im späteren Verlauf von dem Solver benötigt, weil Funktionen des Systems eben doch auch direkt von t abhängen können (was in unserem vereinfachten Beispiel nicht der Fall ist).
Die Rückgabe ist gleichzusetzen mit Gleichung (3), wobei der Vektor in Python als Liste behandelt wird, und y[1] unser x2 aus Gleichung (3) ist (liegt daran, dass in Python von der 0 beginnend indiziert wird).

Nun zur Hauptroutine, erst ein Teil vom Code, dann die Erklärung:
Code:
	solver = ode(f).set_integrator('vode')
	solver.set_initial_value([10, 0], 0)
	dt = 0.01
	end = 10
	
	position = []
	time = []
In Zeile 1 wird unser Objekt, dass später zum Lösen der Gleichung benötigt wird, erzeugt. Das Argument 'vode' teilt dem Objekt mit, den Runge-Kutta-Algorithmus zur Lösung zu verwenden.
In der zweiten Zeile werden die Anfangswerte gesetzt. Differentialgleichungen, die nicht nur in der Theorie benötigt werden, kommen fast immer mit einem Anfangswerptoblem. Dabei ist das hier so zu lesen:
Die Werte [10, 0] sollen zu Zeitpunkt 0 von dem Gleichungssystem erfüllt werden. Ein Blick zurück auf Gleichung 3 verrät uns, dass der erste Wert im Vektor dem Ort, der zweite der Geschwindigkeit entspricht. Demnach startet unsere Simulation mit einem Ball der aus 10 Metern ohne Anfangsgeschwindigkeit fallen gelassen wird.
dt steht hier für unseren Zeitschritt, end entspricht unserer Endzeit der Simulation. Demnach simulieren wir den Fall des Balles für 10 Sekunden in 0.01 Sekunden Schritten.
Die zwei Listen position und time dienen lediglich dazu, die Zeiten bzw die Positionen des Balles zu speichern.

Weiter gehts:
Code:
	while solver.successful() and solver.t < end:
		solver.integrate(solver.t + dt)
		position.append(solver.y[0])
		time.append(solver.t)
		
		if solver.y[0] <= 0:
			solver.set_initial_value([solver.y[0], -0.9*solver.y[1]], solver.t)
Unser Objekt Solver beinhaltet als Eigenschaft eine Variable t, welche den Aktuellen Zeitpunkt repräsentiert.
Also läuft die auf Zeile 1 folgende Schleife bis der Solver nicht mehr lösen kann oder unsere Simulationsende erreicht wurde.
Die Zeile darauf wird die Gleichung für den nächsten Zeitpunkt t + dt gelöst (dazu am Schluss noch eine kleine Anmerkung) und in den folgenden 2 Zeilen die Ergebnisse in die vorher genannten Listen verfrachtet.

Die darauf folgende Bedingung
Code:
if solver.y[0] <= 0:
sollte selbsterklärend sein. Wenn unser Ball den Nulldurchgang durchquert (sprich der Ball berührt den Boden) passiert folgendes:
Code:
solver.set_initial_value([solver.y[0], -0.9*solver.y[1]], solver.t)
Die Anfangswerte werden wie auch zu Beginn neu gesetzt, und zwar wird der Ort übernommen (also befindet sich unser Ball am Anfang auf dem Boden) und als Geschwindigkeit wird die Aufprallgeschwindigkeit (solver.y[1]) gedädämpft mit -0.9 genommen. Das Minus wurde spendiert, weil der Ball die Geschwindigkeit nun in die genau gegengesetzte Richtung besitzt.

Um zum Ende zu kommen, wollen wir das Ergebnis nun auch grafisch darstellen:

Code:
	plt.plot(time, position)
	plt.grid()
	plt.xlabel('time (s)', fontsize=17)
	plt.ylabel('height (m)', fontsize=17)
	plt.title('Bouncing ball', fontsize=23)
	plt.show()
Der Code sollte sich wie ein Buch lesen können. Wir tragen die Zeit über der Position auf und verpassen der Grafik noch etwas aussehen, in dem wir Titel und Achsenbeschriftung hinzufügen. Zu guter letzt wird via
Code:
plt.show()
die Grafik mithilfe von matploblib angezeigt:



Den kompletten Code gibt es noch einmal hier:

Viel Spaß beim rumspielen damit und falls jemand Fehler findet: immer her damit.
Schlüsselbein is offline  
Thanks
8 Users
Old 12/17/2014, 22:02   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
Alleine für das Erklären der Includes hast du den Titel "Tutorialschreiber des Monats" verdient.
Danke für die Mühe.
snow is offline  
Old 12/19/2014, 15:23   #3
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
Ein gutes Tutorial, auch gut um jetzt zB. Grafiken auf einer Webseite anzuzeigen.

Aber:

Inwiefern habe ich hier den Vorteil Python zu verwenden, um ein solches Problem zu lösen, anstatt jetzt zB. wxMaxima(welches darauf ausgelegt ist) zu verwenden um sowas zu lösen? (Bis auf, dass man jetzt etwas auf einer Webseite anzeigt)

wxMaxima ist leicht installiert, keine zusätzlichen Libs werden benötigt, es ist cross platform, man lernt es schnell und man hat das Gefühl man programmiert, da man Blöcke(aka. Methoden) erstellen kann, Schleifen, if-Anweisungen, usw. verwenden kann.
Grafiken kann man ebenfalls erstellen sowohl als auch diese lokal zu speichern. (in 2D oder 3D)
XxharCs is offline  
Old 12/19/2014, 16:17   #4
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Quote:
Ein gutes Tutorial, auch gut um jetzt zB. Grafiken auf einer Webseite anzuzeigen.
Das steht hier nicht im Vordergrund. Die grafische Darstellung bietet nur nochmal eine Überprüfungsmöglichkeit. Hier gehts nicht ums plotten, sondern um die numerische Lösung von Differentialgleichungssystemen.

Quote:
anstatt jetzt zB. wxMaxima(welches darauf ausgelegt ist) zu verwenden um sowas zu lösen?
Nein. wxMaxima ist ein Computeralgebrasystem (wie auch Maple oder Mathematica). Das benutzt man normalerweise, um Probleme analytisch zu lösen. Das ist nicht immer möglich (bzw. ist das in der Realität fast nie möglich). Kann mir sehr gut vorstellen, dass auch wxMaxima numerische Methoden besitzt, dass diese einfacher zu benutzen sind als Python oder Matlab bezweifel ich aber. Du kannst mir gerne zeigen, dass es einfacher geht.

Quote:
wxMaxima ist leicht installiert
Trifft auch auf Python zu.
Quote:
keine zusätzlichen Libs werden benötigt
Wird alles mitinstalliert, wenn man sich für pythonxy entscheidet.

Quote:
es ist cross platform
Ist Python ebenso.

Quote:
man lernt es schnell und man hat das Gefühl man programmiert
Bei Python hat man nicht nur das Gefühl, dass man programmiert - man tut es.

Quote:
da man Blöcke(aka. Methoden) erstellen kann, Schleifen, if-Anweisungen, usw. verwenden kann.
Absolute Basics in Python.

Quote:
Grafiken kann man ebenfalls erstellen sowohl als auch diese lokal zu speichern. (in 2D oder 3D)
Absolut auch mit Python machbar. Matplotlibs 3D Module sind afaik noch experimental - haben aber bei ersten anläufen gut funktioniert.
Wem das noch nicht reicht, kann zu Matlab (wunderbare Möglichkeiten in 3D zu plotten und als Student oft für ca. 20€ zu bekommen) oder der kostenlosen Alternative Octave greifen.
Schlüsselbein is offline  
Thanks
2 Users
Old 01/02/2015, 22:04   #5
 
MrDami123's Avatar
 
elite*gold: 56
Join Date: Oct 2010
Posts: 3,409
Received Thanks: 1,219
Funktioniert bei mir soweit gut. Danke.

Weiß aber einer wieso die Höhe gelegentlich unter 0 liegt?



Wenn jemand Schwierigkeiten hat auf seine Windows Maschine die benötigten Module via easy_install oder pip zu installieren kann es mit vorgefertigten Modulen von hier versuchen:
MrDami123 is offline  
Old 01/03/2015, 10:01   #6
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Welche Schrittweite benutzt du und wie sehen deine Anfangswerte aus?



Gruß
Schlüsselbein is offline  
Reply


Similar Threads Similar Threads
Origin: Abschaffung von physikalischen Datenträgern
04/01/2014 - User Submitted News - 3 Replies
Mit Origin wollte EA neue Wege gehen und vor allem Weg von der Konkurrenz von Valve. Den nächsten Schritt will EA bereits in Kürze gehen und stellt somit einiges am Onlineshop um. Bislang konnte man bei Origin nicht nur Spiele per digitalem Download beziehen, sondern auch per DVD zugeschickt bekommen. EA gab nun offiziell bekannt, dass sie diesen Service ab Freitag, dem 04. April 2014, einstellen werden und somit nur noch auf digitalem Download setzen werden. ...
Mod files simulation
02/18/2014 - DarkOrbit - 9 Replies
Hey Guy's, I wan't help of the people of Epvp, i see a screenshot from owning-peeps, he have got a files for modification on his game... How i can get the files?
Metin2 - Python - Wie Python Hacks verschlüsseln und Server überprüfen (GF/PServe)
09/23/2012 - Metin2 - 2 Replies
Ich wollte fragen, wie man Python Hacks am besten Verschlüsselt ? und wie man feststellen kann ob man auf einem GF / Pserver spielt. ?
svchost.exe nimmt zu viel physikalischen Speicher weg
10/12/2010 - Technical Support - 17 Replies
Hi habe mir svchostanalyzer geholt hier ein Screen http://img829.imageshack.us/img829/2322/unbenannt hc.jpg Uploaded with ImageShack.us wie behebe ich die Probleme
brauche Hilfe wegen Physikalischen Speicher
09/21/2010 - Technical Support - 33 Replies
Seit 1 Woche schon hab ich festgestellt wenn ich mein PC Einschalte das der Phsyikalische Speicher immer 25-50 % ausgelastet ist http://img530.imageshack.us/img530/2888/11111zq.j pg Uploaded with ImageShack.us Normalerweise wenn ich den immer gestartet habe war es nur 3-6 auslastung woran kanndas liegen das jetzt immer 25-50% Auslastung ist



All times are GMT +1. The time now is 04:37.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.