SymPy表达式精细化处理:局部化简与替换技术问询
SymPy表达式局部化简与分式拆分解决方案
局部表达式化简
先从微分方程的解中提取目标表达式:
expr = res.rhs
针对特定子式(比如wn*x0*z**2/(2*wn*z**2-2*wn)),可以用replace()精准替换化简后的结果:
# 定义要化简的子式 target_subexpr = wn*x0*z**2/(2*wn*z**2 - 2*wn) # 单独化简该子式 simplified_sub = sym.simplify(target_subexpr) # 替换原表达式中的对应部分 expr = expr.replace(target_subexpr, simplified_sub)
如果需要匹配同结构的多个子式,用Wild通配符来匹配结构并批量替换:
a, b = Wild('a'), Wild('b') # 匹配形如 a*b/(2*a*b - 2*a) 的结构 pattern = a*b/(2*a*b - 2*a) # 自动匹配并化简所有符合结构的子式 expr = expr.replace(pattern, sym.simplify(pattern))
拆分分式
对于$\frac{v_0 + \omega_n x_0 z}{\omega_n \sqrt{1-z^2}}$这类分式,直接调用expand()就能拆分:
# 定义要拆分的分式 frac_to_split = (v0 + wn*x0*z)/(wn*sym.sqrt(1-z**2)) split_frac = sym.expand(frac_to_split) # 替换回原表达式 expr = expr.replace(frac_to_split, split_frac)
完整整合代码
把所有步骤加到你的原有代码里:
import sympy as sym from sympy.abc import t from sympy import Wild x0,v0 = sym.symbols("x0 v0 ", real=True) wn = sym.symbols("omega_n", positive = True, real=True) z = sym.symbols("zeta", positive = True, real=True) x = sym.Function('x') Dx = sym.Derivative(x(t), t) Dx2= sym.Derivative(x(t), t,2) res = sym.dsolve(Dx2 +2*z*wn*Dx+ wn**2*x(t), x(t), ics = { x(0): x0, Dx.subs(t,0):v0}) # 提取解的右侧表达式 expr = res.rhs # 局部化简子式 target_subexpr = wn*x0*z**2/(2*wn*z**2 - 2*wn) expr = expr.replace(target_subexpr, sym.simplify(target_subexpr)) # 拆分分式 frac_to_split = (v0 + wn*x0*z)/(wn*sym.sqrt(1-z**2)) expr = expr.replace(frac_to_split, sym.expand(frac_to_split)) # 打印美化后的结果 sym.pprint(expr)
内容的提问来源于stack exchange,提问作者NMech
相关产品推荐
相关产品推荐

