带有Runge Kutta的Lotka Volterra达不到所需的精度

问题描述 投票:2回答:1

人口随时间推移(每个峰的高度应相同)>>

“”

我已经编写了一个代码,使用Runge-Kutta 4阶模拟小鼠和狐狸的种群。但是结果却不尽如人意。每个峰都应该几乎处于同一高度我认为步长不是问题。你有个主意吗?

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 4阶模拟老鼠和狐狸的种群。但是结果却不尽人意。.每个...] >

python simulation numerical-methods runge-kutta
1个回答
2
投票

在Runge-Kutta实现中,xn是时间变量,yn是标量状态变量。 f是标量ODE y'(x)=f(x,y(x))的标量ODE功能。但是,这不是应用RK4过程的方式,您的ODE函数是自治的,不包含时间变量,而是包含两个耦合的状态变量。按照实现,结果应该是没有特定类型的复杂的一阶方法。


您需要将耦合系统解决为耦合系统,也就是说,两个变量的阶段必须以相同的增量同时计算。

© www.soinside.com 2019 - 2024. All rights reserved.