我正在嘗試撰寫一個程式,該程式使用兩個差分方程以圖形方式繪制兩個物種(狐貍和兔子)之間的 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,)
有沒有好心人幫我解決這個問題?也許還提供解決方案?
感謝并歡迎所有幫助。
uj5u.com熱心網友回復:
正如@Andy 在他對您的帖子的評論中所指出的,您只設定了Rand的第 0 個索引F,但是您的回圈從索引 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)
如果您有任何其他問題,請告訴我。
大衛
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/324137.html
標籤:Python 数组 麻木的 matplotlib 微分方程
下一篇:C#中隨陣列變化而變化的變數值
