Python中的动态系统:绕过刚度

时间:2015-10-03 01:43:59

标签: python simulation ode

我一直在学习如何使用Python(仍然非常初学者),并试图绘制一个四维动力系统(以及它的随机等价物)。对于某些参数,我观察到我期望的动态行为。但是,对于某些参数(例如代码中的以下参数),我遇到了某人所描述的"刚度"。这些图似乎停留在某个固定值并且一直坐在那里(分析上,它们应该在0和1之间循环)。我想知道是否有办法解决这个问题。我对python的了解非常有限。现在我使用四阶Runge-Kutta集成虽然我使用odeint遇到了同样的问题,并且使用Euler-Maruyama集成了随机版本(这是我熟悉的唯一一个看起来似乎是最常用的一种)。我不知道是否有一种简单的方法可以解决这个问题?我一直试图在网上阅读它,但说实话,我阅读的很多东西都超出了我对python的理解程度。

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

#Constants
c13 = 6.2
c14 = 4.2
c21 = 7.3
c32 = 2.4
c34 = 12.7
c42 = 5.7
c43 = 5.0

e12 = 0.5
e23 = 2.5
e24 = 2.0
e31 = 2.0
e41 = 4.8

b = np.array([1, 1, 1,1])
n=len(b)

A = A = np.array([[1, 1+c21, 1-e31, 1-e41], 
                  [1-e12, 1, 1+c32, 1+c42],
                  [c13+1, 1-e23, 1, 1+c43],
                  [c14+1, 1-e24, 1+c34, 1]])


#Time
T = 1000
dt = 0.01
t = sp.arange(0.0, T, dt)
N = t.size
sqrtdt = np.sqrt(dt)

#Initial Condition
ic = [0.5,0.5,0.6,0.7]

def model(m,t):
    dmdt = np.dot(np.diag(m), b.T-np.dot(A,np.dot(np.diag(m),m)))
    return dmdt

Y = odeint(model, ic, t)

y1 =  Y[:,0]
y2 =  Y[:,1]
y3 =  Y[:,2]
y4 =  Y[:,3]

plt.subplot(4, 1, 1)
plt.plot(t, y1, 'b')
plt.ylim([0,1.2])

plt.subplot(4, 1, 2)
plt.plot(t, y2, 'r')
plt.ylim([0,1.2])

plt.subplot(4, 1, 3)
plt.plot(t, y3, 'g')
plt.ylim([0,1.2])

plt.subplot(4, 1, 4)
plt.plot(t, y4, 'purple')
plt.xlim([0,T])
plt.ylim([0,1.2])
plt.xlabel('Time')

plt.show()

enter image description here

0 个答案:

没有答案