我正在研究蚊帐对蚊子种群的影响以及它如何影响疟疾的传播。 EIR告诉我们一个人一年内感染的叮咬数量。为了计算这个,我必须在python中使用recursisve函数S(t)求和。该系列在大约50次迭代后收敛但是如果我将总和限制增加到20以上则需要很长时间(大约一个小时)。我可能做错了,我将非常感谢你的帮助。用python编写的代码如下所示。
{
"name": "John",
"age": 23,
"address": "Lorem ipsum"
...
...
}
答案 0 :(得分:4)
def S(x):
if x<=n:
return 0
elif x==n+1:
return 0.05
else:
return S(x-1) + ((kappa*Q_0*(1-S(x-1)))/f_chiLLIN)
# ^^^^^^ ^^^^^^
在S(x)
中,您进行2次递归调用以计算S(x-1)
,这会对计算S(x-2)
进行4次递归调用,这会对计算S(x-3)
进行8次递归调用,并且等等,直到你遇到递归的基本情况。你不需要重新计算这些东西;只需计算一次S(x-1)
并使用该值两次:
def S(x):
if x<=n:
return 0
elif x==n+1:
return 0.05
else:
s_lower = S(x-1)
return s_lower + ((kappa*Q_0*(1-s_lower))/f_chiLLIN)
但是,这仍然会进行比必要更多的重新计算,因为每次拨打S
时都会:
for x in xrange(1,totalx+1):
B = B + ((p_chiLLIN)**x)/f_chiLLIN*S(x)
它必须再次将S
的所有值重新计算到基本情况。请考虑进一步的更改,例如memoizing S
。