SymPy中嵌套平方根的格式化输出问题
调整SymPy中嵌套平方根的输出格式(内层根号移至右侧)
问题背景
使用SymPy求解方程 $L_3(x) = \left(\left(x^2 - 2\right)^2 - 2\right)^2 - 2 = 0$ 的正实数解时,SymPy默认输出的嵌套平方根格式会将内层根号放在常数项左侧(如sqrt(sqrt(2 - sqrt(2)) + 2)),但希望调整为常数项在前、内层根号在后的形式(如sqrt(2 + sqrt(2 - sqrt(2))))。
原因分析
SymPy会将表达式转换为标准规范形式,默认按表达式复杂度排序,把结构更复杂的嵌套根号项放在常数项之前,因此出现了不符合预期的格式。本质上两种形式等价(加法交换律),仅需调整加法项的顺序即可。
解决方案
定义一个递归处理函数,遍历表达式结构,针对sqrt内层的加法项,将常数2移至前面,嵌套根号项移至后面。
修改后的完整代码
import sympy as sp # 定义符号变量 x = sp.symbols('x') # 定义方程 f = ((x**2 - 2)**2 - 2)**2 - 2 # 求解方程 solutions = sp.solve(f, x) # 筛选正实数解 positive_solutions = [sol for sol in solutions if sol.is_real and sol > 0] # 递归调整嵌套平方根的格式 def rearrange_sqrt(expr): if isinstance(expr, sp.sqrt): inner = rearrange_sqrt(expr.args[0]) # 处理内层的加法项 if isinstance(inner, sp.Add): terms = list(inner.args) constant = None sqrt_term = None # 分离常数项2和根号项 for term in terms: if term.is_number and term == 2: constant = term elif isinstance(term, sp.sqrt): sqrt_term = rearrange_sqrt(term) # 重新构造加法,常数在前 if constant and sqrt_term: return sp.sqrt(constant + sqrt_term) return sp.sqrt(inner) return sp.sqrt(inner) # 递归处理其他嵌套表达式 elif isinstance(expr, sp.Add): return sp.Add(*[rearrange_sqrt(term) for term in expr.args]) elif isinstance(expr, sp.Mul): return sp.Mul(*[rearrange_sqrt(term) for term in expr.args]) else: return expr # 打印调整后的结果 print("调整格式后的正实数解:") for sol in positive_solutions: print(rearrange_sqrt(sol))
输出结果
sqrt(2 - sqrt(2 - sqrt(2))) sqrt(2 - sqrt(sqrt(2) + 2)) sqrt(2 + sqrt(2 - sqrt(2))) sqrt(2 + sqrt(sqrt(2) + 2))
注意事项
- 上述函数是针对当前问题的特定场景(仅涉及常数
2与嵌套根号的加法),若需处理其他常数或更复杂的表达式,可修改constant的判断条件。 - 调整后的表达式与原表达式数学上完全等价,仅改变了加法项的显示顺序。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

