如何简化 sympy 中的 sqrt 表达式

How to simplify sqrt expressions in sympy

我正在使用 sympy v1.0 in a Jupyter Notebook。我无法表达以简化我想要的方式。这是一个玩具示例;它和我更复杂的表达式做的一样...

import sympy
sympy.init_printing(use_latex='mathjax')
x, y = sympy.symbols("x, y", real=True, positive=True)
sympy.simplify(sqrt(2*x/y))

给我...

但我更愿意...

如何才能 sympy 以这种方式对事物进行分组?我尝试了其他一些 simplify 函数,但它们都给我相同的结果。还是我漏掉了什么?

sympy 确实想通过从 sqrt 中提取术语来简化,这是有道理的。我认为你必须手动做你想做的事,即在没有 sqrt 调用的情况下获得你想要的简化,然后使用 Symbol 和 LaTex \sqrt 包装来捏造它。例如:

from sympy import *
init_printing(use_latex='mathjax')

# Wanted to show this will work for slightly more complex expressions,
# but at the end it should still simplify to 2x/y
x, y = symbols("x, y", real=True, positive=True)
z = simplify((2*2*3*x)/(1*2*3*y))

Symbol("\sqrt{" + latex(z) + "}", real=True, positive=True) # Wrap the simplified fraction in \sqrt{}

这确实不理想,但我浏览了文档大约一个小时,但无法直接找到对您想要的内容的支持。 sympy 库更多的是关于实际的符号操作,而不是打印,所以我很难责怪他们。

对于您希望表现得像符号的数字使用 "symbol trickery",当您不希望简化时使用 "vanilla symbols"(正如@asmeurer 指出的那样):

>>> _2,x,y = list(map(Symbol,'2xy'))
>>> sqrt(_2*x/y)
sqrt(2*x/y)