2016-05-02 2 views
0

Проблема: Я хочу, чтобы численно интегрировать функцию f(t,N), которая может быть записана в виде линейной комбинации N других известных функций g_1(t), ..., g_N(t).Линейная комбинация функции объектов в Python

Мое решение I: Я знаю функции g_i, а также коэффициенты, так что моя первоначальная идея состояла в том, чтобы создать вектор-строку коэффициентов и вектор-столбец, содержащий лямбда-функции g_i, а затем использовать np.dot для внутреннего продукта получить объект функции, который я хочу. К сожалению, вы не можете просто добавить два объекта функции и не умножать объект функции на скаляр.

My Solution II: Конечно, я могу сделать что-то подобное (в основном определение точечно, что я хочу):

def f(t,N,a,g): 
""" 
a = numpy array of coefficients 
g = numpy array of lambda functions corresponding to functions g_i 
""" 
    res = 0 
    for i in xrange(N): 
     res += a[i] * g[i](t) 
    return res 

Но петля for, конечно, не очень велика, особенно когда:

  1. мне нужно запустить эту функцию в много много шагов по времени т
  2. я прохожу эту функцию п в числовую интеграции рутину, как scipy.integrate.quad.
+0

Если ваш 'g [i]' - полиномы, то вы можете легко их комбинировать заранее, используя класс полиномов. Но если это не так, я думаю, вы застряли, называя их в цикле для каждого 't'. –

+0

как насчет использования numexpr, cython, anano или sympy? –

+0

@ PM2Ring: они являются синусами и косинусами и образуют усеченный базис L^2 [0,1]. Таким образом, не существует способа сразу вызвать массив лямбда-функций? – sbm

ответ

0

кратко:

В Cython Вы можете ускорить индексацию с помощью memoryviews.

Если эти уравнения линейны Вы можете наложить их с помощью SymPy:

пример:

import sympy as sy 
x,y = sy.symbols('x y') 

g0 = x*0.33 + 6 
g1 = x*0.72 + 1.3 
g2 = x*11.2 - 6.5 
gn = x*3.3 - 7.3 

G = [g0,g1,g2,gn] 
#this is superimposition 
print sum(G).subs(x,15.1) 
print sum(gi.subs(x,15.1) for gi in G) 
''' 
output: 
228.305000000000 
228.305000000000 
''' 

Если его не то, что вы хотите, дать некоторый пример ввода и вывода, так что я могу попробовать и DonT go blind ...

С низким разрешением ram Вы можете получить окончательное уравнение для numexpr и оценить его с помощью некоторого ввода. В противном случае лучше всего работать с массивами numpy.

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