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

如何用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})

问题原因

  1. 浮点数系数干扰:代码中使用9/5浮点数,Sympy对浮点数的积分处理优先级低于精确符号有理数,导致无法自动展开计算积分。
  2. 积分展开未触发:原方程的积分项可通过分部积分转化为初等函数,但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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:21