Protokoll am 25.01.2018

Heute war ein erfolgreicher Tag! Wir haben eine grafische Darstellung erarbeitet. Es wird erst die vorgegebene Simulation durchgerechnet, die Koordinaten werden in eine Liste getan und aus dieser wird dann mit Matplotlib eine Simulation erstellt. Um zu prüfen ob unsere programmierte Physik auch Einwirkung auf das System hat haben wir spaßeshalber einen zweiten Mond um die Erde kreisen lassen. Dieser zweite Mond und der erste haben sich gegenseitig sehr schnell aus der Bahn gebracht, wodurch wir erkannten das die Physik zumindest etwas bewirkt.

BILD DER ZWEI MONDE

Die graphische umsetzung:

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
 
fig = plt.figure()
ax = fig.gca(projection='3d')
 
 
class Himmelskoerper(object):
 
	Liste_der_Kraefte = []		#die Liste der Kraefte
	m = 1.0
	v = np.array([0.0,0.0,0.0])
	ort = np.array([0.0,0.0,0.0])
	name = ""
 
	def __repr__(self):
		return self.name
 
	def __init__(self,name,m):
		self.name = name
		self.m = m
 
 
	def berechne_gravitationskraft(self,objekt1):
		"""
		Gibt die Gravitationskraft aus, die zwischen den Objekten "objekt1" und "objekt2" herrscht
		Das Ergebnis wird als Vektor ausgegeben, immer in Richtung von objekt1 bis objekt2
		"""
		verbindungsvektor = self.ort-objekt1.ort
		betrag = np.linalg.norm(verbindungsvektor)
		F_betrag = (welt.gravitationskonstante * objekt1.m * self.m)/betrag**2
		F = (F_betrag/betrag)*verbindungsvektor
		return F
 
	def berechne_kraefte_neu(self,welt):
		self.Liste_der_Kraefte = []
		for i in welt.Liste_der_Objekte:
			if i.name != self.name:
				k = i.berechne_gravitationskraft(self)
				self.Liste_der_Kraefte.append(k)
 
	def berechne_resultierende_Kraft(self,welt):
		self.berechne_kraefte_neu(welt)
		r = np.array([0.0,0.0,0.0])			#resultierende Kraft
		for i in self.Liste_der_Kraefte:
			r = r + i
		return r
 
	def berechne_beschleunigung(self,welt):
		r = self.berechne_resultierende_Kraft(welt)
		a = r/self.m
		return a
 
	def berechne_geschwindigkeitsvektor(self,zeitschritt,welt):
		a = self.berechne_beschleunigung(welt)
		v = a*zeitschritt
		return self.v + v					#alte und neue Geschwindigkeit addiert
 
	def berechne_ort(self,zeitschritt,welt):
		v = self.berechne_geschwindigkeitsvektor(zeitschritt,welt)
		self.v = v
		s = v*zeitschritt								#zurueckgelegte Strecke im Zeitintervall
		ort = self.ort + s
		return ort
 
	def leapfrog(self,zeitschritt,welt):
		ort_zwischen = self.ort + self.v * (zeitschritt/2.0)
		self.ort = ort_zwischen
		a_zwischen = self.berechne_beschleunigung(welt)
		self.v = self.v + a_zwischen * zeitschritt
		self.ort = ort_zwischen + self.v * (zeitschritt/2.0)
		return self.ort
 
 
#------------------------------------------------------------------------------------------------------------------------------------
 
class Planet(Himmelskoerper):
 
	Abstand_zur_Sonne = 0
	min_Temperatur = 0
	max_Temperatur = 0
	Umlaufperiode = 0
	Rotationsperiode = 0
 
 
 
