1 核心概念
- 多数微分方程难以求出解析解,需借助数值解。数值解针对自变量数组每个取值给出相对精确因变量值,可通过列表法或作图法表示。
- 求微分方程数值解的底层原理主要是 Euler 法和 Runge - Kutta 法。
1.1 Euler 法
1.1.1 Euler 法的原理
欧拉法是最基础、最直观的常微分方程(ODE)数值解法之一,由瑞士数学家莱昂哈德·欧拉(Leonhard Euler)在 18 世纪提出。它的核心思想非常简单:
用切线近似代替曲线,一步步递推求解。 具体来说,假设我们有一阶常微分方程初值问题:
欧拉法将时间区间离散化,用小步长 h 进行迭代:
其中:
- 是在 时刻的近似解
- 是在 处的导数值(即斜率)
1.1.2 欧拉法的推导
欧拉法的推导基于泰勒展开。对 ) 在 处做一阶泰勒展开:
忽略高阶小项 O(h^2) ,并用数值近似代替导数:
示例:
假设有微分方程:
取步长 h = 0.1 ,用欧拉法计算几步:
| n | ||||
|---|---|---|---|---|
| 0 | 0.0 | 1.0 | -1.0 | 1.0 + 0.1 × (-1.0) = 0.9 |
| 1 | 0.1 | 0.9 | -0.9 | 0.9 + 0.1 × (-0.9) = 0.81 |
| 2 | 0.2 | 0.81 | -0.81 | 0.81 + 0.1 × (-0.81) = 0.729 |
可以看到,数值解逐步逼近真实解 y(t) = e^{-t} 。
2 Sympy 求解微分方程解析解
2.1 求解单个微分方程
-
步骤:
- 用
symbols声明符号变量,若变量为函数需指定cls = Function。 - 通过
Eq对象创建方程,分别存储方程左右两边,用diff方法表示求导。 - 调用
dsolve(eq, 待求函数)求解。
- 用
-
示例:求解y′′+2y′+y=x2,代码如下:
from sympy import *
y = symbols('y', cls = Function)
x = symbols('x')
eq = Eq(y(x).diff(x, 2)+2*y(x).diff(x, 1)+y(x), x*x) print(dsolve(eq, y(x)))
- 结果:
Eq(y(x), x**2 - 4*x + (C1 + C2*x)*exp(-x) + 6),因未指定初值,保留参数C1和C2。
2.2 求解常微分方程组
-
方法一:
- 用
symbols批量创建变量,将方程用列表表示,移项使右侧为 0。 - 用字典保存函数初始值,通过
ics参数传入dsolve求解。
- 用
-
方法二:
- 对于线性微分方程组,可利用
Matrix对象构造函数向量和系数矩阵,对方程组矩阵化求解。
- 对于线性微分方程组,可利用
示例:求解