2013-09-13 3 views
1

Я пытаюсь построить простую модель системы отопления, представленную системой ODE, и решается с помощью функции odeint scipy.Включение реальных данных при решении системы ODE с использованием scipy.integrate.odeint

Я хотел бы включить «настоящие» данные в эту модель, например, внешнюю температуру (имитацию синусоиды ниже). В приведенном ниже коде показано мое текущее решение/хак, который использует функцию FindVal для интерполяции реальных данных на метку времени, которую оценивает odeint.

Это очень медленно, поэтому я ищу предложения относительно того, как это можно сделать в лучшем виде.

Вот код ...

from scipy.integrate import odeint 
from numpy import linspace 
from numpy import interp 
from numpy import sin 
from numpy.random import randint 
from numpy import array 
from numpy import zeros 
from numpy import where 

def FindVal(timeseries, t): 
    ''' finds the value of a timeseries at the time given by the ode solver 
      INPUTS: timeseries - [list of times, list of values] 
        t - timestamp being evaluated 
      OUTPUTS: interpolated value at t 
     ''' 

    ts_t = timeseries[0]  
    ts_v = timeseries[1] 

    # if t is beyond the end of the time series chose the last value 
    if t > ts_t[-1]: 
     val = ts_v[-1] 

    else: 
     val = interp(t, ts_t, ts_v) 

    return val 

def SpaceHeat(Tin, t): 
    ''' calculates the change in internal temperature 
     INPUTS: Tin - temperature at t - 1 
       t - timestep 
     OUTPUTS: dTdt - change in T 
    ''' 

    # unpack params 
    ma = params['ma'] # mass of air 
    ca = params['ca'] # heat capacity of air 
    hlp = params['hlp'] # heat loss parameter 
    qp = params['qp'] # heater power 

    Touts = params['Tout'] # list of outside temps 
    Tout = FindVal(Touts, t) # value of Tout in this timestep 
    Qonoffs = params['Qonoff'] # list of heater on/offs 
    Qonoff = FindVal(Qonoffs, t) # heater state at this timestep 

    qin = qp * Qonoff # heat input 

    qmass = 0 # ignore mass effects for now 

    # calculate energy lost 
    qloss = (Tin - Tout) * hlp # 

    # calculate the change in temperature 
    dTdt = (qin - qmass - qloss)/(ma * ca) 
    return dTdt 

def Solve(timeline, Qonoff): 

    # simulate the outside temp as a sinewave 
    Tout = [timeline, (sin(0.001 * timeline + 1500) * 10) + 2] # outside temp 

    # create a dict of model parameters 
    global params 
    params = {'ma' : 1000.0 * 250, # air mass, kg 
      'ca' : 1.0, # air heat capacity j/kg 
      'hlp' : 200.0, # home heat loss parameter wk 
      'qp' : 10000.0, # heater output w 
      'Qonoff' : Qonoff, # list of on off events 
      'Tout' : Tout, 
      } 

    # set the initial temperature 
    Tinit = 10.0 
    # solve 
    temps = odeint(SpaceHeat, Tinit, timeline) 

    return temps 

# create a timeline for the simulation 
timeline = linspace(0, 6000, 96) 

# calculate the optimum control 
Qonoff = zeros(len(timeline)) 

temps = Solve(timeline, qonoff) 

ответ

0

Это было давно, и мое знание переместилась на значительно ....

Ответ на этот вопрос является то, что вы должны решить ОДУ на каждом шаге внешних данных, которые вы хотите использовать, используя результаты предыдущей интеграции в начале этого нового состояния.

0

Одна строка отсутствует, qonoff не определен.

Qonoff = zeros(len(timeline)) 
qonoff = [timeline, zeros(len(timeline))] 
temps = Solve(timeline, qonoff) 

Это еще не решение, просто комментарий.

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