我一直在学习如何使用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()