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

SYMPY:如何简化sqrt比率?

  •  0
  • Stef1611  · 技术社区  · 4 年前

    我想简化sqrt比率。 例如:

    import sympy as sp
    a,b=sp.symbols("a b", real=True)
    myExpr=sp.sqrt(b/a)*sp.sqrt(a/b)
    

    为什么myExpr不能简化为 ?

    我尝试了很多不起作用的事情:

    myExpr.simplify()
    ...
    myExpr.refine(sp.Q.positive(a)&sp.Q.positive(b)&sp.Q.real(a)&sp.Q.real(b))
    

    如何简化这些表达式?

    我的表达比这个简单的例子要复杂得多。它是项的乘积之和。例如,总和的一项是:

    myExpr=sp.sqrt((2*a**2+1-2*a*sp.sqrt(a**2+1))/(a**2+1-a*sp.sqrt(a**2+1)))/sp.sqrt(a**2+1-a*sp.sqrt(a**2+1))*sp.sqrt((2*b**2+1-2*b*sp.sqrt(b**2+1))/(b**2+1-b*sp.sqrt(b**2+1)))/sp.sqrt(b**2+1-b*sp.sqrt(b**2+1))
    

    它的简化(手工完成)是

    mySimplif=sp.sqrt((2*a**2+1-2*a*sp.sqrt(a**2+1)))/(a**2-a*sp.sqrt(a**2+1)+1)+sp.sqrt((2*b**2+1-2*b*sp.sqrt(b**2+1)))/(b**2-b*sp.sqrt(b**2+1)+1)
    

    完整地说,我使用这个解决方法(不是很方便):

    c=sp.symbols("c",positive=True)
    myExpr.subs(sp.sqrt(a**2+1-a*sp.sqrt(a**2+1)),c).subs(c,sp.sqrt(a**2+1-a*sp.sqrt(a**2+1))).subs(sp.sqrt(b**2+1-b*sp.sqrt(b**2+1)),c).subs(c,sp.sqrt(b**2+1-b*sp.sqrt(b**2+1)))
    

    0 回复  |  直到 4 年前
        1
  •  2
  •   Oscar Benjamin    4 年前

    你需要 a b 积极而不仅仅是真实:

    In [15]: a, b = symbols('a, b', positive=True)
    
    In [16]: sqrt(b/a)*sqrt(a/b)
    Out[16]: 1
    

    否则,如果它们可以是负数,那么你可以有。 a = -1 b = 1 在这种情况下,简化无效:

    In [21]: a = sympify(-1)
    
    In [22]: b = sympify(1)
    
    In [23]: sqrt(a/b)*sqrt(b/a)
    Out[23]: -1
    
    推荐文章