Sympy微分方程处理:如何将等式lhs的含f2项移动到rhs?
现有实现的正确性说明
你当前的实现针对你给出的场景(原等式右侧为0、f1和f2的项无交叉依赖)可以得到正确结果,但存在明显局限性:
- 仅支持原等式右侧为0的场景,若原
eq1.rhs有非零值会直接丢失这部分内容,导致结果错误 - 仅支持f1、f2项完全分离的场景,若存在同时包含f1和f2的交叉项(如
f1*f2),subs操作会直接剔除交叉项,得到错误结果
更简便的通用解决方案
你可以直接拆分等式左侧的所有项,按是否包含f2分类后重组等式,该方案支持任意原等式右侧值、无交叉项限制:
# 拆分原等式左侧项,分类重组 left = sum(term for term in eq1.lhs.as_ordered_terms() if not term.has(f2)) right = sum(-term for term in eq1.lhs.as_ordered_terms() if term.has(f2)) + eq1.rhs eq2 = sp.Eq(left, right)
运行后得到的eq2就是Eq(f1 + Derivative(f1(t), (t, 2)), f2(t) - Derivative(f2(t), t)),完全符合移项要求。
如果需要更高复用性,可以封装为工具函数:
def move_terms_containing(eq, target_expr, to_right=True): all_terms = (eq.lhs - eq.rhs).as_ordered_terms() left_terms = [] right_terms = [] for term in all_terms: if term.has(target_expr) == to_right: right_terms.append(-term) else: left_terms.append(term) return sp.Eq(sum(left_terms), sum(right_terms)) # 调用示例:把所有含f2的项移到右侧 eq2 = move_terms_containing(eq1, f2, to_right=True)
内容的提问来源于stack exchange,提问作者Stef1611
相关产品推荐
相关产品推荐

