随时间推移的人口(每个高峰的高度应相同
我已经编写了一个代码,用龙格库塔四阶函数模拟老鼠和狐狸的种群。 但结果并不像人们所希望的那样。。每个峰的高度应该几乎相同 我不认为这是一个步长的问题。。 你有什么主意吗?你知道吗
import matplotlib.pyplot as plt
import numpy as np
#function definition
def mice(f_0, m_0):
km = 2. #birthrate mice
kmf = 0.02 #deathrate mice
return km*m_0 - kmf*m_0*f_0
def fox(m_0, f_0):
kf = 1.06 #deathrate foxes
kfm = 0.01 #birthrate foxes
return kfm*m_0*f_0 -kf*f_0
def Runge_kutta4( h, f, xn, yn):
k1 = h*f(xn, yn)
k2 = h*f(xn+h/2, yn + k1/2)
k3 = h*f(xn+h/2, yn + k2/2)
k4 = h*f(xn+h, yn + k3)
return yn + k1/6 + k2/3 + k3/3 + k4/6
h = 0.01
f = 15.
m = 100.
f_list = [f]
m_list = [m]
for i in range(10000):
fox_new = Runge_kutta4(h, fox, m, f)
mice_new = Runge_kutta4(h, mice, f, m)
f_list.append(fox_new)
m_list.append(mice_new)
f = fox_new
m = mice_new
time = np.linspace(0,100,10001)
#Faceplot LV
fig = plt.figure(figsize=(10,10))
fig.suptitle("Runge Kutta 4")
plt.grid()
plt.xlabel('Mice', fontsize = 10)
plt.ylabel('Foxes', fontsize = 10)
plt.plot(m_list, f_list, '-')
plt.axis('equal')
plt.show()
fig.savefig("Faceplott_Runge_Kutta4.jpg", dpi=fig.dpi)
fig1 = plt.figure(figsize=(12,10))
fig1.suptitle("Runge Kutta 4")
plt.grid()
plt.xlabel('Time [d]', fontsize = 10)
plt.ylabel('Populationsize', fontsize = 10)
plt.plot(time, m_list , label='mice')
plt.plot(time, f_list , label='fox')
plt.legend()
plt.show()
fig1.savefig("Fox_Miceplot_Runge_Kutta4.jpg", dpi=fig.dpi)
在Runge-Kutta实现中,
xn
是时间变量,yn
是标量状态变量。f
是标量ODEy'(x)=f(x,y(x))
的标量ODE函数。然而,这不是如何应用RK4过程,ODE函数是自治的,不包含时间变量,而是包含两个耦合状态变量。在实现时,结果应该是没有特定类型的卷积一阶方法。你知道吗你需要把耦合系统作为一个耦合系统来求解,也就是说,两个变量的级数必须以相同的增量同时计算。你知道吗
等等
另请参见Runge Kutta problems in JS,了解JavaScript中的相同问题
另一种方法是对系统进行矢量化,这样龙格库塔过程可以保持不变,但在积分回路中,状态向量必须被构造和解包
其他一切都保持不变。你知道吗
相关问题 更多 >
编程相关推荐