Bälle mit gegenseitiger Anziehung
Verfasst: Sonntag 22. November 2020, 14:35
Guten Tan an alle Programmierer, ich habe in meinem Programm leider keine Idee zur weiteren Lösung.
Es sollen zwei Bälle in entgegengesetzter Richtung und etwas Abstand in der Y achse an einander vorbeifliegen dabei soll die Gravitation zwischen den beiden( FG = G * (m1*m2)/r^2)
sie von ihrer Bahn leicht ablenken (vorher ist die Bewegungsrichtung nur in x Richtung).
Mein Programm ist jetzt soweit, dass die Animation der Bälle und ihre bewegungsrichtung funktioniert.
Jetzt frage ich mich wie ich die Gravitation zwischen den beiden punkten einbauen kann.
Hier der Aktuelle 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.5, 0]) # Anfangsgeschw. in LE/s
r1_0 = np.array([1.0, 0.5]) # Angangsposition in LE
v2_0 = np.array([0.5, 0]) # Anfangsgeschw. in LE/s
r2_0 = np.array([-1.0, -0.5]) # Angangsposition in LE
g = np.array([0, 0]) # Gravitation in LE/s^2
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 = 1
m2 = 2
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
for k in np.arange(npts-1):
v1[k+1] = v1[k] + g * dt
r1[k+1] = r1[k] + v1[k] * dt
for k in np.arange(npts-1):
v2[k+1] = v2[k] + g * dt
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
diffrx = diffrx**2
diffry = diffry**2
diff = diffrx + diffry
d = np.sqrt(diff) #Berechnung des aktuellen abstands
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())
Hat jemand eine idee wie es funktionieren könnte?
Es sollen zwei Bälle in entgegengesetzter Richtung und etwas Abstand in der Y achse an einander vorbeifliegen dabei soll die Gravitation zwischen den beiden( FG = G * (m1*m2)/r^2)
sie von ihrer Bahn leicht ablenken (vorher ist die Bewegungsrichtung nur in x Richtung).
Mein Programm ist jetzt soweit, dass die Animation der Bälle und ihre bewegungsrichtung funktioniert.
Jetzt frage ich mich wie ich die Gravitation zwischen den beiden punkten einbauen kann.
Hier der Aktuelle 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.5, 0]) # Anfangsgeschw. in LE/s
r1_0 = np.array([1.0, 0.5]) # Angangsposition in LE
v2_0 = np.array([0.5, 0]) # Anfangsgeschw. in LE/s
r2_0 = np.array([-1.0, -0.5]) # Angangsposition in LE
g = np.array([0, 0]) # Gravitation in LE/s^2
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 = 1
m2 = 2
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
for k in np.arange(npts-1):
v1[k+1] = v1[k] + g * dt
r1[k+1] = r1[k] + v1[k] * dt
for k in np.arange(npts-1):
v2[k+1] = v2[k] + g * dt
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
diffrx = diffrx**2
diffry = diffry**2
diff = diffrx + diffry
d = np.sqrt(diff) #Berechnung des aktuellen abstands
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())
Hat jemand eine idee wie es funktionieren könnte?