2x2 diff解的参数图。系统在python中,Mathematica

时间:2014-06-03 08:05:46

标签: python wolfram-mathematica differential-equations odeint parametric-equations

我已经实现了以下方程组的解决方案

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消息,请在url字段内按Enter键)

后来我将其编码为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消息,请在url字段内按Enter键)

如果在较小的领域再次绘制Mathematica解决方案:

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

他将获得与python解决方案类似的结果。只有轴'才会错位。

为什么情节会有这么大的差异?我做错了什么?

我怀疑我的模型的python实现是错误的,尤其是在计算f1的情况下。或者也许plot()函数在绘制参数方程时根本就不方便。

感谢。

ps:抱歉通过不在文本中拍打图像来使你的生活变得艰难;我还没有足够的声誉。

1 个答案:

答案 0 :(得分:0)

您在输入向量中使用t作为第三个参数,而不是单独的参数。永远不会使用t中的f(z,t);相反,您使用z[2],它不等于您之前定义的t范围(t=np.linspace(0,20.,1000))。 lambda的{​​{1}}功能在这里没有帮助:您只使用一次设置g,但从未使用过。

简化代码,并从输入向量中删除第三个参数(以及lambda函数)。例如:

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,你在评论中有什么,因为我觉得这样可以更容易看到事情现在是正确的。我得到的数字:

enter image description here