Линейная комбинация неоцененных функций - PullRequest
1 голос
/ 27 февраля 2012

Я строю класс для построения определенного типа аппроксимирующей функции (математической функции). Эта аппроксимирующая функция будет линейной комбинацией заданного числа базисных функций, которые я храню в списке, и она возвращает скаляр. Метод класса должен обновлять мою аппроксимирующую функцию в каждой итерации, умножая каждую базисную функцию на скаляр (разные скаляры для разных базисных функций) и формируя сумму. Другими словами, мне нужно обновить мою аппроксимирующую функцию, сформировав линейную комбинацию базисных функций и установив мою аппроксимирующую функцию на эту неоцененную сумму функций.

Основой по умолчанию для этого класса является полиномиальная основа, которую я реализовал с помощью poly1d класса NumPy . Способ, которым я формирую линейную комбинацию, в настоящее время

sum(self.basis[i]*self.coeffs[i] for i in range(self.dim))

где (очевидно) self.basis - список базисных функций, self.coeffs - список скаляров, умножаемых на базисные функции, а self.dim - количество базисных функций. Это работает для класса poly1d, но не, например, если я использую базу вроде:

basis1 = [lambda x: float(x), lambda y: float(y)**2]

или

def x(y):
    return y
def x2(y):
    return y**2
basis2 = [x, x2]

Basis1 дает мне ошибку

TypeError: only length-1 arrays can be converted to Python scalars

Basis2 дает мне ошибку

TypeError: unsupported operand type(s) for *: 'function' and 'numpy.float64'

Аналогично, используя

sum(itertools.imap(operator.mul, self.basis, self.lambdas))

работает для базы poly1d, но не для других баз выше, и выдает те же сообщения об ошибках.

Итак, мой вопрос: как мне сформировать линейную комбинацию неоцененных функций в Python (используя или не используя NumPy)?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Быстрый способ объединить базис функции с коэффициентами - это словарь Python:

 f = lambda x : x+1
 g = lambda x : 2*x
 d = { f : 7, g : 3 }
 print(d)
 d[f]=8
 print(d)
 def app (d,x): return  np.sum([ v * k(x) for k,v in d.items() ] )
 print(app(d,0))

Это печатает:

{<function <lambda> at 0x115e7dc08>: 7, <function <lambda> at 0x115e7de60>: 3}
{<function <lambda> at 0x115e7dc08>: 8, <function <lambda> at 0x115e7de60>: 3}
8

Затем вам нужно будет получить подкласс Dict для обработки математических операций, которые вам нужны.

Еще проще было бы разделить списки coef и функций и работать только со списком coef, пока вам не понадобится выполнить оценку.

0 голосов
/ 27 февраля 2012

TypeError - это когда массив либо равен нулю, либо не является массивом, либо пустым, либо NaN и т. Д., Поэтому, возможно, попробуйте вывести x и x2 и сравнить с тем, что находится внутри суммы. Более сложную математику обычно можно разбить на атомарные операции, поэтому проще отладить этот материал с помощью распечаток, чтобы увидеть, что является результатом предыдущей операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...