【发布时间】:2021-11-19 15:49:49
【问题描述】:
我下面的代码在运行时会在图上绘制 100 条曲线,以获取 ODE 系统中参数的随机值。但是,我试图获取每个时间点的“横截面”,因此我将在该点获取所有 100 个值,然后获取这些值的上下四分位数和中位数(在代码中将是数组或列表),并绘制它们:
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import random
N = 1000
I0, R0 = 1, 0
S0 = N - I0 - R0
J0 = I0
beta, gamma = 2/7, 1/7
t = np.linspace(0, 100,100)
empty = []
for i in range(100):
empty.append(random.uniform(1.5, 2.5)*gamma)
def deriv(y, t, N, beta, gamma):
S, I, R, J = y
dS = ((-beta * S * I) / N)
dI = ((beta * S * I) / N) - (gamma * I)
dR = (gamma * I)
dJ = ((beta * S * I) / N)
return dS, dI, dR, dJ
solns = []
for empt in empty:
ces = odeint(deriv, (S0, I0, R0, J0), t, args=(N, empt, gamma))
solns.append(ces)
J_diffs = []
for sol in solns:
S, I, R, J = sol.T
J_diffs.append(np.diff(J))
fig = plt.figure(facecolor='w')
ax = fig.add_subplot(111, facecolor='#dddddd', axisbelow=True)
ax.set_xlabel('Time in days')
ax.set_ylabel('Number')
ax.grid(b=True, which='major', c='w', lw=2, ls='-')
xcoords = [2.5, 97.5]
for J_diff in J_diffs:
ax.plot(t[1:], J_diff, 'blue', alpha=1, lw=2)
我已经尝试过,正在使用:
for val in solns:
ax.plot(t[1:], np.percentile(val,25), 'blue', alpha=1, lw=2)
但这是维度的错误,因为它仅检索 1 个值,而不是所有值。 然后我尝试了
for t in solns:
ax.plot(t[1:], np.percentile(val,25), 'blue', alpha=1, lw=2)
因为我认为选择与每个值对应的时间点更有意义,但这会返回相同的错误。我相信我错过了如何实现这一目标的合乎逻辑的方法。最终结果是有 3 条曲线,一条显示由所有值的 97.5 个百分位组成的曲线,一条用于 2.5,一条用于 0.5th。我的方法哪里出错了?
【问题讨论】: