Sympy中处理函数扰动时忽略delta乘积项的方法咨询
在Sympy中忽略扰动项乘积(保留一阶小量)的方法
针对你需要在展开扰动后的函数时,忽略所有delta项乘积(仅保留一阶小量)的需求,这里提供两种可行方案:
方法1:引入统一小参数ε展开
通过引入小参数标记扰动项的量级,让Sympy明确区分不同阶的项,是最稳妥的处理方式:
import sympy as sp x, y, ε = sp.symbols("x, y, ε") u0, v0 = sp.symbols("u_0, v_0") # 将扰动项定义为小参数ε乘以对应函数 du_func = sp.Function("\\delta u")(x, y) dv_func = sp.Function("\\delta v")(x, y) du = ε * du_func dv = ε * dv_func u = u0 + du v = v0 + dv f = u**2 * v # 展开后移除高阶小项,再替换ε=1得到一阶近似结果 f_expanded = sp.expand(f).removeO() f_linearized = sp.expand(f_expanded.subs(ε, 1)) print(f_linearized)
输出结果:
u_0**2*v_0 + u_0**2*\\delta v(x, y) + 2*u_0*v_0*\\delta u(x, y)
方法2:手动过滤高阶项
如果不想引入额外参数,可以直接遍历展开后的表达式,筛选出仅含0个或1个扰动项的部分:
import sympy as sp x, y = sp.symbols("x, y") u0, v0 = sp.symbols("u_0, v_0") du = sp.Function("\\delta u")(x, y) dv = sp.Function("\\delta v")(x, y) u = u0 + du v = v0 + dv f = u**2 * v f_expanded = sp.expand(f) # 仅保留扰动项总次数≤1的项 f_linearized = sp.Add(*[term for term in f_expanded.args if (term.count(du) + term.count(dv)) <= 1]) print(f_linearized)
该方法直接检查每个项中du和dv的出现次数之和,过滤掉所有包含乘积项的部分,结果与方法1完全一致。
关于sp.Order无效的原因
sp.O需要明确的量级参考(比如小参数ε),直接将du/dv放入Order中时,Sympy无法自动识别它们的量级关系,因此无法正确过滤高阶项。引入统一小参数后,Sympy能清晰区分不同阶的扰动项,从而实现预期的近似效果。
内容的提问来源于stack exchange,提问作者Yotam Ohad
相关产品推荐
相关产品推荐

