用Python来学微积分30-微分方程初步
文章目录
- 一、微分方程的基本概念
- 1.1 什么是微分方程?
- 1.2 微分方程的解
- 二、可分离变量的微分方程
- 2.1 基本形式与解法
- 2.2 实例详解
- 三、初值问题
- 四、实际应用案例
- 4.1 投资复利问题
- 4.2 曲线切线问题
- 五、微分方程的数值解法
- 总结
一、微分方程的基本概念
在我们研究的许多实际问题中,变量之间的函数关系往往不能直接建立,但我们却可以建立这些变量与它们的变化率之间的关系式。这样的关系式就是微分方程,它蕴含着变化的内在规律。
1.1 什么是微分方程?
微分方程是含有未知函数导数或微分的方程。如果未知函数是一元函数,则称为常微分方程(ODE);如果未知函数是多元函数,则称为偏微分方程(PDE)。
微分方程的阶数由方程中出现的未知函数的最高阶导数的阶数决定。例如:
- dA(t)dt=rA(t)\frac{dA(t)}{dt}=rA(t)dtdA(t)=rA(t) 是一阶微分方程
- d2ydx2−2y=ex\frac{d^{2}y}{dx^{2}} - 2y = e^{x}dx2d2y−2y=ex 是二阶微分方程
- y′′′−4y′′+6y′=5y''' - 4y'' + 6y' = 5y′′′−4y′′+6y′=5 是三阶微分方程
1.2 微分方程的解
满足微分方程的函数称为该微分方程的解。解可以分为两类:
- 通解:含有任意常数的解,且任意常数的个数等于微分方程的阶数,并且这些任意常数是相互独立的(即它们不能合并而减少个数)
- 特解:确定了通解中任意常数后得到的解
初值条件用于确定通解中的任意常数,求微分方程满足初值条件的解的问题称为初值问题。
需要特别注意的是,通解并不一定包含微分方程的所有解。例如,方程 (y′)2−4y=0(y')^2-4y=0(y′)2−4y=0 有通解 y=(x+C)2y=(x+C)^2y=(x+C)2,但解 y=0y=0y=0 并不包含在这个通解形式中
二、可分离变量的微分方程
2.1 基本形式与解法
形如 g(y)dy=f(x)dxg(y)dy = f(x)dxg(y)dy=f(x)dx 的微分方程称为可分离变量的微分方程。这类方程的特点是可以将含xxx的项和含yyy的项分离到等号两边。
求解方法很简单:两边同时积分 ∫g(y)dy=∫f(x)dx\int g(y)dy = \int f(x)dx∫g(y)dy=∫f(x)dx
设 G(y)G(y)G(y)、F(x)F(x)F(x) 分别是 g(y)g(y)g(y)、f(x)f(x)f(x) 的一个原函数,则通解为: G(y)=F(x)+CG(y) = F(x) + CG(y)=F(x)+C 其中 CCC 为任意常数。
2.2 实例详解
例1:求解 dydx=2xy\frac{dy}{dx} = 2xydxdy=2xy
手动求解:
- 分离变量:1ydy=2xdx\frac{1}{y}dy = 2xdxy1dy=2xdx(假设 y≠0y \neq 0y=0)
- 两边积分:∫1ydy=∫2xdx\int \frac{1}{y}dy = \int 2xdx∫y1dy=∫2xdx
- 得到:ln∣y∣=x2+C1\ln|y| = x^2 + C_1ln∣y∣=x2+C1
- 整理:y=±ex2+C1=±eC1ex2=Cex2y = \pm e^{x^2 + C_1} = \pm e^{C_1}e^{x^2} = Ce^{x^2}y=±ex2+C1=±eC1ex2=Cex2(其中 C为任意非零常数)
- 检验 y=0的情况:将 y=0代入原方程,两边均为0,故 y=0也是解,对应 C=0的情况
- 因此,通解为 y=Cex2y=Ce^{x^2}y=Cex2(C为任意常数),这包含了 y=0的情况
Python求解:
import sympy as spx, y = sp.symbols('x y')
y_func = sp.Function('y')
eq = sp.Eq(y_func(x).diff(x), 2*x*y_func(x))
solution = sp.dsolve(eq)
print(solution)
Python代码执行结果:
Eq(y(x), C1*exp(x**2))
例2:求解 dydx=2x(1+y2)\frac{dy}{dx}=2x(1 + y^{2})dxdy=2x(1+y2)
手动求解:
- 分离变量:11+y2dy=2xdx\frac{1}{1 + y^{2}}dy = 2xdx1+y21dy=2xdx
- 两边积分:∫11+y2dy=∫2xdx\int\frac{1}{1 + y^{2}}dy=\int 2xdx∫1+y21dy=∫2xdx
- 得到:arctany=x2+C\arctan y = x^{2} + Carctany=x2+C
- 整理:y=tan(x2+C)y = \tan(x^{2} + C)y=tan(x2+C)
Python求解:
import sympy as spx, y = sp.symbols('x y')
y_func = sp.Function('y')
eq = sp.Eq(y_func(x).diff(x), 2*x*(1 + y_func(x)**2))
solution = sp.dsolve(eq)
print(solution)
Python代码执行结果:
Eq(y(x), tan(C1 + x**2))
三、初值问题
初值问题是求微分方程满足给定初始条件的特解的问题。例如: {dydx=yxy∣x=1=2\begin{cases} \frac{dy}{dx} = \frac{y}{x} \\ y|_{x = 1} = 2 \end{cases}{dxdy=xyy∣x=1=2
手动求解步骤:
- 分离变量:1ydy=1xdx\frac{1}{y}dy = \frac{1}{x}dxy1dy=x1dx
- 两边积分:ln∣y∣=ln∣x∣+C\ln|y| = \ln|x| + Cln∣y∣=ln∣x∣+C
- 整理得通解:y=Cxy = Cxy=Cx(此处 C=±eC1C = \pm e^{C_1}C=±eC1)
- 代入初值条件 y∣x=1=2y|_{x=1} = 2y∣x=1=2:2=C⋅12 = C \cdot 12=C⋅1,得 C=2C = 2C=2
- 特解为:y=2xy = 2xy=2x
Python求解:
import sympy as spx = sp.symbols('x')
y = sp.Function('y')
eq = sp.Eq(y(x).diff(x), y(x)/x)
# 定义初值条件:当x=1时,y=2
solution = sp.dsolve(eq, ics={y(1): 2})
print(solution)
Python代码执行结果:
Eq(y(x), 2*x)
四、实际应用案例
4.1 投资复利问题
问题:假设以本金 A0A_0A0 进行投资,年利率为 rrr,以连续复利计算,求 ttt 年末的本利和。
建模: 设 ttt 时刻的本利和为 A(t)A(t)A(t),则资金变化率等于该时刻资金获取的利息: dA(t)dt=rA(t)\frac{dA(t)}{dt} = rA(t)dtdA(t)=rA(t)
求解:
- 分离变量:dA(t)A(t)=rdt\frac{dA(t)}{A(t)} = rdtA(t)dA(t)=rdt
- 两边积分:∫dA(t)A(t)=∫rdt\int \frac{dA(t)}{A(t)} = \int rdt∫A(t)dA(t)=∫rdt
- 得到:lnA(t)=rt+C\ln A(t) = rt + ClnA(t)=rt+C
- 整理:A(t)=ert+C=CertA(t) = e^{rt + C} = Ce^{rt}A(t)=ert+C=Cert
- 代入 A(0)=A0A(0) = A_0A(0)=A0:A0=Ce0=CA_0 = Ce^0 = CA0=Ce0=C
- 特解:A(t)=A0ertA(t) = A_0e^{rt}A(t)=A0ert
Python计算示例:
import numpy as npA0 = 1000 # 初始本金
r = 0.05 # 年利率
t = 10 # 投资年限
A_t = A0 * np.exp(r * t)
print(f"{t}年后的本利和为:{A_t:.2f}元")
Python代码执行结果:
10年后的本利和为:1648.72元
4.2 曲线切线问题
问题:在 xOyxOyxOy 平面上,求过点 (0,2)(0, 2)(0,2) 的曲线 y=y(x)y = y(x)y=y(x),使曲线上任一点 (x,y)(x, y)(x,y) 处的切线与坐标原点 OOO 到点 (x,y)(x, y)(x,y) 的连线垂直。
建模: 曲线在点 (x,y)(x, y)(x,y) 处的切线斜率为 dydx\frac{dy}{dx}dxdy,原点 OOO 到点 (x,y)(x, y)(x,y) 的连线斜率为 yx\frac{y}{x}xy。由于两者垂直,斜率乘积为 -1: dydx⋅yx=−1⇒dydx=−xy\frac{dy}{dx} \cdot \frac{y}{x} = -1 \quad \Rightarrow \quad \frac{dy}{dx} = -\frac{x}{y}dxdy⋅xy=−1⇒dxdy=−yx
求解:
- 分离变量:ydy=−xdxydy = -xdxydy=−xdx
- 两边积分:∫ydy=−∫xdx\int ydy = -\int xdx∫ydy=−∫xdx
- 得到:12y2=−12x2+C\frac{1}{2}y^2 = -\frac{1}{2}x^2 + C21y2=−21x2+C
- 整理:x2+y2=Cx^2 + y^2 = Cx2+y2=C(其中 C=2C1C = 2C_1C=2C1)
- 代入点 (0,2)(0, 2)(0,2):02+22=C0^2 + 2^2 = C02+22=C,得 C=4C = 4C=4
- 曲线方程:x2+y2=4x^2 + y^2 = 4x2+y2=4
Python绘图:
import matplotlib.pyplot as plt
import numpy as nptheta = np.linspace(0, 2*np.pi, 100)
x = 2 * np.cos(theta) # 半径为2的圆的参数方程
y = 2 * np.sin(theta)plt.figure(figsize=(8, 8))
plt.plot(x, y, label='$x^2 + y^2 = 4$')
plt.plot(0, 2, 'ro', label='点(0,2)')
plt.arrow(0, 0, 0, 2, head_width=0.1, head_length=0.1, fc='g', ec='g', label='原点至点的连线')
plt.axis('equal')
plt.grid(True)
plt.xlabel('x')
plt.ylabel('y')
plt.title('曲线切线问题解')
plt.legend()
plt.show()
Python代码执行结果:

五、微分方程的数值解法
当微分方程难以求得解析解时,我们可以采用数值解法。欧拉法是最基本的数值解法之一:
import numpy as np
import matplotlib.pyplot as pltdef euler_method(f, x0, y0, h, n):"""欧拉法求解微分方程f: 微分方程dy/dx = f(x, y)x0, y0: 初始条件h: 步长n: 步数"""x = np.zeros(n+1)y = np.zeros(n+1)x[0] = x0y[0] = y0for i in range(n):y[i+1] = y[i] + h * f(x[i], y[i])x[i+1] = x[i] + hreturn x, y# 示例:求解dy/dx = x + y, y(0)=1
def f(x, y):return x + yx, y = euler_method(f, 0, 1, 0.1, 100)
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('欧拉法求解微分方程')
plt.grid(True)
plt.show()
Python代码执行结果:

总结
微分方程作为描述变化规律的有力工具,在数学和实际问题中有着广泛应用。通过本文的学习,我们了解了:
- 微分方程的基本概念:阶数、通解、特解等
- 可分离变量方程的解法:分离变量再积分
- 初值问题的求解:代入初始条件确定特解
- 实际应用:从复利计算到几何问题
Python中的Sympy库为微分方程的求解提供了便利工具,结合数值方法可以解决更复杂的实际问题。微分方程的学习为我们理解动态系统、连续变化过程奠定了坚实基础。
往期精彩回顾:
- 用Python来学微积分27-曲线的渐近线
- 用Python来学微积分28-泰勒公式
专栏导航目录 《程序员AI之路:从Python起步》完全学习导航
完整代码已开源 ai-learning-path,欢迎Star和Fork!
下期预告:在下一篇文章中,我们将开始学习定积分。
参考资料:
- 扈志明《微积分》教材
互动邀请:如果你对本章内容有独特的理解或在实际应用中遇到过有趣的问题,欢迎在评论区分享交流!
