2017-01-16 3 views
3

Я пытаюсь суммировать функцию в python, используя sympy. Моя функцияСуммирование функции с символическим выходом с sympy

x=symbols('x') 
def f(k): 
    if k==0: 
     return x 
    else: 
     return 1 

Если спросить, что F (0), я х, и я могу с радостью просить такие вещи, как

integrate(f(0),(x,0,1)) 

и я получаю 1/2, как я бы ожидать.

Но если я пишу

summation(f(i),(i,0,3)) 

я получаю 4, а не х + 3. Это кажется немного странным, тем более, что если я не указываю функцию F и пойти на

f=Function('f') 

затем

summation(f(i),(i,0,3)) 

дает мне е (0) + F (1) + F (2) + F (3). Итак, почему, когда f определяется, как указано выше, я получаю 4, а не x + 3?

Добавлено позже: Я только заметил, что мне даже не нужен символ x для того, чтобы поведение не было тем, что я ожидаю. Например

def f(k): 
    if k==0: 
     return 100 
    else: 
     return 1 

summation(f(i),(i,0,3)) 

возвращает 4, а не 103.

+0

Поскольку функция 'f' является функцией черного ящика, sympy не может ее проверять, поэтому я предполагаю, что используется суммирующая интеграция. –

+0

Откуда взялось 'i' из' sumation (f (i), (i, 0,3))?? Я чувствую, что 'f (i)' здесь просто 1, а не функция. – user2357112

+0

@ user2357112 Я забыл сказать, что там должен быть символ i = ('i'). И я не думаю, что меня можно рассматривать как 1, потому что тогда суммирование (f (i), (i, 0,3)) не даст мне f (0) + f (1) + f (2) + f (3) – Kirby

ответ

3

Когда вы делаете f(i) в

summation(f(i),(i,0,3)) 

вы звоните в f функцию:

def f(k): 
    if k==0: 
     return x 
    else: 
     return 1 

, который сравнивает i с 0, затем возвращает либо x или 1. Поскольку i == 0 вычисляет False, она возвращает 1, так что вы на самом деле просто суммированием 1 от 0 до 3.

summation никогда не видит f вообще. Он просто видит 1, потому что звонок f(i) полностью оценивается до summation. summation видит только возвращаемое значение.

+0

Спасибо - это имеет смысл. Итак, что мне делать, чтобы получить правильный вывод (где по праву я имею в виду f (0) + f (1) + f (2) + f (3) с функцией f, оцененной, как я, очевидно, намерен, поэтому давая мне x +3 в моем примере)? – Kirby

+0

@Kirby: вместо обычной функции Python с оператором 'if' вы должны использовать sympy [Кусочный] (http://docs.sympy.org/dev/modules/functions/elementary.html#piecewise). – user2357112

+0

Awesome, спасибо! – Kirby

3

Как @ user2357112 отметил, что функции Python оценить сразу, поэтому f(i) вычисляет 1 как только вы его называете (с i не равна 0).

Чтобы создать невычисленную функцию можно либо использовать Piecewise, как

expr = Piecewise((x, Eq(i, 0)), (1, True)) 
summation(expr, (i, 0, 3)) 

или подкласс Function и определить eval:

class f(Function): 
    @classmethod 
    def eval(cls, i): 
     if i.is_Integer: # Checks if i is an explicit integer, like 0, and not a symbolic expression 
      if i == 0: 
       return x 
      return 1 

summation(f(i), (i, 0, 3)) 

Метод eval говорит функцию, когда для оценки. Когда он возвращает None (здесь, когда i не является явным целым числом), он остается неоценимым.

Piecewise, вероятно, лучшее решение здесь, но подкласс Function лучше, если у вас более сложная логика.

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