You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:45:43