#product #sympy #exponential #doit
#продукт #sympy #экспоненциальный #doit
Вопрос:
Я пытаюсь получить экспоненциальную сумму из произведения экспонент, используя SymPy. Кажется, это работает для любой базы, кроме e (число Эйлера).
Пример кода с общей базой для экспоненциального:
from sympy import symbols, Function
from sympy import Product, E, pi, exp
i,n,base=symbols('i n base')
f=Function('f')
P=Product(base**f(i),(i,1,n))
P.doit()
P — это следующее выражение:
и после применения doit() становится:
Этот код работает для любой базы. Я тестировал его с числом (например, 3,0), переменной (например, x,base) или константой, определенной в SymPy (например, pi). Просто когда base = число Эйлера, doit() не работает.
P=Product(E**f(i),(i,1,n))
P.doit()
или
P=Product(exp(f(i)),(i,1,n))
P.doit()
результат по-прежнему:
и не
Обходной путь может заключаться в том, чтобы заменить e переменной типа base и сделать противоположную замену в конце.
Но есть ли какое-либо лучшее решение?
Версии: python 3.7.4, SymPy 1.4
Ответ №1:
Я думаю, это работает для других случаев, но не exp, потому что E**x
это экземпляр класса exp
, а не Pow
. Вероятно, код sympy можно сделать согласованным, проверив оба класса.
Вы можете использовать rewrite для преобразования между произведениями и суммами, используя exp и log:
In [47]: P = Product(E**f(i), (i, 1, n))
In [48]: P
Out[48]:
n
─┬──┬─
│ │ f(i)
│ │ ℯ
│ │
i = 1
In [49]: P.rewrite(Sum)
Out[49]:
n
___
╲
╲
╱ f(i)
╱
‾‾‾
i = 1
ℯ