假设我有一个表达式,只包含一个单词。该表达式具有依赖于符号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
。这可能吗?
答案 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)
假设您通过将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
这是你想要的吗?