Python Euler方法模拟中的TypeError

时间:2018-04-12 15:53:18

标签: python list int

我试图在Python中模拟Euler的简单SIR类型模型的方法。为此,我正在做以下事情:

  1. 为确定解的下一个值的每个微分方程建立函数(通过欧拉方法)。
  2. 初始化空白列表以保存给定时间步的每个等式的值。
  3. 运行for循环以查找等式列表中每个值的下一个值。
  4. 当我这样做时,我收到一个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
    

1 个答案:

答案 0 :(得分:0)

您已使用变量名p两次。一次,在代码的顶部,然后在初始化列表时再次:

p = 0.25 #* time_step

#.....

p = [0] * len(time_values)

因此,在s_next函数中,当您尝试执行(p * S)时,它认为p是您的列表而不是值0.25,这可能是您想要的。

解决方案是重命名列表或变量