#------------------------------------------------------------------------------------------------------------------------------------
 
 
class Welt(object):
 
	gravitationskonstante = 6.673 * 10**(-11)			#Gravitationskonstante
	Liste_der_Objekte = []
 
 
 
 
	def objekt_hinzufuegen(self,objekt,ort):
		"""
		Fuegt der Welt ein Objekt hinzu
		"""
		self.Liste_der_Objekte.append(objekt)
		objekt.ort = ort
 
	def objekt_als_satellit_hinzufuegen(self,objekt,satellit,abstand):
		"""
		Fuegt ein Objekt ("satellit" genannt) in die Welt ein, welches sich
		um ein anderes Objekt ("objekt" genannt) dreht. Es ist dabei in einem stabilen Orbit.
		der Abstand ("abstand" genannt) ist dabei der Abstand zwischen den Mittelpunkten.
		Ansatz: F_g = F_r
		Nach aufloesung erhaelt man: v = sqrt(gravitationskonstante*masse_objekt/abstand)
		"""
		satellit.v = np.array([0.0,(self.gravitationskonstante*objekt.m/abstand)**0.5,0.0])
		ort = objekt.ort + np.array([abstand,0,0])
		self.objekt_hinzufuegen(satellit,ort)
 
#------------------------------------------------------------------------------------------------------------------------------------
 
erde = Planet("Erde",5.972E24)
mond = Planet("Mond",7.35E22)
mond2 = Planet("Mond2",7.35E22)
welt = Welt()
welt.objekt_hinzufuegen(erde,np.array([0.0,0.0,0.0]))
welt.objekt_als_satellit_hinzufuegen(erde,mond,384400000.0)
welt.objekt_als_satellit_hinzufuegen(erde,mond2,384400000.0)
mond2.ort = np.array([0,mond.ort[0],0])
mond2.v = np.array([0,0,mond.v[1]])
abstand_0 = mond.ort-erde.ort
print "Erde: "+ str(erde.ort)
print "Mond: "+ str(mond.ort)
print "Abstand zwischen Mond und Erde: "+str(np.linalg.norm(abstand_0))
 
alter_mond = mond.ort 
mondbahn = []
mondbahn2 = []
for i in xrange(80):
	mond.ort = mond.leapfrog(30000.0,welt)
	mond2.ort = mond2.leapfrog(30000.0,welt)
	ort = plt.plot(np.array([mond.ort[0]]),np.array([mond.ort[1]]),np.array([mond.ort[2]]),'k.')
	mondbahn.append(ort)
	ort2 = plt.plot(np.array([mond2.ort[0]]),np.array([mond2.ort[1]]),np.array([mond2.ort[2]]),'k.')
	mondbahn2.append(ort2)
abstand_n = mond.ort-erde.ort
w = np.arccos(np.dot(abstand_0,abstand_n)/(np.linalg.norm(abstand_0)*np.linalg.norm(abstand_n)))
print "Winkel: "+str(w*360/(2*np.pi))
print "Erde: "+ str(erde.ort)
print "Mond: "+ str(mond.ort)
print "Abstand zwischen Mond und Erde: "+str(np.linalg.norm(abstand_n))
 
 
#--------------Grafik----------------------------------------------------------------------------------------------------------------
 
"""
plt.ion()
plt.plot(np.array([erde.ort[0]]),np.array([erde.ort[1]]),np.array([erde.ort[2]]),'bo')
plt.plot(np.array([mond.ort[0]]),np.array([mond.ort[1]]),np.array([mond.ort[2]]),'wo')
#plt.plot(np.array([alter_mond[0]]),np.array([alter_mond[1]]),np.array([alter_mond[2]]),'wo')
ax.set_xlim(-400000000,400000000)
ax.set_ylim(-400000000,400000000)
ax.set_zlim(-400000000,400000000)
plt.show()
"""
plt.plot(np.array([erde.ort[0]]),np.array([erde.ort[1]]),np.array([erde.ort[2]]),'bo')
Animation1 = animation.ArtistAnimation(fig, mondbahn, 1)
Animation2 = animation.ArtistAnimation(fig, mondbahn2, 1)
ax.set_xlim(-400000000,400000000)
ax.set_ylim(-400000000,400000000)
ax.set_zlim(-400000000,400000000)
 
plt.show()