Sympy не будет вычислять этот интеграл

Я пытаюсь запустить следующий пример в sympy

import sympy as sp
from sympy.parsing.sympy_parser import parse_expr

n, L, x = sp.symbols('n L x')    
sp.integrate(sp.cos(sp.pi*x/L)**2, (x, -L/2, L/2))

По какой-то причине он на самом деле не решает этот интеграл. Он просто выводит исходный интеграл.

>>> sp.integrate(sp.cos(sp.pi*x/L)**2, (x, -L/2, L/2))
  L
  -
  2
  /
 |
 |     2/pi*x\
 |  cos |----| dx
 |      \ L  /
 |
/
-L
---
 2

Wolfram Alpha, с другой стороны, не имеет этой проблемы.


person ReckoningReckoner    schedule 21.09.2017    source источник
comment
В чем именно заключается ваш вопрос?   -  person Rory Daulton    schedule 21.09.2017
comment
Не оцените сарказма. Очевидно, что этот интеграл вычислим, а SymPy этого не делает. Почему это так?   -  person ReckoningReckoner    schedule 21.09.2017
comment
Сарказма не было. Я могу придумать другие вопросы, которые вы могли бы задать. У вас больше шансов получить хорошие ответы здесь, если вы сделаете свои вопросы четкими и ясными. Это также помогает избежать критики людей, пытающихся вам помочь. Вы можете удалить свой комментарий и добавить соответствующую информацию к своему основному вопросу.   -  person Rory Daulton    schedule 21.09.2017


Ответы (1)


Это кажется немного раздражающим, но sympy не вычисляет интеграл, потому что недостаточно знает о L. В частности, он оставляет дверь открытой для возможности L=0, которая нанесет ущерб вашему подынтегральному выражению. Чтобы преодолеть это, нам просто нужно сообщить sympy, что L не равно нулю. Самый простой способ сделать это — передать аргумент symbols во время создания экземпляра:

import sympy as sp
n, x = sp.symbols('n x')    
L = sp.symbols('L', nonzero=True)
sp.integrate(sp.cos(sp.pi*x/L)**2, (x, -L/2, L/2))
#>>> L/2
person saintsfan342000    schedule 27.09.2017