为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

达令说 2021-11-16 18:21:59
我正在用 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 年后的人口。


查看完整回答
反对 回复 2021-11-16
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信