Gravitation zwischen 2 bällen
Verfasst: Dienstag 24. November 2020, 20:08
Guten Tag , ich habe ein problem bei der Einberechnung der Gravitation zwischen zwei Bällen, es muss irgendwo ein Denkfehler vorliegen.
Die Punkte bleiben auf der Stelle stehen.
Die v1 v2 arrays habe ich erstellt für den nächsten fall wenn die bälle eine anfangsgeschwindigkeit haben und aneinander vorbeifliegen während die kraft fg wirkt.
mir geht es um die einberechnung von FG in die schleifenformel d12 und die dadurch änderung von r1[k+1] und r2 [k+1]
hier kommt der code
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from IPython.display import HTML
%matplotlib inline
t_max = 10 # Zeitfenster für die Animation in s
v1_0 = np.array([0, 0]) # Anfangsgeschw. in LE/s
r1_0 = np.array([0, 0.75]) # Angangsposition in LE
v2_0 = np.array([0, 0]) # Anfangsgeschw. in LE/s
r2_0 = np.array([0, -0.75]) # Angangsposition in LE
frame_rate = 30 # Anzahl der Frames pro s
dt = 1. / frame_rate # Zeitdelay zwischen 2 Frames in sec
t = np.arange(0, t_max, dt)
npts = len(t); npts
m1 = 10000
m2 = 20000
g_const = 6.67259 * 10**(-11)
v1 = np.zeros((npts, 2)) # eine 300 x 2 Nuller-Matrix wird erstellt
v1[0] = v1_0 # als Startwerte werden die Geschwindigkeiten und Richtungen aus der Abbildung von der Aufgabenstellung
r1 = np.zeros((npts, 2)) # hier reingeschrieben. Startwerte werden bei 1.2 definiert
r1[0] = r1_0
v2 = np.zeros((npts, 2))
v2[0] = v2_0
r2 = np.zeros((npts, 2))
r2[0] = r2_0
d12 = np.zeros((npts,2))
FG =((g_const*m1*m2)/d[0]**2) #Schleife zur Abstandsberechnung
d12[0] = FG
for i in np.arange(npts-1):
d12[i+1] = g_const*m1*m2/d**2
for k in np.arange(npts-1):
v1[k+1] = v1[k] - dt*d12[k]
r1[k+1] = r1[k] + v1[k] * dt
for k in np.arange(npts-1):
v2[k+1] = v2[k] + dt*d12[k]
r2[k+1] = r2[k] + v2[k] * dt
r1x = r1[:, 0]
r1y = r1[:, 1]
r2x = r2[:, 0]
r2y = r2[:, 1]
diffrx = r2x - r1x
diffry = r2y - r1y
#Berechnung des Abstandes der zwei punkte
diffrx = diffrx**2
diffry = diffry**2
d = np.sqrt(diff)
def animate(k, t, r):
point1.set_data(r1[k, 0], r1[k, 1])
point2.set_data(r2[k, 0], r2[k, 1])
time_text.set_text(time_template %(t[k]))
return (point1, point2, time_text)
# Erzeuge ein figure-Objekt (so etwas wie eine canvas)
fig = plt.figure(figsize=(5, 5))
# Erzeuge ein axes-Objekt (artist) innerhalb der Figure
ax = fig.add_subplot()
#fig, ax = plt.subplots(figsize=(5, 5))
# Definiere die Achsenabschnitte
ax.set_xlim((-1, 1))
ax.set_ylim((-1, 1))
# Definiere die Objekte `point` und `time_text`, die animiert werden sollen
point1, = ax.plot([], [],"o", lw=2)
point2, = ax.plot([], [],"o", lw=2)
time_template = "t = %1.2f s"
time_text = ax.text(0.5, 1.05, '', horizontalalignment='center',
transform=ax.transAxes)
plt.grid()
# Initialisierungsfunktion für die Animation
def init():
point1.set_data([], [])
point2.set_data([], [])
time_text.set_text("")
return (point1, point2, time_text)
# Animationsfunktion, die sequentiel aufgerufen wird
anim1 = animation.FuncAnimation(fig, func=animate, frames=npts, init_func=init,
fargs=(t,r1),
interval=1./frame_rate*1000.,
blit=True, repeat=False)
anim2 = animation.FuncAnimation(fig, func=animate, frames=npts, init_func=init,
fargs=(t,r2),
interval=1./frame_rate*1000.,
blit=True, repeat=False)
HTML(anim1.to_html5_video())
HTML(anim2.to_html5_video())
#HTML(anim.to_jshtml())
Vielleicht hat ja jemand eine idee und hilft einem sehr verzweifelten pythonneuling
Die Punkte bleiben auf der Stelle stehen.
Die v1 v2 arrays habe ich erstellt für den nächsten fall wenn die bälle eine anfangsgeschwindigkeit haben und aneinander vorbeifliegen während die kraft fg wirkt.
mir geht es um die einberechnung von FG in die schleifenformel d12 und die dadurch änderung von r1[k+1] und r2 [k+1]
hier kommt der code
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from IPython.display import HTML
%matplotlib inline
t_max = 10 # Zeitfenster für die Animation in s
v1_0 = np.array([0, 0]) # Anfangsgeschw. in LE/s
r1_0 = np.array([0, 0.75]) # Angangsposition in LE
v2_0 = np.array([0, 0]) # Anfangsgeschw. in LE/s
r2_0 = np.array([0, -0.75]) # Angangsposition in LE
frame_rate = 30 # Anzahl der Frames pro s
dt = 1. / frame_rate # Zeitdelay zwischen 2 Frames in sec
t = np.arange(0, t_max, dt)
npts = len(t); npts
m1 = 10000
m2 = 20000
g_const = 6.67259 * 10**(-11)
v1 = np.zeros((npts, 2)) # eine 300 x 2 Nuller-Matrix wird erstellt
v1[0] = v1_0 # als Startwerte werden die Geschwindigkeiten und Richtungen aus der Abbildung von der Aufgabenstellung
r1 = np.zeros((npts, 2)) # hier reingeschrieben. Startwerte werden bei 1.2 definiert
r1[0] = r1_0
v2 = np.zeros((npts, 2))
v2[0] = v2_0
r2 = np.zeros((npts, 2))
r2[0] = r2_0
d12 = np.zeros((npts,2))
FG =((g_const*m1*m2)/d[0]**2) #Schleife zur Abstandsberechnung
d12[0] = FG
for i in np.arange(npts-1):
d12[i+1] = g_const*m1*m2/d**2
for k in np.arange(npts-1):
v1[k+1] = v1[k] - dt*d12[k]
r1[k+1] = r1[k] + v1[k] * dt
for k in np.arange(npts-1):
v2[k+1] = v2[k] + dt*d12[k]
r2[k+1] = r2[k] + v2[k] * dt
r1x = r1[:, 0]
r1y = r1[:, 1]
r2x = r2[:, 0]
r2y = r2[:, 1]
diffrx = r2x - r1x
diffry = r2y - r1y
#Berechnung des Abstandes der zwei punkte
diffrx = diffrx**2
diffry = diffry**2
d = np.sqrt(diff)
def animate(k, t, r):
point1.set_data(r1[k, 0], r1[k, 1])
point2.set_data(r2[k, 0], r2[k, 1])
time_text.set_text(time_template %(t[k]))
return (point1, point2, time_text)
# Erzeuge ein figure-Objekt (so etwas wie eine canvas)
fig = plt.figure(figsize=(5, 5))
# Erzeuge ein axes-Objekt (artist) innerhalb der Figure
ax = fig.add_subplot()
#fig, ax = plt.subplots(figsize=(5, 5))
# Definiere die Achsenabschnitte
ax.set_xlim((-1, 1))
ax.set_ylim((-1, 1))
# Definiere die Objekte `point` und `time_text`, die animiert werden sollen
point1, = ax.plot([], [],"o", lw=2)
point2, = ax.plot([], [],"o", lw=2)
time_template = "t = %1.2f s"
time_text = ax.text(0.5, 1.05, '', horizontalalignment='center',
transform=ax.transAxes)
plt.grid()
# Initialisierungsfunktion für die Animation
def init():
point1.set_data([], [])
point2.set_data([], [])
time_text.set_text("")
return (point1, point2, time_text)
# Animationsfunktion, die sequentiel aufgerufen wird
anim1 = animation.FuncAnimation(fig, func=animate, frames=npts, init_func=init,
fargs=(t,r1),
interval=1./frame_rate*1000.,
blit=True, repeat=False)
anim2 = animation.FuncAnimation(fig, func=animate, frames=npts, init_func=init,
fargs=(t,r2),
interval=1./frame_rate*1000.,
blit=True, repeat=False)
HTML(anim1.to_html5_video())
HTML(anim2.to_html5_video())
#HTML(anim.to_jshtml())
Vielleicht hat ja jemand eine idee und hilft einem sehr verzweifelten pythonneuling