将SymPy表达式分解为仅涉及一个符号的组

时间:2018-05-12 03:42:35

标签: python sympy symbolic-math

假设我有一个表达式,只包含一个单词。该表达式具有依赖于符号x,符号y,或者既不依赖于x也不依赖于y的子表达式。我想同情返回三个表达式,第一个仅依赖于x,第二个仅依赖于y,第三个表示两者都没有,这样三个表达式的乘积就是原始表达式。 E.g。

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

应该返回x^2 * cos(x)1/sin(y)/y以及2。这可能吗?

2 个答案:

答案 0 :(得分:2)

一般来说,这是不可能的:例如,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也可以为sums而不是产品做这样的事情。

答案 1 :(得分:1)

假设您通过将exprx中的字词与其他符号或常数相乘来构成单个字词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

这是你想要的吗?