Lotka-Volterra差分方程数组-麻烦
Lotka-Volterra difference equation array-trouble
我正在尝试编写一个程序,使用两个差分方程以图形方式绘制两个物种(狐狸和兔子)之间的 Lotka-Volterra 相互作用。
有问题的两个方程是:
兔子的初始状态应该是 R[0] = 100
,狐狸的初始状态应该是 F[0] = 20
通常,当我在python中遇到数值求解差分方程时,我会这样写:
import numpy as np
N = 15
x = np.zeros(N+1, int)
x[0] = 1
x[1] = 1
for n in range(2, N+1):
x[n] = x[n-1] + x[n-2]
print(f"x[{n}] = {x[n]}")
我认为类似于上述策略的方法也可以解决 'Lotka-Volterra-difference-equation' 问题。
所以我尝试了以下代码并得到了一些令人不快的惊喜:
import numpy as np
import matplotlib.pyplot as plt
N = 500
a = 0.4
b = 0.1
c = 0.005
e = 0.2
R = np.zeros(N+1)
F = np.zeros(N+1)
t = np.linspace(0,500,num=10_000)
R[0] = 100
F[0] = 20
for n in range(2,N):
# Rabbit
R[n] = R[n-1] + a*R[n-1] - c*R[n-1] * F[n-1]
#Fox
F[n] = F[n - 1] + e * c * R[n - 1] * F[n - 1] - b * F[n - 1]
print(R[n],F[n])
plt.plot(t,R[n])
plt.show()
代码的问题是:
1.除了
,我不生产任何其他印刷品
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
2。如果您尝试使用 matplotlib/pyplot.
绘制它,它会给出很多错误消息
File "C:/Users/(...)lotka_volterra.py", line 36, in <module>
plt.plot(t,R[n])
File "C:\Users\(...)\lib\site-packages\matplotlib\pyplot.py", line 3019, in plot
return gca().plot(
File "C:\Users\(...)\lib\site-packages\matplotlib\axes\_axes.py", line 1605, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File "C:\Users\(...)\lib\site-packages\matplotlib\axes\_base.py", line 315, in __call__
yield from self._plot_args(this, kwargs)
File "C:\Users\(...)\lib\site-packages\matplotlib\axes\_base.py", line 501, in _plot_args
raise ValueError(f"x and y must have same first dimension, but "
ValueError: x and y must have same first dimension, but have shapes (10000,) and (1,)
有好心人帮我解决这个问题吗?也许还提供解决方案?
感谢并欢迎所有帮助。
正如@Andy 在他对您的 post 的评论中所指出的,您只设置了 R
和 F
的第 0 个索引,但是您的循环从索引 2 开始并且只回顾 1,这意味着它从不使用任一数组的第 0 个索引。因此,所有后续方程将仅使用零,因此 R
和 F
的每个元素都仅设置为 0,如您在 (1) 中所见。要解决此问题,请从 1 开始 for 循环并转到 N:
for n in range(1,N):
# etc
绘图错误是因为您的 X 坐标来自 10,000 个点的数组,而您的 y 坐标仅从 500 个点中选出 1 个。您希望两者的大小均为 500,因此您应该定义 t
如下:
t = np.arange(0,N)
plt.plot(t, R)
如果您有任何其他问题,请告诉我。
大卫
我正在尝试编写一个程序,使用两个差分方程以图形方式绘制两个物种(狐狸和兔子)之间的 Lotka-Volterra 相互作用。
有问题的两个方程是:
兔子的初始状态应该是 R[0] = 100
,狐狸的初始状态应该是 F[0] = 20
通常,当我在python中遇到数值求解差分方程时,我会这样写:
import numpy as np
N = 15
x = np.zeros(N+1, int)
x[0] = 1
x[1] = 1
for n in range(2, N+1):
x[n] = x[n-1] + x[n-2]
print(f"x[{n}] = {x[n]}")
我认为类似于上述策略的方法也可以解决 'Lotka-Volterra-difference-equation' 问题。
所以我尝试了以下代码并得到了一些令人不快的惊喜:
import numpy as np
import matplotlib.pyplot as plt
N = 500
a = 0.4
b = 0.1
c = 0.005
e = 0.2
R = np.zeros(N+1)
F = np.zeros(N+1)
t = np.linspace(0,500,num=10_000)
R[0] = 100
F[0] = 20
for n in range(2,N):
# Rabbit
R[n] = R[n-1] + a*R[n-1] - c*R[n-1] * F[n-1]
#Fox
F[n] = F[n - 1] + e * c * R[n - 1] * F[n - 1] - b * F[n - 1]
print(R[n],F[n])
plt.plot(t,R[n])
plt.show()
代码的问题是:
1.除了
,我不生产任何其他印刷品0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
2。如果您尝试使用 matplotlib/pyplot.
绘制它,它会给出很多错误消息File "C:/Users/(...)lotka_volterra.py", line 36, in <module>
plt.plot(t,R[n])
File "C:\Users\(...)\lib\site-packages\matplotlib\pyplot.py", line 3019, in plot
return gca().plot(
File "C:\Users\(...)\lib\site-packages\matplotlib\axes\_axes.py", line 1605, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File "C:\Users\(...)\lib\site-packages\matplotlib\axes\_base.py", line 315, in __call__
yield from self._plot_args(this, kwargs)
File "C:\Users\(...)\lib\site-packages\matplotlib\axes\_base.py", line 501, in _plot_args
raise ValueError(f"x and y must have same first dimension, but "
ValueError: x and y must have same first dimension, but have shapes (10000,) and (1,)
有好心人帮我解决这个问题吗?也许还提供解决方案?
感谢并欢迎所有帮助。
正如@Andy 在他对您的 post 的评论中所指出的,您只设置了 R
和 F
的第 0 个索引,但是您的循环从索引 2 开始并且只回顾 1,这意味着它从不使用任一数组的第 0 个索引。因此,所有后续方程将仅使用零,因此 R
和 F
的每个元素都仅设置为 0,如您在 (1) 中所见。要解决此问题,请从 1 开始 for 循环并转到 N:
for n in range(1,N):
# etc
绘图错误是因为您的 X 坐标来自 10,000 个点的数组,而您的 y 坐标仅从 500 个点中选出 1 个。您希望两者的大小均为 500,因此您应该定义 t
如下:
t = np.arange(0,N)
plt.plot(t, R)
如果您有任何其他问题,请告诉我。
大卫