Numérique ODE de problèmes en Python
Comment puis-je résoudre numériquement une ODE en Python?
Envisager
\ddot{u}(\phi) = -u + \sqrt{u}
avec les conditions suivantes
u(0) = 1.49907
et
\dot{u}(0) = 0
avec la contrainte
0 <= \phi <= 7\pi.
Puis enfin, je veux produire une représentation paramétrique de la parcelle où les coordonnées x et y sont générés en fonction de u.
Le problème c'est que j'ai besoin d'exécuter odeint deux fois, car c'est un second ordre de l'équation différentielle.
J'ai essayé de l'avoir à courir à nouveau après la première fois, mais il revient avec une Jacobienne d'erreur. Il doit y avoir un moyen de l'exécuter deux fois plus que tous à la fois.
Voici l'erreur:
odepack.erreur: La fonction et de son Jacobien doit être appelées fonctions
dont le code ci-dessous génère. La ligne en question est le sol = odeint.
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from numpy import linspace
def f(u, t):
return -u + np.sqrt(u)
times = linspace(0.0001, 7 * np.pi, 1000)
y0 = 1.49907
yprime0 = 0
yvals = odeint(f, yprime0, times)
sol = odeint(yvals, y0, times)
x = 1 / sol * np.cos(times)
y = 1 / sol * np.sin(times)
plot(x,y)
plt.show()
Modifier
Je suis en train de construire l'intrigue, à la page 9
Voici l'intrigue avec Mathematica
In[27]:= sol =
NDSolve[{y''[t] == -y[t] + Sqrt[y[t]], y[0] == 1/.66707928,
y'[0] == 0}, y, {t, 0, 10*\[Pi]}];
In[28]:= ysol = y[t] /. sol[[1]];
In[30]:= ParametricPlot[{1/ysol*Cos[t], 1/ysol*Sin[t]}, {t, 0,
7 \[Pi]}, PlotRange -> {{ -2, 2}, { -2.5, 2.5}}]
OriginalL'auteur dustin | 2013-04-10
Vous devez vous connecter pour publier un commentaire.
Il devrait être
zinit = [1.49907, 0]
(égaré dot).Merci. Je ne savais pas que la question avait changé.
OriginalL'auteur unutbu
Le code à partir de votre autre question est vraiment très proche de ce que vous voulez. Deux changements sont nécessaires:
deriv
)y
composant de votre terrain vient de les valeurs de la solution, et non pas à partir des valeurs de la dérivée première de la solution, si vous avez besoin de remplaceru[:,0]
(les valeurs de la fonction) pouru[:, 1]
(produits dérivés).C'est le résultat final:
Cependant, je vous suggère d'utiliser le code de unutbu de réponse parce que c'est l'auto documentation (
u, udot = z
) et utilisenp.linspace
au lieu denp.arange
. Ensuite, exécutez-le pour obtenir votre chiffre désiré:OriginalL'auteur jorgeca
Vous pouvez utiliser scipy.s'intégrer.ode. Pour résoudre dy/dt = f(t,y), avec la condition initiale y(t0)=y0, au temps t=t1 avec 4e ordre de Runge-Kutta vous pourriez faire quelque chose comme ceci:
Edit: Vous devez obtenir votre dérivé de premier ordre pour l'utilisation de l'intégration numérique. Ce que vous pouvez obtenir en établissant par exemple z1=u et z2=du/dt, après quoi vous avez dz1/dt = z2 et dz2/dt = d^2u/dt^2. Remplacer dans votre équation d'origine, et il suffit de parcourir le vecteur dZ/dt, qui est de premier ordre.
Edit 2: Voici un exemple de code pour l'ensemble de la chose:
OriginalL'auteur HenriV
scipy.intégrer() ne ODE de l'intégration. Est-ce que vous cherchez?
OriginalL'auteur Bitwise