Разбивка выражения SymPy на группы, включающие только один символ - PullRequest
0 голосов
/ 12 мая 2018

Предположим, у меня есть выражение в sympy, которое состоит только из одного термина. Это выражение либо имеет подвыражения, которые зависят от символа x, символа y, либо ни от x, ни от y. Мне бы хотелось, чтобы sympy вернул три выражения: первое зависит только от x, второе - только от y, а третье - ни от одного, так что произведение трех выражений является исходным выражением. Э.Г.

expr = x^2*cos(x)*2/sin(y)/y

должен вернуть x^2 * cos(x) и 1/sin(y)/y и 2. Это возможно?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

В общем, это невозможно: например, sqrt(x+y) нельзя разделить на функцию от x от функции y. Но когда факторизация возможна, метод as_independent может помочь найти ее:

expr = x**2*cos(x)*2/sin(y)/y
temp, with_x = expr.as_independent(x, as_Mul=True)
const, with_y = temp.as_independent(y, as_Mul=True)
print((with_x, with_y, const))

отпечатков (x**2*cos(x), 1/(y*sin(y)), 2)

С подсказкой as_Mul метод пытается разделить выражение на фактор, который не зависит от заданной переменной, и остальное. Таким образом, первый шаг изолирует термин без x (называемый temp), от которого второй шаг изолирует термин без y (постоянный).

Такое можно сделать и для сумм, а не для продуктов, с подсказкой as_Add=True.

0 голосов
/ 12 мая 2018

Предполагая, что у вас есть один термин expr, составленный путем умножения терминов на x, y и других символов или констант, вы можете сделать что-то вроде следующего:

from sympy import sin, cos, Mul, init_printing
from sympy.abc import x,y

init_printing()
expr = x**2*cos(x)*2/sin(y)/y

def splitXYC(expr):
    xterm = Mul(*[t for t in expr.args if t.has(x)])
    yterm = Mul(*[t for t in expr.args if t.has(y)])
    others = Mul(*[t for t in expr.args if not (t.has(x) or t.has(y)) ])
    return xterm, yterm, others

X,Y,C = splitXYC(expr)
print(X) # Prints x**2*cos(x)
print(Y) # Prints 1/(y*sin(y))
print(C) # Prints 2

Это то, что вы хотели?

...