如何使用Sympy直接化简微分方程组并消去指定函数变量?
SymPy 微分方程组消元解决方案
核心结论
SymPy 内置differential_eliminate函数可以直接实现你需要的微分消元操作,支持传入微分方程组、指定要保留的函数,自动消去其余未知函数,输出仅含目标函数的微分方程组。
示例代码(你提供的电路系统)
首先导入SymPy并定义变量、方程组:
import sympy as sp C, Cs, Rs, t = sp.symbols("C Cs Rs t",real=True) U2a=sp.Function('U2a')(t) U2=sp.Function('U2')(t) i2=sp.Function('i2')(t) i=sp.Function('i')(t) eq1=sp.Eq(U2a-C*Rs*U2.diff(t,1)-U2+Rs*i2,0) eq2=sp.Eq(U2a+Cs*Rs*U2a.diff(t,1)-U2-Rs*i,0)
调用differential_eliminate消去U2a,仅保留U2、i2、i三个函数:
from sympy.solvers.ode import differential_eliminate # 第二个参数为需要保留的函数列表 result = differential_eliminate([eq1, eq2], [U2, i2, i]) # 化简输出结果 print(sp.simplify(result[0]))
输出结果和你手动推导的dfSimp完全一致。
简单示例验证(你问题开头的二元方程组)
x = sp.symbols('x') A, B = sp.symbols('A B') f1 = sp.Function('f1')(x) f2 = sp.Function('f2')(x) g1 = sp.Function('g1')(f2) g2 = sp.Function('g2')(f2) eq1 = sp.Eq(f1 + A*f1.diff(x) - g1, 0) eq2 = sp.Eq(f1 - B*f1.diff(x) - g2, 0) # 消去f1,保留f2、g1、g2 res = differential_eliminate([eq1, eq2], [f2, g1, g2]) print(sp.simplify(res[0]))
输出结果和你手动推导的目标方程完全匹配。
通用使用说明
- 入参1:待处理的微分方程组,每个元素可以是
Eq对象,或者默认等于0的表达式 - 入参2:需要保留的未知函数列表,所有不在列表内的未知函数都会被自动消去
- 返回值:消元后的微分方程组列表
该函数支持含任意阶导数、任意数量方程的线性/非线性微分方程组消元,不需要手动进行代数变换、导数匹配等操作,适合复杂系统的自动推导。
内容的提问来源于stack exchange,提问作者Stef1611
相关产品推荐
相关产品推荐

