代码之家  ›  专栏  ›  技术社区  ›  dbrane

将Symphy表达式分解为只涉及一个符号的组

  •  3
  • dbrane  · 技术社区  · 6 年前

    假设我在Symphy中有一个表达式,它只包含一个术语。此表达式的子表达式要么依赖于符号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 回复  |  直到 6 年前
        1
  •  3
  •   user6655984 user6655984    6 年前

    一般来说,这是不可能的:例如, 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

        2
  •  1
  •   user6764549 user6764549    6 年前

    假设你只有一个学期 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
    

    这是你想要的吗?