2016-09-21 2 views
0

У меня есть функция H (t), возвращающая поплавок. Затем я хочу численно вычислить несколько интегралов, связанных с этой функцией. Однако один из интегралов в основном вызывает предыдущий интеграл, например.Сохранение значений функции для будущей интеграции

from scipy.integrate import quad 

def H(t): 
    return t 

def G1(t): 
    return quad(lambda x: H(x)*H(t-x),0,1)[0] 

def G2(t): 
    return quad(lambda x: G1(x)*H(t-x),0,1)[0] 

res = quad(G1,0,1) + quad(G2,0,1) 

мне нужно будет сделать это для большого числа функций (то есть по-прежнему, как это с G3, G4 ... Gn), и мой конечный результат будет зависеть от всех из них. Поскольку я должен вычислить G1 для многих значений t в любом случае для выполнения quad (G1,0,1), можно ли сохранить эти вычисленные значения и использовать их при вычислении квадранта (G2,0,1)? Я мог бы попытаться написать мою собственную упрощенную интеграционную функцию, но как бы я мог хранить и повторно использовать эти значения?

+0

Существует 'lru_cache' в стандартной библиотеке ([смотрите здесь] (https://docs.python.org/3.4/library/functools.html#functools.lru_cache)) но я не уверен, что это лучший способ решить эту проблему. Можно ли изменить формулу для того, что вы пытаетесь вычислить, то есть напишите формулу на бумаге и попробуйте манипулировать ею, пока вам не нужно только один раз оценить G1? – syntonym

+0

@syntonym К сожалению, пока (пока). Я в основном пишу эту программу, потому что мы еще не знаем, как ее переписать и анализировать, и хотим увидеть некоторые числовые результаты. – Shinja

+0

Тогда я думаю, что lru_cache стоит попробовать. Я не уверен, как именно scipy интегрируется, но он кэширует вызовы функции. Возможно, вам нужно немного настроить размер кеша, чтобы действительно кэшировать все, что захотите. – syntonym

ответ

0

Я предполагаю, что это точно так же, как lru_cache, но так как я уже написал, мог бы также поделиться:

def store_result(func): 
    def remember(t): 
     if t not in func.results: 
      func.results[t] = func(t) 
     return func.results[t] 
    setattr(func, 'results', {}) # make dictionary to store results 
    return remember 

Это декоратор, который изменяет функцию для сохранения результатов в словарь и получить те, когда они вызываются с те же аргументы. Вы можете изменить его в соответствии с вашими потребностями.

использование:

@store_result 
def G1(t): 
    return quad(lambda x: H(x)*H(t-x),0,1)[0] 
+0

Большое спасибо, даже если lru_cache решает его, это тот тип решения, который я искал, и он показывает мне, как я могу написать его в будущем. – Shinja