跳转至

高等数学(六)微分方程

章节概述

微分方程是包含未知函数及其导数的方程,在物理、工程、生物等领域有广泛应用。本章将介绍常微分方程的基本概念和求解方法。

学习目标

  • 理解微分方程的基本概念和分类
  • 掌握可分离变量微分方程的求解方法
  • 掌握一阶线性微分方程的求解方法
  • 学会求解二阶常系数线性微分方程
  • 了解微分方程的应用

(一)微分方程的基本概念

微分方程的定义

微分方程是包含未知函数及其导数的方程。

微分方程的阶

微分方程的阶是指方程中出现的最高阶导数的阶数。

微分方程的解

满足微分方程的函数称为微分方程的解。

微分方程的分类

1. 常微分方程(ODE) 未知函数是一元函数的微分方程。

2. 偏微分方程(PDE) 未知函数是多元函数的微分方程。

3. 线性微分方程 未知函数及其导数都是一次的微分方程。

4. 非线性微分方程 未知函数或其导数不是一次的微分方程。

微分方程的解

通解:含有任意常数的解,独立任意常数的个数等于方程的阶数。

特解:给任意常数赋予特定值后得到的解。

初值问题:求满足初始条件的特解。

微分方程的阶

微分方程的阶是指方程中出现的最高阶导数的阶数。

(二)可分离变量微分方程

可分离变量方程的形式

dy/dx = f(x)g(y)

求解方法

分离变量后积分:

∫ (1/g(y)) dy = ∫ f(x) dx

实例分析

实例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}")

(三)一阶线性微分方程

一阶线性微分方程的形式

dy/dx + P(x)y = Q(x)

求解方法

积分因子法:

  1. 计算积分因子 μ(x) = e^(∫P(x)dx)
  2. 方程两边乘以 μ(x)
  3. 左边变成 [μ(x)y]'
  4. 积分求解

通解公式:

y = e^(-∫P(x)dx) · [∫Q(x)·e^(∫P(x)dx) dx + C]

特殊类型

1. 齐次方程(Q(x) = 0)

y = Ce^(-∫P(x)dx)

2. 伯努利方程

dy/dx + P(x)y = Q(x)yⁿ
令 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}")

(四)二阶常系数线性微分方程

二阶常系数线性微分方程的形式

y'' + ay' + by = f(x)

齐次方程的解

如果 f(x) = 0,则方程为齐次方程。解的形式取决于特征方程的根。

特征方程:r² + ar + b = 0

情况1:两个不同的实根 r₁, r₂

y = C₁e^(r₁x) + C₂e^(r₂x)

情况2:重根 r

y = (C₁ + C₂x)e^(rx)

情况3:共轭复根 α ± βi

y = e^(αx)(C₁cos βx + C₂sin βx)

非齐次方程的特解

非齐次方程的通解 = 对应齐次方程的通解 + 特解。

特解的求法(待定系数法):

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()

章节小结

本章介绍了微分方程的基本概念和求解方法:

  1. 微分方程的基本概念:理解定义、阶、解和分类
  2. 可分离变量微分方程:掌握分离变量法
  3. 一阶线性微分方程:掌握积分因子法
  4. 二阶常系数线性微分方程:掌握特征方程法
  5. 数值解:了解欧拉方法、改进欧拉方法和龙格-库塔法

微分方程是描述变化规律的重要数学工具。

微分方程类型总结

类型 标准形式 求解方法
可分离变量 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),巩固所学知识。


重点提醒: - 识别微分方程的类型很重要 - 可分离变量方程是最基本的类型 - 积分因子法是求解一阶线性微分方程的通用方法 - 特征方程法是求解二阶常系数线性微分方程的关键 - 数值方法可以求解无法得到解析解的微分方程