如何用Sympy的dsolve获取不含积分的微分方程闭式解
一阶线性微分方程Sympy求解含积分的问题解决
问题描述
求解一阶线性微分方程:
$$\frac{d}{d t} Q(t) = 1.8 \cos(t) + 1.8 - \frac{6 Q(t)}{3 t + 600}$$
使用Sympy求解时,无论是否代入初始条件$Q(0)=5$,结果都包含未计算的积分;但Wolfram Alpha能给出无积分的闭式解。使用的代码如下:
import sympy as sm t = sm.symbols('t', real = True, positive = True) Q = sm.symbols('Q', cls = sm.Function) Q = Q(t) eq = sm.Eq(Q.diff(t), 9/5*(1+ sm.cos(t)) - (6*Q)/(600+3*t)) sol_g = sm.dsolve(eq, Q) sol_p = sm.dsolve(eq, Q, ics = {Q.subs(t, 0): 5})
问题原因
- 浮点数系数干扰:代码中使用
9/5浮点数,Sympy对浮点数的积分处理优先级低于精确符号有理数,导致无法自动展开计算积分。 - 积分展开未触发:原方程的积分项可通过分部积分转化为初等函数,但Sympy默认未主动执行该展开步骤。
解决步骤
1. 替换浮点数为符号有理数
将9/5替换为sm.Rational(9,5),确保Sympy以精确符号逻辑处理系数。
2. 显式计算积分项
对通解中的积分部分调用sm.integrate()强制计算,再代入初始条件确定常数。
修正后的代码
import sympy as sm t = sm.symbols('t', real=True, positive=True) Q = sm.Function('Q')(t) # 用符号有理数替代浮点数,同时化简方程分母 eq = sm.Eq(Q.diff(t), sm.Rational(9,5)*(1 + sm.cos(t)) - (2*Q)/(t + 200)) # 求解通解 sol_g = sm.dsolve(eq, Q) # 提取并显式计算通解中的积分项 integral_expr = sm.Rational(9,5)*(1 + sm.cos(t))*(t + 200)**2 computed_integral = sm.integrate(integral_expr, t) # 替换通解中的未计算积分 sol_g_simplified = sol_g.rhs.subs(sm.Integral(integral_expr, t), computed_integral) # 代入初始条件求特解 C = sm.symbols('C') constant_eq = sm.Eq(sol_g_simplified.subs(t, 0), 5) C_val = sm.solve(constant_eq, C)[0] sol_p_simplified = sol_g_simplified.subs(C, C_val) # 输出结果 print("化简后的通解:") sm.pprint(sol_g_simplified) print("\n代入初始条件后的特解:") sm.pprint(sol_p_simplified)
结果说明
原方程可化简为标准一阶线性形式:$\frac{dQ}{dt} + \frac{2}{t+200}Q = \frac{9}{5}(1+\cos t)$,积分因子为$(t+200)^2$。显式计算积分后,Sympy会通过分部积分展开$\int (t+200)^2\cos t dt$,得到由多项式与三角函数组成的初等函数表达式,最终得到无积分的闭式解,与Wolfram Alpha结果一致。
内容的提问来源于stack exchange,提问作者Kamran
相关产品推荐
相关产品推荐

