2015-07-30 1 views
1

Я пытаюсь решить дифференциальное уравнение с odeint и для определенных выходов, я получаю сообщение: «Избыточная работа, выполняемая на этом вызове (возможно, неправильная Dfun тип)."Python odeint: излишняя работа над этим вызовом (возможно, неправильный тип Dfun)

Я запустить функцию с full_output = 1, и это то, что я получаю:

lsoda-- at current t (=r1), mxstep (=i1) steps 
     taken on this call before reaching tout  
     in above message, i1 =  500 
     in above message, r1 = 0.1799966984891D+05 
Excess work done on this call (perhaps wrong Dfun type). 
Run with full_output = 1 to get quantitative information. 
{'hu': array([ 0.00301005, 0.00082527, 0.00232656, 0.00026312, 0.04182098, 
     0.  , 0.  , 0.  , 0.  , 0.  ]), 
'imxer': -1, 
'leniw': 26, 
'lenrw': 116, 
'message': 'Excess work done on this call (perhaps wrong Dfun type).', 
'mused': array([   2,   2,   2,   1,   2, 
       0, -1014454328,  32533,   48,   0], dtype=int32), 
'nfe': array([  513,  825,  1328,  2496,  3872,  0, 
     27648176,  0,  48,  0], dtype=int32), 
'nje': array([   30,   59,   103,   183,   268, 
      32533, -1129892592,  32533,   48,   0], dtype=int32), 
'nqu': array([   1,   1,   1,   2,   1, 
       0, -1014454328,  32533,   48,   0], dtype=int32), 
'nst': array([  184,  268,  401,  803,  1303,  0, 
     27648176,  0,  48,  0], dtype=int32), 
'tcur': array([ 3.60000104e+003, 7.20000056e+003, 1.08000006e+004, 
     1.44000002e+004, 1.79996698e+004, 4.74303020e-322, 
     0.00000000e+000, 6.90364637e-310, 6.90364883e-310, 
     6.90364637e-310]), 
'tolsf': array([ 6.90364882e-310, 6.90364882e-310, 6.90364882e-310, 
     6.90364882e-310, 6.90364882e-310, 4.79243676e-322, 
     1.87610085e-316, 6.90365099e-310, 6.90364141e-310, 
     3.21142670e-322]), 
'tsw': array([ 7.84480753e-003, 7.84480753e-003, 7.84480753e-003, 
     1.43999973e+004, 1.44001827e+004, 1.36600614e-316, 
     1.36600139e-316, 1.36600614e-316, 1.36600614e-316, 
     1.36600139e-316])} 

Я понятия не имею, что случилось с ОДОЙ, что я решение, хотя. Вот его код:

def computeDiffEquations(state,t, m_coll_vals, m_load_vals): 
#assign variables 
Tout_coll = state[0] 
T_tank = state[1:] 
m_coll = valueAt(m_coll_vals, t) 
m_load = valueAt(m_load_vals, t) 

#calculate collector temperature 
Tin_coll = T_tank[-1] 
Tave_coll = (Tin_coll + Tout_coll)/2. 
eta = c_0 - c_1 * ((Tave_coll - T_amb)/(I_coll)) - c_2 * (math.pow(Tave_coll-T_amb, 2.)/(I_coll)) 
Tout_coll_dot = (eta * A_coll * I_coll - m_coll * c_p * (Tout_coll - Tin_coll))/coll_cap 

#calculate tank temperature 
#build the Qcondution 
T_tank_minus1 = np.insert(T_tank, 0, T_tank[0])[:-1] 
T_tank_plus1 = np.insert(T_tank, len(T_tank), T_tank[-1])[1:] 
Q_cond = (th_cond * A_node/L_node) * (T_tank_minus1 - 2. * T_tank + T_tank_plus1) 

#build the Qflow 
if m_coll >= m_load : 
    Q_flow = c_p * ((m_coll - m_load) * T_tank_minus1 - (m_coll - m_load) * T_tank) 
    Q_flow[0] = c_p * (m_coll * Tout_coll - (m_coll - m_load) * T_tank[0] - m_load * T_tank[0]) 
    Q_flow[-1] = c_p * ((m_coll - m_load) * T_tank_minus1[-1] + m_load * T_chiller_out - m_coll * T_tank[-1]) 
else: 
    Q_flow = c_p * ((m_load - m_coll) * T_tank_plus1 - (m_load - m_coll) * T_tank) 
    Q_flow[0] = c_p * (m_coll * Tout_coll + (m_load - m_coll) * T_tank_plus1[0] - m_load * T_tank[0]) 
    Q_flow[-1] = c_p * (- (m_load - m_coll) * T_tank[-1] + m_load * T_chiller_out - m_coll * T_tank[-1]) 

#build the Qloss   
Q_loss = U_loss * A_loss * (T_amb - T_tank) 

#assemble the equations 
T_tank_dot = (Q_loss + Q_cond + Q_flow)/(rho * c_p * V_node) 

return np.concatenate((np.array([Tout_coll_dot]),T_tank_dot)) 

Любая идея, почему я делаю эту ошибку? Заранее спасибо!

ответ

1

Это действительно похоже на дубликат этого question, который имеет красивый ответ: хорошие объяснения проблемы и два решения, чтобы обойти это.

 Смежные вопросы

  • Нет связанных вопросов^_^