如何用SymPy仅对括号内表达式因式分解并简化指定表达式
SymPy实现指定内层因式分解的表达式简化
问题需求
需要将以下表达式:
-8*F_p + 8*Omega*u + 6*alpha*u*(u**2 + v**2) - 5*beta*u*(u**4 + 2*u**2*v**2 + v**4) - 8*gamma*omega*v
基于r² = u² + v²的替换规则,简化为:
-8*F_p + 8*Omega*u + 6*alpha*u*r**2 - 5*beta*u*r**4 - 8*gamma*omega*v
直接执行替换或全局简化无法达成目标,但单独对u⁴ + 2u²v² + v⁴因式分解后替换可得到r⁴,因此需要让SymPy仅对表达式的最内层多项式子表达式进行因式分解,再完成替换。
解决方案
通过递归遍历表达式的子节点,针对性地对内层多项式执行因式分解,再应用替换规则即可实现目标简化。具体实现如下:
完整代码示例
from sympy import symbols, simplify, factor, collect, Expr u, v, r = symbols('u v r') # 定义参数 alpha = symbols('alpha', positive=True) beta = symbols('beta', positive=True) F_p = symbols('F_p', positive=True) gamma = symbols('gamma', positive=True) omega = symbols('omega', positive=True) Omega = symbols('Omega', positive=True) # 原始表达式 f = -8*F_p + 8*Omega*u + 6*alpha*u**3 + 6*alpha*u*v**2 - 5*beta*u**5 - 10*beta*u**3*v**2 - 5*beta*u*v**4 - 8*gamma*omega*v # 递归处理子表达式,对多项式子项执行因式分解 def factor_inner(expr): if isinstance(expr, Expr): # 递归处理每个子节点 new_args = [factor_inner(arg) for arg in expr.args] expr = expr.func(*new_args) # 仅对多项式类型的子表达式执行因式分解 if expr.is_polynomial(): return factor(expr) return expr # 先收集同类项,再处理内层因式分解 f_collected = collect(f, [alpha, beta]) f_factored_inner = factor_inner(f_collected) # 执行替换 subs_dict = {u**2 + v**2: r**2} simplified_expr = f_factored_inner.subs(subs_dict) # 输出结果 print("原始表达式:") print(f) print("\n收集同类项后:") print(f_collected) print("\n内层因式分解后:") print(f_factored_inner) print("\n最终简化结果:") print(simplified_expr)
代码说明
factor_inner函数:递归遍历表达式的所有子节点,仅对多项式类型的子表达式执行因式分解,确保只处理最内层的多项式项- 先执行
collect操作合并同类项,让内层多项式结构更清晰,便于后续因式分解 - 完成内层因式分解后,再代入
r² = u² + v²的替换规则,即可得到目标简化形式
内容的提问来源于stack exchange,提问作者minmax
相关产品推荐
相关产品推荐

