Bälle mit gegenseitiger Anziehung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bremen_hs_1992
User
Beiträge: 23
Registriert: Montag 16. November 2020, 15:11

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?
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Benutze doch bitte die code -Tags für deinen Code, das macht ihn hier besser lesbar.

Zum Thema kann ich nichts beitragen, ist nicht mein Fachgebiet. Aber ich habe da mal vor ein paar Jahren was gelesen, was ich ganz gut fand. Ist nicht Python, hilft aber vielleich ttrotzdem: Kapital 2.9
https://natureofcode.com/book/chapter-2-forces/
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Natureofcode ist mir auch als erstes eingefallen.
Hier die Playlist zum Buch: https://www.youtube.com/watch?v=II1A3bB ... mBLiGD8n4O

Ansonsten schau mal hier: https://www.google.de/search?&q=python+ ... two+masses
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten