Параметрический график решения 2х2 разн. система в Python, Mathematica
Я реализовал решение для следующей системы уравнений
dy/dt = -t*y(t) - x(t)
dx/dt = 2*x(t) - y(t)^3
y(0) = x(0) = 1.
0 <= t <= 20
сначала в Mathematica, а затем в Python.
Мой код в 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}]
Отсюда я получаю следующий график: Plot1 (если он выдает сообщение 403 Forbidden, пожалуйста, нажмите enter внутри поля url)
Позже я закодировал то же самое в 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()
И это график, который я получаю: Plot2 (если он выдает сообщение 403 Forbidden, пожалуйста, нажмите enter в поле url)
Если снова построить решение Mathematica в меньшем поле:
ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, 6}]
он получит результат, аналогичный решению Python. Только ось будет смещена.
Почему такая большая разница в участках? Что я делаю неправильно?
Я подозреваю, что моя реализация модели на python неверна, особенно когда вычисляется f1. Или, возможно, функция plot() совсем не удобна для построения параметрических уравнений, как в этом случае.
Благодарю.
PS: извините за усложнение вашей жизни, не шлепая изображения внутри текста; У меня пока недостаточно репутации.
1 ответ
Вы используете t
как ваш третий параметр во входном векторе, а не как отдельный параметр. t
в f(z,t)
никогда не используется; вместо этого вы используете z[2]
, который не будет равен диапазону t
как вы определили раньше (t=np.linspace(0,20.,1000)
). lambda
функция для g
здесь не поможет: вы используете его только один раз, чтобы установить t0
, но никогда после.
Упростите ваш код и удалите этот третий параметр из входного вектора (а также лямбда-функции). Например:
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()
Я закомментировал фактический сюжет, который вы хотите, и вместо этого я строю x
против t
, что у вас есть в комментариях, так как я чувствую, что теперь легче видеть, что все правильно. На рисунке я получаю: