【问题标题】:Lotka-Volterra difference equation array-troubleLotka-Volterra 差分方程数组问题
【发布时间】:2021-12-05 17:04:23
【问题描述】:

我正在尝试编写一个程序,使用两个差分方程以图形方式绘制两个物种(狐狸和兔子)之间的 Lotka-Volterra 相互作用。

有问题的两个方程是:

rabit 的初始状态应该是R[0] = 100,fox 的初始状态应该是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:狐狸的正确初始状态是 F[0] = 20,而兔子 R[0] = 100。我将对其进行编辑以使问题更清楚。谢谢。

标签: python arrays numpy matplotlib differential-equations


【解决方案1】:

正如@Andy 在他对您的帖子的评论中指出的那样,您只设置了RF 的第 0 个索引,但是您的循环从索引 2 开始并且只回溯 1,这意味着它从不使用任一数组的第 0 个索引。因此,所有后续方程将仅使用零,因此 RF 的每个元素仅设置为 0,如 (1) 中所示。要解决此问题,请从 1 开始 for 循环并转到 N:

for n in range(1,N):
    # etc

绘图错误来自这样一个事实,即您的 X 坐标来自 10,000 个点的数组,而您的 y 坐标仅被选为 500 中的 1。您希望两者的大小均为 500,因此您应该定义 @ 987654326@如下:

t = np.arange(0,N)
plt.plot(t, R)

如果您有任何其他问题,请告诉我。

大卫

【讨论】:

  • 感谢您提供非常清晰且解释清楚的答案!你是,安迪在范围问题上是绝对正确的。现在范围现在设置为 range(1,N) 它对于较小的迭代效果很好:-) 但是,现在它已经开始产生舍入溢出错误,所以我最好检查一下我的数学。另外:我对 np.xml 不是很熟悉。安排功能。我应该使用它而不是 np.linspace 还是与 linspace 函数一起使用?
  • raceback (most recent call last): File "C:/Users/(...), line 37, in &lt;module&gt; plt.plot(t,R) File "C:\Users\(....), line 3019, in plot return gca().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 "...", 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 (500,) and (51,)
  • @David:我在尝试使用 np.arange(0,500) 绘图时也遇到了这个错误
  • @fredericoamigo 请注意,我使用的是arange,带有一个r。我还将 500 更改为 N 以使其更通用,其中 N 是您想要的迭代次数。
  • 哈哈,操作!对不起,我的英语拼写有时可能不太理想。挪威语是我的母语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2019-07-05
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多