我试图在Python中模拟Euler的简单SIR类型模型的方法。为此,我正在做以下事情:
当我这样做时,我收到一个TypeError,如下所示:
TypeError: unsupported operand type(s) for -: 'float' and 'list'
我尝试了print-statement调试,以确保我对函数的输入(在本例中为函数s_next)都是整数和浮点数(它们都是),但我仍然收到此错误。我的代码如下。
import numpy as np
#Parameters
mu = 0.56
epsilon = 0.01 #* time_step
z = 0.05 * 0.21 #(percent with aids * aids death rate)
p = 0.25 #* time_step
q = 0.05 #* time_step #Assumption
beta = 0.01
#dS Function
def s_next(S, P, I, time_step):
return S + time_step * ((S * epsilon) + (q * P) - (p * S) - (beta * S *
I))
#dP Function
def p_next(S, P, I, time_step):
return P + time_step * ((p * S) - (q * P) - (mu * (beta * P * I)))
#dI Function
def i_next(S, P, I, time_step):
return I + time_step * ((beta * S * I) + (mu * beta * P * I) - (z * I))
#Arrays For Each Compartment
time_values = np.arange(0, 100, 0.1)
s = [0] * len(time_values)
p = [0] * len(time_values)
i = [0] * len(time_values)
s[0] = 56400
p[0] = 1000
i[0] = 10575
#For Loop For Array Iteration
for increment in range(1, len(time_values)):
s_current_value = int(s[increment - 1])
p_current_value = int(p[increment - 1])
i_current_value = int(i[increment - 1])
print('s_current_type', type(s_current_value))
print('p_current_type', type(p_current_value))
print('i_current_type', type(i_current_value))
s_next_value = s_next(s_current_value, p_current_value, i_current_value,
0.1)
p_next_value = p_next(s_current_value, p_current_value, i_current_value,
0.1)
i_next_value = i_next(s_current_value, p_current_value, i_current_value,
0.1)
s[increment] = s_next_value
p[increment] = p_next_value
i[increment] = i_next_value
答案 0 :(得分:0)
您已使用变量名p
两次。一次,在代码的顶部,然后在初始化列表时再次:
p = 0.25 #* time_step
#.....
p = [0] * len(time_values)
因此,在s_next
函数中,当您尝试执行(p * S)
时,它认为p
是您的列表而不是值0.25,这可能是您想要的。
解决方案是重命名列表或变量