Question

J'ai mis en place une solution pour le système suivant d'équations

dy/dt = -t*y(t) - x(t)
dx/dt = 2*x(t) - y(t)^3

y(0) = x(0) = 1.
0 <= t <= 20

tout d'abord dans Mathematica, et par la suite en Python.

Mon code dans Mathematica:

s = NDSolve[
{x'[t] == -t*y[t] - x[t], y'[t] == 2 x[t] - y[t]^3, x[0] == y[0] == 1},
{x, y}, {t, 20}]

ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, 20}]

Depuis que j'ai le terrain: Plot1 (si il donne un 403 Forbidden message veuillez appuyer sur la touche entrer à l'intérieur du champ de l'url)

Plus tard, j'ai codé en python:

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

g = lambda t: t

def f(z,t):
    xi = z[0]
    yi = z[1]
    gi = z[2]

    f1 = -gi*yi-xi
    f2 = 2*xi-yi**3
    return [f1,f2]

# Initial Conditions
x0 = 1.
y0 = 1.
g0 = g(0)
z0 = [x0,y0,g0]
t= np.linspace(0,20.,1000)

# Solve the ODEs
soln = odeint(f,z0,t)
x = soln[:,0]
y = soln[:,1]

plt.plot(x,y)
plt.show()

Et c'est le scénario que j'obtiens:Plot2 (si il donne un 403 Forbidden message veuillez appuyer sur la touche entrer à l'intérieur du champ de l'url)

Si l'un des parcelles de nouveau le Mathematica solution dans un petit champ:

ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, 6}]

il permettra d'obtenir un résultat similaire à l'python solution.Seul l'axe " sera égaré.

Pourquoi est-il une si grande différence dans les parcelles?Ce que je fais mal?

Je soupçonne que mon python de la mise en œuvre du modèle est faux, en particulier là où f1 est calculé.Ou peut-être la parcelle() la fonction n'est pas à portée de la main pour tracer les équations paramétriques comme dans ce cas.

Merci.

ps:désolé pour rendre votre vie dur par pas de gifler les images à l'intérieur du texte;Je n'ai pas assez de réputation encore.

Était-ce utile?

La solution

Vous êtes à l'aide de t comme votre troisième paramètre dans le vecteur d'entrée, non pas comme un paramètre individuel.L' t dans f(z,t) n'est jamais utilisé;au lieu de cela, vous utilisez z[2], qui ne sera pas égale à la gamme de t comme vous le définir avant (t=np.linspace(0,20.,1000)).L' lambda fonction pour g ne va pas aider ici:vous ne l'utilisez une fois de définir un t0, mais jamais après.

Simplifier votre code, et retirer le troisième paramètre de votre vecteur d'entrée (ainsi que la fonction lambda).Par exemple:

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

def f(z,t):
    xi = z[0]
    yi = z[1]

    f1 = -t*yi-xi
    f2 = 2*xi-yi**3
    return [f1,f2]

# Initial Conditions
x0 = 1.
y0 = 1.
#t= np.linspace(0,20.,1000)
t = np.linspace(0, 10., 100)

# Solve the ODEs
soln = odeint(f,[x0,y0],t)
x = soln[:,0]
y = soln[:,1]

ax = plt.axes()
#plt.plot(x,y)
plt.plot(t,x)
# Put those axes at their 0 value position
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
#plt.axis([-0.085, 0.085, -0.05, 0.07])
plt.show()

J'ai commenté l'intrigue réelle que vous voulez, et au lieu de cela je suis de traçage x rapport t, ce que vous avez dans les commentaires, car je pense que c'est plus facile de voir les choses sont correctes maintenant.La figure j'obtiens:

enter image description here

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top