初值问题告诉我们起点的全部信息,而边值问题则在两端各给出部分信息——就像知道出发点和目的地,但不知道中间的完整路径。这类问题在工程中极为常见:梁的弯曲、热传导的稳态、薛定谔方程的本征态问题。本章将深入探讨边值问题的理论和数值求解方法。
什么是边值问题?
从初值问题到边值问题
回顾初值问题( IVP):
所有条件都在同一点
边值问题( BVP):
条件在不同点给出:左边界和右边界。
为什么边值问题更难?
对于初值问题,存在唯一性定理( Picard 定理)保证解的存在唯一性。但边值问题可能:
- 无解:条件不兼容
- 有无穷多解:条件不足以确定
- 有唯一解:这是我们希望的情况
示例 1:考虑
BVP2:
, - 需要 ,矛盾,无解 BVP3:
, - 唯一解
边界条件的类型
第一类( Dirichlet):给定函数值
第二类( Neumann):给定导数值
第三类(
Robin/混合):给定函数值和导数的线性组合
线性边值问题
标准形式
二阶线性 BVP:
解的结构
线性 BVP 的解可以表示为:
其中
叠加原理方法
方法:
- 解两个初值问题:
- 问题 A:
, , - 问题 B: , ,$y'(a) = 1 y = y_A + c y_B y(b) = $ 确定 :
- 问题 A:
(要求
1 | import numpy as np |
打靶法
基本思想
打靶法( Shooting Method)将 BVP 转化为 IVP:
- 猜测缺失的初始条件
- 解初值问题到右边界
- 检查是否满足右边界条件
- 如果不满足,调整猜测值,重复
就像射击:调整枪的角度(初始斜率)直到击中目标(满足右边界条件)。
非线性 BVP 的打靶法
考虑:
我们不知道
算法:
定义残差函数
- 其中 是初值问题 , 的解 求解
(用 Newton 法或二分法)
1 | def shooting_method(f, a, b, alpha, beta, s_guess, tol=1e-8, max_iter=50): |
打靶法的敏感性
打靶法有时会很敏感:解对初始斜率的依赖可能是指数级的。考虑:
通解是
微小的初始误差会被放大约
多重打靶法
思想:将区间分成多段,每段独立打靶,然后在内部节点匹配。
这减少了误差的指数放大。
1 | def multiple_shooting(f, a, b, alpha, beta, n_segments=4): |
有限差分法
基本思想
有限差分法直接离散化微分方程,将 BVP 转化为代数方程组。
离散化导数:
线性 BVP 的有限差分
考虑:
在节点
整理得:
矩阵形式
这是一个三对角线性系统
其中: -
1 | def finite_difference_linear(p, q, r, a, b, alpha, beta, N): |
非线性 BVP 的有限差分
对于非线性方程
1 | def finite_difference_nonlinear(f, df_dy, df_ddy, a, b, alpha, beta, N, |
配置法与样条方法
Galerkin 方法
思想:将解展开为基函数的线性组合,然后通过残差正交性确定系数。
设
Galerkin 条件:残差与每个基函数正交:
有限元方法简介
有限元方法是配置法的重要特例:
- 将区间分成单元
- 在每个单元上用简单的多项式(如线性或二次)
- 要求函数在单元边界连续
1 | def fem_linear_bvp(p, q, r, a, b, alpha, beta, N): |
特征值问题
Sturm-Liouville 问题
标准形式:
这里
有限差分求特征值
离散化后得到广义特征值问题
1 | def sturm_liouville_eigenvalues(p, q, w, a, b, N, num_eig=5): |
实际应用
梁的弯曲
简支梁的挠度
其中
边界条件(简支):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71def beam_deflection(EI, q, L, N):
"""
简支梁的弯曲
EI*y'''' = q(x)
y(0) = y(L) = 0, y''(0) = y''(L) = 0
"""
h = L / N
x = np.linspace(0, L, N + 1)
n = N + 1
# 四阶导数的有限差分:
# y''''(x_i) ≈ (y_{i-2} - 4y_{i-1} + 6y_i - 4y_{i+1} + y_{i+2}) / h^4
# 构造方程组
# 对于四阶问题,需要更复杂的边界处理
# 这里用简化的方法
A = np.zeros((n, n))
b = np.zeros(n)
for i in range(n):
if i == 0 or i == n - 1:
# y = 0 边界
A[i, i] = 1
b[i] = 0
elif i == 1:
# y'' = 0 在 x=0 附近
# y''(x_1) ≈ (y_0 - 2y_1 + y_2)/h ² = 0
# 但 y_0 = 0,所以 -2y_1 + y_2 = 0
A[i, 0] = 1
A[i, 1] = -2
A[i, 2] = 1
b[i] = 0
elif i == n - 2:
# y'' = 0 在 x=L 附近
A[i, n-3] = 1
A[i, n-2] = -2
A[i, n-1] = 1
b[i] = 0
else:
# 内部点: EI*y'''' = q
A[i, i-2] = EI / h**4
A[i, i-1] = -4 * EI / h**4
A[i, i] = 6 * EI / h**4
A[i, i+1] = -4 * EI / h**4
A[i, i+2] = EI / h**4
b[i] = q(x[i])
y = np.linalg.solve(A, b)
return x, y
# 均布载荷
EI = 1
L = 1
q = lambda x: 1 # 均布载荷
x, y = beam_deflection(EI, q, L, N=50)
# 精确解: y = q/(24EI) * x*(L-x)*(L ²+x(L-x)) = q*x*(x ³-2Lx ²+L ³)/(24EI)
# 简化形式: y = (q*L ⁴)/(24EI) * (x/L)*(1-x/L)*((x/L)² - (x/L) + 1)
y_exact = (1/(24*EI)) * x * (L - x) * (L**2 - x*(L-x))
plt.figure(figsize=(10, 5))
plt.plot(x, -y*1000, 'b.-', label='数值解')
plt.plot(x, -y_exact*1000, 'r--', label='精确解')
plt.xlabel('位置 x')
plt.ylabel('挠度 (× 10 ⁻³)')
plt.title('简支梁在均布载荷下的弯曲')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
热传导稳态
一维稳态热传导:
边界条件可以是: - 温度给定( Dirichlet) - 热流给定( Neumann) - 对流边界( Robin)
1 | def heat_conduction_steady(k, Q, L, T_left, T_right, N): |
量子力学:薛定谔方程
一维定态薛定谔方程:
这是一个特征值问题!
1 | def schrodinger_1d(V, x_min, x_max, N, num_states=5, hbar=1, m=1): |
使用 SciPy 求解 BVP
SciPy 提供了solve_bvp函数:
1 | from scipy.integrate import solve_bvp |
练习题
基础题
练习 1:用叠加原理方法求解:
练习 2:用打靶法求解:
练习 3:用有限差分法( N=20)求解:
并与精确解比较。
练习 4:考虑特征值问题:
用有限差分法求前 5 个特征值。
练习 5:验证对于
中级题
练习 6:用多重打靶法( 4 段)求解:
比较与单次打靶的稳定性。
练习 7:实现带 Neumann 边界条件的有限差分法:
练习 8:用配置法( Chebyshev 节点)求解:
练习 9:求解 Sturm-Liouville 问题:
并绘制前 4 个特征函数。
练习 10:实现简支梁在集中载荷下的弯曲分析。
高级题
练习 11:考虑非线性特征值问题( Bratu 问题):
对不同的
练习 12:用有限元方法求解变系数问题:
练习 13:研究数值方法的超收敛现象:对于某些问题,在特定点上的误差比全局误差更小。
练习 14:实现后验误差估计:根据数值解估计真实误差,用于自适应网格细化。
练习 15:考虑奇异边值问题:
讨论在
总结
本章我们学习了边值问题的各种数值方法:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 叠加原理 | 简单,利用现有 IVP 求解器 | 仅限线性问题 | 线性 BVP |
| 打靶法 | 灵活,可处理非线性 | 可能不稳定 | 一般 BVP |
| 多重打靶 | 更稳定 | 实现复杂 | 敏感的 BVP |
| 有限差分 | 直接,易于理解 | 需要解线性系统 | 规则区域 |
| 有限元 | 处理复杂几何 | 理论复杂 | 工程问题 |
实际建议:
- 先用
scipy.integrate.solve_bvp尝试 - 如果失败,检查初始猜测
- 对于敏感问题,考虑多重打靶或有限差分
- 对于特征值问题,有限差分通常足够
下一章,我们将进入偏微分方程的世界——当未知函数依赖于多个变量时会发生什么?
- 本文标题:常微分方程(十二)边值问题
- 本文作者:Chen Kai
- 创建时间:2019-06-03 10:45:00
- 本文链接:https://www.chenk.top/%E5%B8%B8%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%EF%BC%88%E5%8D%81%E4%BA%8C%EF%BC%89%E8%BE%B9%E5%80%BC%E9%97%AE%E9%A2%98/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!