Une histoire sur le calcul de la vitesse d'une petite balle tombant tout en recevant la résistance de l'air avec Python et Sympy

introduction

Je me souviens avoir joué avec Mathematica pendant que je mentais dans un laboratoire universitaire. Au cours des décennies qui ont suivi, des équations différentielles sont apparues devant moi à plusieurs reprises dans ma vie de recherche, et j'aurais aimé avoir un logiciel de traitement mathématique, mais en ce qui concerne l'intégration numérique. Je suis un ancien ingénieur qui vient d'atteindre la fin du calendrier avec la corruption. Ravi de vous rencontrer ce soir. Récemment, cependant, un mathématicien du nom de M. Tanaka, un ami de la métamorphose, m'a présenté Sympy, et pendant que je l'utilisais, mes souvenirs de jeunesse ont repris vie et je suis allé voir Tobita Shinchi. J'ai décidé d'essayer de résoudre le problème.

environnement

Windows10 pro Anaconda + Python 3.7.6 (64bit) + Sympy 1.5.1 Visual Studio Code 1.44.2

Formule de base

Au lycée, un vieil ingénieur a d'abord appris la puissance des équations différentielles lorsqu'il a rencontré le problème de la chute lors de la résistance de l'air.

Une petite boule d'une masse de $ m $ (kg) tombe verticalement vers le bas. Les globules commencent à tomber à la vitesse initiale de 0 $ $ au temps $ 0 $ (s), et à l'automne, les globules ont une résistance à l'air $ kv $ (N) proportionnelle à la vitesse $ v $ (m / s). Trouvez la vitesse des globules au temps $ t $ (s) agissant dans la direction opposée de. </ b>

Il y a longtemps, il y avait un grand professeur de physique nommé M. Sakuma à Shundai, qui écrivait les équations différentielles dans une lettre rapide. Quand j'étais en première année de lycée et que j'étais le matin, j'ai flirté pendant un moment. Cependant, formulons d'abord une équation cinétique tout en étant fiers de sucer de la mousse, car les jours de copie dans un cahier se poursuivent et il fait beau et actif en classe de sciences 1. Soit la vitesse de la petite boule au temps $ t $ (s) $ v (t) $ (m / s)

Équation de mouvement </ b>

m \\frac{dv\\left(t \\right)}{d t} {} = mg-kv{\\left(t \\right)}

Résolvez ceci $v{\\left(t \\right)} = \\frac{mg}{k} + \\frac{e^{\\frac{C_{1} k}{m}} }{k}e^{- \\frac{k t}{m}}$ Constant $A=\\frac{e^{\\frac{C_{1} k}{m}} }{k}$ Résumer $v{\\left(t \\right)} = \\frac{mg}{k} + A e^{- \\frac{k t}{m}}$ Cela devient une solution générale. Lorsque v {\ left (t \ right)} = 0 $ est saisi sous la condition initiale $ t = 0 (s) pour obtenir $ A , $A=-\frac{mg}{k}$ Et $v{\left(t \right)} = \frac{mg}{k} (1- e^{- \frac{k t}{m}})$$ Peut être obtenu. Speed $ v {\ left (t \ right)} $ t → \ infty $ limit, c'est-à-dire la vitesse de terminaison $\lim_{t \to \infty} v(t)=\\frac{mg}{k}$ Ce sera.

Résolvez cela avec Sympy et dessinez un graphique

python


#%%
import sympy as sym
from IPython.display import Math, display
from sympy.solvers import ode
from sympy import oo
import matplotlib.pyplot as plt

#Définir des variables
t, v, k, m, g = sym.symbols("t v k m g")
v = sym.Function('v')

#Equation de mouvement (équation différentielle normale)
eq = sym.Eq(m * v(t).diff(t,1) - m * g + k * v(t), 0)

#Solution générale
ans = sym.expand(sym.dsolve(eq))
display(Math(f"Solution générale: {sym.latex(ans)}"))

#Solution spéciale(Expression de caractère)
ans2 = sym.expand(sym.dsolve(eq, ics={v(0):0}))
display(Math(f"Solution spéciale(Expression de caractère): {sym.latex(ans2)}"))

#Solution spéciale (valeur numérique)
m1 = 0.4
k1 = 0.2
g1 = 9.8
eq2 = eq.subs([(m, m1), (k, k1), (g, g1)])
ans3 = sym.dsolve(eq2, ics={v(0):0})
p1 = sym.plot(ans3.rhs, (t, 0, 10), show=False) #rhs est le bon côté
display(Math(f"Solution spéciale(m={m1}, k={k1}, g={g1}): {sym.latex(ans3)}"))

#Vitesse de terminaison
voo = sym.limit(ans3.rhs, t, oo)
display(Math(r"Vitesse de terminaison:\lim_{t \to \infty} v(t)" \
    f"={voo:.2f}"))
p2 = sym.plot(voo, (t, 0, 10), show=False)
p1.extend(p2)
p1[1].line_color = "0.8"
p1.show()
fig = p1._backend.fig
fig.legend([f"f(t)={ans3.rhs}", f"f(t)={voo:.1f}"], loc='center')
fig

Quand tu fais ça, image.png image.png

L'avantage de Sympy est que vous pouvez demander une solution spéciale. De plus, si vous passez la formule de la solution spéciale à sympy.plot, vous pouvez dessiner un graphique. Vous pouvez également tracer une ligne de fermeture pour la limite.

Recommended Posts