猿问

如果当时的条件没有返回正确的值

我正在用 Python 来回答这个问题,即一群外星人是否应该带来 500 万人口和 100 万资源负载 vs 1M 人口和 500 万负载......我试图找出哪个这两种选择将使 200 年后新星球上的人口最大化。这是我的代码:


这是我的导数函数


def derivs3(y1, t):

    c = P0 + R0

    r = a / c

    q = (a + b) / c

    Pi = y1[0]

    Ri = y1[1]

    Wi = y1[2]

    # the model equations

    dPdt = q * Pi*Ri/(1+Wi)

    dRdt = - q * Pi*Ri/(1+Wi) + (a / q) * Wi / (t + .0001)

    dWdt = b

    return [dPdt, dRdt, dWdt]

在这里,我定义了我的参数:


# model parameters

a = 0.02   # related to conversion of unallocated resources into population

b = 0.0001   # related to growth of knowledge

W0 = 0.0     # initial amount of knowledge


# time period

Tmax = 600 # years

这是我运行 odeint 并绘制结果的位置:


# Put your code here

t  = np.arange(0, Tmax, 0.1)

P0 = 5

R0 = 1

y0 = [P0,R0,W0]

soln = odeint(derivs3, y0, t)

PSol = soln[:, 0]

RSol = soln[:, 1]

WSol = soln[:, 2]


P0 = 1

R0 = 5

y0 = [P0,R0,W0]

soln = odeint(derivs3, y0, t)

PSol2 = soln[:, 0]

RSol2 = soln[:, 1]

WSol2 = soln[:, 2]


plt.plot(t,PSol)

plt.plot(t,PSol2)

plt.legend(("5Bil Aliens, 1Bil Resources","1Bil Aliens, 5Bil Resources"), loc='upper left', prop={'size':15}, bbox_to_anchor=(1,1))

plt.grid()

plt.xlabel("time (years)")

plt.ylabel("Population (billions)")

plt.title("Populations vs. Time")

这就是问题出现的地方:


if PSol[200] > PSol2[200]:

    print("To maximize population after 200 years (for a total of", round(PSol[200],2),"billion aliens), the aliens should take a population of 5 Billion Aliens, and a load of 1 Billion Resources.")

elif PSol[200] < PSol2[200]:

    print("To maximize population after 200 years (for a total of", round(PSol2[200],2),"billion aliens), the aliens should take a population of 1 Billion Aliens, and a load of 5 Billion Resources.")

else:

所以它返回以下打印语句,这些语句与我得到的图表不一致。这可能是索引的问题,但我使用 PSol[200] 和 PSol2[200] 因为我想知道如果他们想在 200 年后最大化人口,他们应该带多少外星人和资源。见下文(忽略大约 600 年的线,因为我没有调整它们,知道它们会返回相同的问题):


这是图表。我知道这是对的(询问帮助室),所以它必须是关闭的索引值。

达令说
浏览 171回答 1
1回答

噜噜哒

我没有看到t您的代码中定义的位置,但问题似乎是(如您所建议的)来自t[200] != 200. 只需添加print t[200]一行,这将相对容易检查。如果情况确实如此,您将需要确定哪个索引t==200或进行插值。我倾向于使用numpy.interp 进行插值,因为这将允许您调查不是时间步长整数倍的时间。PSol_200 = np.interp(200, t, PSol)PSol2_200 = np.interp(200, t, PSol2)编辑: 通过您最近的编辑,我们可以看到您的时间步长是 0.1 而不是 1,因此t==200应该出现在索引 2000 而不是 200。您正在比较 20 年后而不是 200 年后的人口。
随时随地看视频慕课网APP

相关分类

Python
我要回答