高等数学(六)微分方程¶
章节概述¶
微分方程是包含未知函数及其导数的方程,在物理、工程、生物等领域有广泛应用。本章将介绍常微分方程的基本概念和求解方法。
学习目标¶
- 理解微分方程的基本概念和分类
- 掌握可分离变量微分方程的求解方法
- 掌握一阶线性微分方程的求解方法
- 学会求解二阶常系数线性微分方程
- 了解微分方程的应用
(一)微分方程的基本概念¶
微分方程的定义¶
微分方程是包含未知函数及其导数的方程。
微分方程的阶¶
微分方程的阶是指方程中出现的最高阶导数的阶数。
微分方程的解¶
满足微分方程的函数称为微分方程的解。
微分方程的分类¶
1. 常微分方程(ODE) 未知函数是一元函数的微分方程。
2. 偏微分方程(PDE) 未知函数是多元函数的微分方程。
3. 线性微分方程 未知函数及其导数都是一次的微分方程。
4. 非线性微分方程 未知函数或其导数不是一次的微分方程。
微分方程的解¶
通解:含有任意常数的解,独立任意常数的个数等于方程的阶数。
特解:给任意常数赋予特定值后得到的解。
初值问题:求满足初始条件的特解。
微分方程的阶¶
微分方程的阶是指方程中出现的最高阶导数的阶数。
(二)可分离变量微分方程¶
可分离变量方程的形式¶
求解方法¶
分离变量后积分:
实例分析¶
实例1:求解 dy/dx = x/y
import sympy as sp
x = sp.symbols('x')
C = sp.symbols('C')
# 分离变量
# y dy = x dx
# ∫ y dy = ∫ x dx
# y²/2 = x²/2 + C
# 解析解
y = sp.Function('y')
ode = sp.Eq(sp.diff(y(x), x), x/y(x))
solution = sp.dsolve(ode)
print(f"解析解: {solution}")
实例2:求解 dy/dx = y(1 - y)
# 分离变量
# dy/(y(1-y)) = dx
# 使用部分分式
ode = sp.Eq(sp.diff(y(x), x), y(x)*(1 - y(x)))
solution = sp.dsolve(ode)
print(f"解析解: {solution}")
(三)一阶线性微分方程¶
一阶线性微分方程的形式¶
求解方法¶
积分因子法:
- 计算积分因子 μ(x) = e^(∫P(x)dx)
- 方程两边乘以 μ(x)
- 左边变成 [μ(x)y]'
- 积分求解
通解公式:
特殊类型¶
1. 齐次方程(Q(x) = 0)
2. 伯努利方程
令 z = y^(1-n),化为线性方程。实例分析¶
实例1:求解 dy/dx + y = e^x
# 这是一个一阶线性微分方程
# P(x) = 1, Q(x) = e^x
# 积分因子 μ(x) = e^(∫1 dx) = e^x
ode = sp.Eq(sp.diff(y(x), x) + y(x), sp.exp(x))
solution = sp.dsolve(ode)
print(f"解析解: {solution}")
实例2:求解 dy/dx + 2xy = x
# P(x) = 2x, Q(x) = x
# 积分因子 μ(x) = e^(∫2x dx) = e^(x²)
ode = sp.Eq(sp.diff(y(x), x) + 2*x*y(x), x)
solution = sp.dsolve(ode)
print(f"解析解: {solution}")
(四)二阶常系数线性微分方程¶
二阶常系数线性微分方程的形式¶
齐次方程的解¶
如果 f(x) = 0,则方程为齐次方程。解的形式取决于特征方程的根。
特征方程:r² + ar + b = 0
情况1:两个不同的实根 r₁, r₂
情况2:重根 r
情况3:共轭复根 α ± βi
非齐次方程的特解¶
非齐次方程的通解 = 对应齐次方程的通解 + 特解。
特解的求法(待定系数法):
| f(x) 的形式 | 特解形式 |
|---|---|
| Pₙ(x) | Qₙ(x) |
| Pₙ(x)e^(αx) | Qₙ(x)e^(αx) |
| Pₙ(x)cos βx | Qₙ(x)cos βx + Rₙ(x)sin βx |
| Pₙ(x)sin βx | Qₙ(x)cos βx + Rₙ(x)sin βx |
注意:如果 α(或 ±βi)是特征方程的根,特解需要乘以 x 或 x²。
实例分析¶
实例1:求解 y'' - 5y' + 6y = 0
# 特征方程: r² - 5r + 6 = 0
# 解: r₁ = 2, r₂ = 3
y = sp.Function('y')
ode = sp.Eq(sp.diff(y(x), x, 2) - 5*sp.diff(y(x), x) + 6*y(x), 0)
solution = sp.dsolve(ode)
print(f"解析解: {solution}")
实例2:求解 y'' + y = sin x
# 特征方程: r² + 1 = 0
# 解: r = ±i
ode = sp.Eq(sp.diff(y(x), x, 2) + y(x), sp.sin(x))
solution = sp.dsolve(ode)
print(f"解析解: {solution}")
实例3:求解 y'' - 2y' + y = eˣ
# 特征方程: r² - 2r + 1 = (r-1)² = 0
# 重根 r = 1
# 由于 eˣ 的指数1是特征方程的重根,特解形式为 Ax²eˣ
ode = sp.Eq(sp.diff(y(x), x, 2) - 2*sp.diff(y(x), x) + y(x), sp.exp(x))
solution = sp.dsolve(ode)
print(f"解析解: {solution}")
(五)微分方程的数值解¶
欧拉方法¶
def euler_method(f, x0, y0, h, x_end):
"""
欧拉方法求解微分方程
参数:
f: dy/dx = f(x, y)
x0: 初始 x
y0: 初始 y
h: 步长
x_end: 终止 x
返回:
tuple: (x_list, y_list)
"""
x_list = [x0]
y_list = [y0]
x = x0
y = y0
while x < x_end:
y = y + h * f(x, y)
x = x + h
x_list.append(x)
y_list.append(y)
return x_list, y_list
改进的欧拉方法(预估-校正法)¶
def improved_euler_method(f, x0, y0, h, x_end):
"""
改进的欧拉方法
参数:
f: dy/dx = f(x, y)
x0: 初始 x
y0: 初始 y
h: 步长
x_end: 终止 x
返回:
tuple: (x_list, y_list)
"""
x_list = [x0]
y_list = [y0]
x = x0
y = y0
while x < x_end:
# 预估
k1 = f(x, y)
y_pred = y + h * k1
# 校正
k2 = f(x + h, y_pred)
y = y + h * (k1 + k2) / 2
x = x + h
x_list.append(x)
y_list.append(y)
return x_list, y_list
龙格-库塔法(四阶)¶
def runge_kutta_4(f, x0, y0, h, x_end):
"""
四阶龙格-库塔法
参数:
f: dy/dx = f(x, y)
x0: 初始 x
y0: 初始 y
h: 步长
x_end: 终止 x
返回:
tuple: (x_list, y_list)
"""
x_list = [x0]
y_list = [y0]
x = x0
y = y0
while x < x_end:
k1 = f(x, y)
k2 = f(x + h/2, y + h*k1/2)
k3 = f(x + h/2, y + h*k2/2)
k4 = f(x + h, y + h*k3)
y = y + h * (k1 + 2*k2 + 2*k3 + k4) / 6
x = x + h
x_list.append(x)
y_list.append(y)
return x_list, y_list
实例分析¶
实例:求解 dy/dx = y, y(0) = 1
def f(x, y):
"""微分方程 dy/dx = y"""
return y
x_list, y_list = euler_method(f, 0, 1, 0.1, 1)
print("数值解:")
for x, y in zip(x_list[::2], y_list[::2]): # 每隔一个点输出
print(f"x = {x:.2f}, y = {y:.6f}")
# 理论解: y = e^x
print("\n理论解:")
for x in x_list[::2]:
y_theoretical = math.exp(x)
print(f"x = {x:.2f}, y = {y_theoretical:.6f}")
实战练习¶
练习1:求解可分离变量方程¶
求解 dy/dx = x/y², y(0) = 1
# 分离变量: y² dy = x dx
# ∫ y² dy = ∫ x dx
# y³/3 = x²/2 + C
# 使用初始条件: y(0) = 1
# 1/3 = 0 + C, C = 1/3
ode = sp.Eq(sp.diff(y(x), x), x/y(x)**2)
solution = sp.dsolve(ode, ics={y(0): 1})
print(f"解析解: {solution}")
练习2:求解一阶线性微分方程¶
求解 dy/dx - y = x, y(0) = 1
# P(x) = -1, Q(x) = x
# 积分因子: μ(x) = e^(-x)
ode = sp.Eq(sp.diff(y(x), x) - y(x), x)
solution = sp.dsolve(ode, ics={y(0): 1})
print(f"解析解: {solution}")
练习3:求解二阶常系数微分方程¶
求解 y'' - 4y' + 4y = 0, y(0) = 1, y'(0) = 0
# 特征方程: r² - 4r + 4 = 0
# 解: r = 2 (重根)
ode = sp.Eq(sp.diff(y(x), x, 2) - 4*sp.diff(y(x), x) + 4*y(x), 0)
solution = sp.dsolve(ode, ics={y(0): 1, sp.diff(y(x), x).subs(x, 0): 0})
print(f"解析解: {solution}")
练习4:数值方法比较¶
def compare_numerical_methods():
"""比较不同数值方法的精度"""
# 求解 dy/dx = y, y(0) = 1, 理论解 y = eˣ
def f(x, y):
return y
x_end = 1.0
h = 0.1
# 欧拉方法
x_euler, y_euler = euler_method(f, 0, 1, h, x_end)
# 改进的欧拉方法
x_improved, y_improved = improved_euler_method(f, 0, 1, h, x_end)
# 龙格-库塔法
x_rk4, y_rk4 = runge_kutta_4(f, 0, 1, h, x_end)
# 理论值
y_theory = math.exp(x_end)
print("数值方法比较 (x = 1.0):")
print(f"理论值: y = {y_theory:.10f}")
print(f"欧拉方法: y = {y_euler[-1]:.10f}, 误差 = {abs(y_euler[-1] - y_theory):.10e}")
print(f"改进欧拉: y = {y_improved[-1]:.10f}, 误差 = {abs(y_improved[-1] - y_theory):.10e}")
print(f"龙格-库塔: y = {y_rk4[-1]:.10f}, 误差 = {abs(y_rk4[-1] - y_theory):.10e}")
compare_numerical_methods()
练习5:实际应用——人口增长模型¶
def population_growth():
"""
人口增长模型
dP/dt = rP(1 - P/K)
其中 r 是增长率,K 是环境容量
"""
r = 0.1 # 增长率
K = 1000 # 环境容量
def logistic_growth(t, P):
return r * P * (1 - P / K)
# 初始人口
P0 = 100
# 数值求解
t_list, P_list = runge_kutta_4(logistic_growth, 0, P0, 0.5, 100)
print("人口增长模型 (Logistic模型):")
print(f"初始人口: {P0}")
print(f"增长率: {r}")
print(f"环境容量: {K}")
print(f"\n100年后人口: {P_list[-1]:.2f}")
print(f"理论极限: {K}")
population_growth()
章节小结¶
本章介绍了微分方程的基本概念和求解方法:
- 微分方程的基本概念:理解定义、阶、解和分类
- 可分离变量微分方程:掌握分离变量法
- 一阶线性微分方程:掌握积分因子法
- 二阶常系数线性微分方程:掌握特征方程法
- 数值解:了解欧拉方法、改进欧拉方法和龙格-库塔法
微分方程是描述变化规律的重要数学工具。
微分方程类型总结¶
| 类型 | 标准形式 | 求解方法 |
|---|---|---|
| 可分离变量 | dy/dx = f(x)g(y) | 分离变量后积分 |
| 齐次方程 | dy/dx = f(y/x) | 令 u = y/x |
| 一阶线性 | dy/dx + P(x)y = Q(x) | 积分因子法 |
| 伯努利方程 | dy/dx + P(x)y = Q(x)yⁿ | 令 z = y^(1-n) |
| 二阶常系数齐次 | y'' + ay' + by = 0 | 特征方程法 |
| 二阶常系数非齐次 | y'' + ay' + by = f(x) | 待定系数法 |
数值方法总结¶
| 方法 | 精度 | 稳定性 | 计算量 |
|---|---|---|---|
| 欧拉方法 | O(h) | 条件稳定 | 最小 |
| 改进欧拉 | O(h²) | 较好 | 较小 |
| 龙格-库塔 | O(h⁴) | 好 | 较大 |
下一步¶
继续学习第七章:[练习题目](07_exercises.md),巩固所学知识。
重点提醒: - 识别微分方程的类型很重要 - 可分离变量方程是最基本的类型 - 积分因子法是求解一阶线性微分方程的通用方法 - 特征方程法是求解二阶常系数线性微分方程的关键 - 数值方法可以求解无法得到解析解的微分方程