Iterationsprobleme bei der Schleife, Werte gegen unendlich
Verfasst: Donnerstag 17. Dezember 2020, 00:39
Guten Abend,
in unserem Code soll eine Kugel simuliert werden die in Wasser fällt und dabei Auftriebskraft und Reibungskraft erfährt. Allerdings funktioniert unsere Schleife zur Berechnung des nächsten Punkts bzw der nächsten Geschwindigkeit nicht ohne schwere Probleme. Wir saßen stundenlang dran, haben verschiedene Foren etc durchgeschaut, aber leider ohne Erfolg. Somit wende ich mich an das Forum.
Unten ist der Code der leider nicht laufen möchte:
Lediglich der Code in der For-Schleife sollte Probleme haben, habe einiges der Vollständigkeit halber noch eingefügt. Einige Sachen habe ich herausgelassen damit es nicht unübersichtlich wird.
Ich wäre über jede Hilfe sehr dankbar. Vielen Dank im Voraus.
Und mit freundlichen Grüßen
acelebi
Der Fehlercode der Ausgegeben wird wenn man die Zeilen ausführt:
<ipython-input-36-b4719279fe3e>:7: RuntimeWarning: overflow encountered in double_scalars
V_k = (np.pi / 3) * (h**2) * ((3 * r) - h) # Das Volumen wird in Abhängigkeit der Höhe berechnet
<ipython-input-36-b4719279fe3e>:24: RuntimeWarning: invalid value encountered in double_scalars
v[k+1] = v[k] + dt*(F_ges[k]/m) # Hier wird die Geschwindigkeit der Kugel berechnet
in unserem Code soll eine Kugel simuliert werden die in Wasser fällt und dabei Auftriebskraft und Reibungskraft erfährt. Allerdings funktioniert unsere Schleife zur Berechnung des nächsten Punkts bzw der nächsten Geschwindigkeit nicht ohne schwere Probleme. Wir saßen stundenlang dran, haben verschiedene Foren etc durchgeschaut, aber leider ohne Erfolg. Somit wende ich mich an das Forum.
Unten ist der Code der leider nicht laufen möchte:
Lediglich der Code in der For-Schleife sollte Probleme haben, habe einiges der Vollständigkeit halber noch eingefügt. Einige Sachen habe ich herausgelassen damit es nicht unübersichtlich wird.
Ich wäre über jede Hilfe sehr dankbar. Vielen Dank im Voraus.
Und mit freundlichen Grüßen
acelebi
Der Fehlercode der Ausgegeben wird wenn man die Zeilen ausführt:
<ipython-input-36-b4719279fe3e>:7: RuntimeWarning: overflow encountered in double_scalars
V_k = (np.pi / 3) * (h**2) * ((3 * r) - h) # Das Volumen wird in Abhängigkeit der Höhe berechnet
<ipython-input-36-b4719279fe3e>:24: RuntimeWarning: invalid value encountered in double_scalars
v[k+1] = v[k] + dt*(F_ges[k]/m) # Hier wird die Geschwindigkeit der Kugel berechnet
Code: Alles auswählen
import numpy as np # Für Arrays, pi etc
import matplotlib.pyplot as plt # Zum erstellen der Plots und der Animationen
from matplotlib import animation # Animationsfunktion wird importiert
from IPython.display import HTML # Auch für die Videos notwendig
import matplotlib.patches as patches #
%matplotlib inline
# Plots werden im Notebook angezeigt und gespeichert
t_max = 10 # Zeitfenster für die Animation in s
v_0 = 0 # Anfangsgeschw. in LE/s
y_0 = 0.9 # 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) # Zeitvariable wird definiert
npts = len(t) # Anzahl der Zeitpunkte
r = 0.05 # Radius Kugel
vsk_Wasser = 1 # Viskosität Wasser
grenze_ball_wasser = 0.45 # Höhe des Balls wo dieser genau am Wasser grenzt
...
for k in np.arange(npts-1):
V_k = 0
h = np.zeros(npts)
h[0] = grenze_ball_wasser
if y[k+1] <= grenze_ball_wasser: # Ball tritt grade ins wasser ein
h = hball - y[k] # Die Höhe h wird berechnet
V_k = (np.pi / 3) * (h**2) * ((3 * r) - h) # Das Volumen wird in Abhängigkeit der Höhe berechnet
#V_r[k+1] = (np.pi / 3) * (h**2) * (3 * r - h) # Volumen der Kugel wird in Abhängigkeit der Eintauchtiefe berechnet
#F_r[k+1] = 6 * np.pi * 0.05 * v[k] * vsk_Wasser # Reibungkraft wird in Abhängigkeit der Geschwindigkeit berechnet
F_a[k+1] = rho_med * V_k * F_g #V_r[k] * F_g # Auftriebskraft wird berechnet
F_ges[k+1] = F_g + F_r[k] + F_a[k] # Die Gesamtkraft wird berechnet
elif y[k+1] <= 0.35: # Die Kräfte die berechnet werden wenn die Kugel komplett unter Wasser ist
V_k = (np.pi / 3) * (h**2) * (3 * r - h) # Das Volumen wird erneut berechnet
#V_r[k+1] = (np.pi / 3) * (0.1**2) * (3*r - h) # Volumen in Abhängigkeit der Eintauchtiefe
#F_r[k+1] = 6 * np.pi * 0.05 * v[k] * vsk_Wasser # Reibungkraft in Abhängigkeit der Geschwindigkeit der Kugel
F_a[k+1] = rho_med * V_k * F_g #V_r[k] * F_g # Auftriebskraft
F_ges[k+1] = F_g + F_r[k] + F_a[k] # Gesamtkraft
else: # Falls die Kugel ausserhalb des Wassers ist
F_ges[k] = F_g # Auftriebskraft und Reibungskraft wirken nicht mehr
v[k+1] = v[k] + dt*(F_ges[k]/m) # Hier wird die Geschwindigkeit der Kugel berechnet
y[k+1] = y[k] + v[k]*dt # In Abhängigkeit der Geschwindigkeit wird der Ort y der Kugel berechnet
def animate(k, y):
x, z = patch.center
x = 0.5 #5 + 3 * np.sin(np.radians(k))
z = y[k]
patch.center = (x, z)
return patch,
fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot()
ax = plt.axes(xlim=(0, 1), ylim=(0, 1))
patch = plt.Circle((5, -5), 0.05, fc='r')
rect = patches.Rectangle((0.2,0),0.6,0.4,linewidth=1,edgecolor='r',facecolor='b')
ax.add_patch(rect)
plt.grid()
def init():
patch.center = (0.5, 0.9)
ax.add_patch(patch)
return patch,
anim = animation.FuncAnimation(fig, func = animate,
init_func=init, fargs = (y,),
frames=npts,
interval=1./frame_rate*1000.,
blit=True,repeat=False)
HTML(anim.to_html5_video())