Iterationsprobleme bei der Schleife, Werte gegen unendlich

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
acelebi
User
Beiträge: 2
Registriert: Mittwoch 16. Dezember 2020, 23:57

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




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())

einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Was gefällt dir an diesem Thread (aus dem du ja offensich den Code verwendest) nicht, dass du einen eigenen für das selbe Problem eröffnest?
acelebi
User
Beiträge: 2
Registriert: Mittwoch 16. Dezember 2020, 23:57

Moin, da habe ich nicht gesehen das der weitere Code eingefügt wurde. Vielen Dank für den Hinweis, das ganze hat sich inzwischen sowieso erledigt.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Dann wäre es klasse, wenn du/ihr den Code dazu bzw. die Lösung posten könntet. So haben andere, die ein ähnliches Problem haben und den Thread finden, eine Lösung parat. :)
Antworten