我正在用 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 parametersa = 0.02 # related to conversion of unallocated resources into populationb = 0.0001 # related to growth of knowledgeW0 = 0.0 # initial amount of knowledge# time periodTmax = 600 # years这是我运行 odeint 并绘制结果的位置:# Put your code heret = np.arange(0, Tmax, 0.1)P0 = 5R0 = 1y0 = [P0,R0,W0]soln = odeint(derivs3, y0, t)PSol = soln[:, 0]RSol = soln[:, 1]WSol = soln[:, 2]P0 = 1R0 = 5y0 = [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 年的线,因为我没有调整它们,知道它们会返回相同的问题):这是图表。我知道这是对的(询问帮助室),所以它必须是关闭的索引值。
1 回答
噜噜哒
TA贡献1784条经验 获得超7个赞
我没有看到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 年后的人口。
添加回答
举报
0/150
提交
取消