打靶法与边界条件匹配:从出发斜率找到整条曲线
从左边发出一颗小球,希望它在指定的水平位置经过一个目标。起点和目标都固定,轨迹向下弯曲的规则也已知;还没决定的是,小球出发时要朝上倾斜多少。
先用一个简化模型做这个任务。把水平位置记作
这个规则对应无空气阻力、水平速度固定的抛物线模型;实验调节的是初始竖直速度与水平速度之比,并非在固定总速率下任意改变发射角。它只是帮助理解方法的教学模型。
可以先猜一个出发斜率,看看落点高了还是低了,再调整下一次。后面要解决的是:当轨迹复杂到不能直接写出公式时,怎样把这种尝试变成有依据的计算,以及怎样判断结果可信。
先试射,再整理成方程
把出发斜率记为
实验同时显示“落点减目标”,也就是有符号残差。正数表示偏高,负数表示偏低,0 表示恰好匹配。换一个右端目标后,再检验原来的出发斜率是否仍然合适;需要时可以逐级展开提示。
这个例子可以完整算出来。斜率以速率
从 0 走到
分号后的
如果目标高度改成
这个答案依赖当前方程。更一般的情形里,斜率和落点未必保持这样简单的关系,但“从一个斜率出发,计算落点,再比较目标”的结构仍然可以保留。
把边值问题变成初值问题
设一条未知曲线满足
条件分别给在两个端点,这叫两点边值问题。许多数值方法却擅长另一种输入:在同一个位置同时知道高度和斜率,例如
边值问题缺少的正是出发斜率。打靶法暂时补上一个猜测
再把右端偏差写成一个关于
目标转为寻找
左端条件已经由初值严格指定,右端条件通过残差匹配;原来的微分方程并没有被舍弃。若每个候选初值问题在
这里的条件不能省略。对一阶形式的方程,右端连续、对状态局部满足 Lipschitz 条件(状态改变一点,右端的改变量不超过某个固定倍数乘状态改变量),是保证局部初值解存在唯一的常用充分条件;要定义右端落点,还必须保证解能延伸到
内层怎样逐步走到右端
先令
这里
最朴素的一步是:用当前斜率估计这小段的高度变化,再用当前
接下来的实验采用经典四阶 Runge–Kutta 方法,简称 RK4。在同一步内,它还会估计中途和末端的状态,用四次斜率信息合成更新;不必先掌握完整公式也能继续理解外层打靶。
RK4:具体更新公式与精度条件
将两个状态合并为列向量
从
在固定有限区间、解与右端足够光滑且满足相应 Lipschitz 条件时,RK4 从精确起点出发的一步误差为
外层用残差选择下一次试射
换一个用数值积分来试射的任务:
它不再是前面的小球模型,而是用于核对计算的数学例子。改变方程后,不能沿用“斜率等于目标加 1”的答案。
先试
下方实验允许选择初始区间。可以先预测
二分的依据是介值定理:连续函数两端异号,中间至少有一个零点。一次更新后,这个性质仍被保留;每轮区间长度减半。初始长度为
同号区间不满足这个保证;对一般函数,同号区间甚至可能含有两个零点或一个相切的零点。实验拒绝开始二分,只说明当前设置缺少包根依据。它没有证明整个边值问题无解。
本例的解析式可以用来独立检查数值结果:
其中双曲正弦
因此
割线法与牛顿法分别利用什么
二分法容易保住候选区间,却只利用符号。若已试过两个斜率
下标
如果还能计算残差对斜率的变化率
它用当前位置的切线预测零点。对足够光滑的残差函数,在简单根
不靠两次相减,怎样求残差导数
令
把
也可用两次邻近试射估计
命中数值端点,不等于已经算准
实验二有四个读数。除了试射斜率,还特意把三种误差或残差放在一起:
| 记号 | 具体在比较什么 | 能说明什么 |
|---|---|---|
| RK4 算出的右端高度减去 1 | 外层对当前数值积分结果匹配到什么程度 | |
| 同一斜率的解析右端高度减去 1 | 排除积分误差后,这次试射是否真正命中 | |
| 所有网格点上,数值高度与 |
当前离散输出与原边值问题解析解的差距 |
它只在这些节点取最大值,不是对所有连续位置都已证明的最大误差。折线连起数值节点只是绘图方式,也不能当作 RK4 的高阶连续插值。
先让
用默认初始区间
| 积分步数 |
停止时 |
同一斜率的 |
网格解误差 |
|---|---|---|---|
| 8 | |||
| 16 |
表中的
把数值端点误差记作
所以只压低第一项并不足够。步长加密可以帮助检查积分误差,却通常不是一个无需条件的严格误差界;本实验额外使用解析解,才能直接显示差距。
实验用 JavaScript 的双精度浮点数计算,显示约 7 位有效数字,显示舍入不参与后续迭代。外层最多 40 轮,以
边界条件可能选不出唯一曲线
如果把规则换成
曲线会像正弦波那样起伏,
可以对这个表达式求导,核对
先保留默认的
当
默认
这里的关系可以直接算出,不只依赖一次观察。因为
残差变成内部误差时,被乘上了一个可能很大的因子。残差与解误差之间需要条件性的桥梁。在这个例子中,
当
- 若
,每个 都命中,得到无穷多条曲线。边界条件没有选出唯一幅度。 - 若
,没有任何 能命中,问题无解。
两端给了两个条件,也不保证它们一定有效地确定两个自由度。这个结论直接来自本例的解析式。类似的正弦特征情形也见 SciPy solve_bvp 文档中的 Sturm–Liouville 例子。实验中的“精确
线性问题可以直接组合两次试射
前面三个模型都对
的试射
若
这说明线性问题在精确计算下不必反复迭代;两次初值求解就能完成组合。若
在浮点计算中,
这种组合只适用于线性方程。非线性方程的残差图可能弯曲,也可能有几个分离的零点;例如
方程可解,单次打靶仍可能难算
另一种困难出现在从左到右的传播过程。考虑
它是一条从 1 衰减到 0 的曲线。与之对应的初始斜率为
如果出发斜率比正确值多一点
下方固定
当
这说明单次打靶的初值传播可以很敏感。原解中的增长与衰减分量需要精细抵消,斜率误差或积分过程中引入的误差可能激发增长分量。它与上一节接近共振时“原边值问题对边界数据敏感”是两种不同的机制。FNC §10.2.2 讨论了打靶传播中的误差放大。
对当前常系数方程,这个区别还能直接验证:若只让左右给定高度分别扰动
两个系数非负,且和不超过 1,因此
遇到这种传播困难,可以考虑多重打靶:把区间分成若干段,每段都有自己的初始高度与斜率,只在较短距离内积分,再把各段连接条件一起求解。对二阶方程,内部接点需要同时匹配
也可以使用有限差分或配点法,在整个区间上同时约束近似解。比如本例以中心差分近似二阶导数,内部节点满足
已知的首尾高度进入右端,得到三对角方程组,可接到上一篇三对角方程组与追赶法理解。多重打靶增加了未知数,差分与配点引入了离散近似;选法要考虑误差控制和问题结构,不能只按“试射次数少”排名。SciPy 的 solve_bvp 使用四阶配点及残差控制,它不是把单次打靶包装成了一个函数。
换成右端斜率条件,再判断怎样匹配
打靶法并不限于指定两端高度。回到
可以先自己选择残差:它应检查右端高度,还是检查右端斜率?选择后再代入前面得到的
查看斜率边界和混合边界的匹配结果
要求
指定函数值通常叫 Dirichlet 条件,指定导数叫 Neumann 条件。若右端规定函数值和导数的线性组合,例如
其中
再往一般情形推广,若一阶系统的状态向量为
回看这些任务,打靶法的核心是把尚未确定的出发信息作为参数,用真实的演化方程生成轨迹,再检查题目实际规定的边界。使用前要确认试射能到达另一端、残差求根有依据;接受结果时还要检查积分精度和误差放大。端点匹配成功,是解题链条中的一步。
参考资料
- Tobin A. Driscoll、Richard J. Braun,Fundamentals of Numerical Computation,§10.2 Shooting。打靶的残差构造与单次传播的不稳定性。
- 同上,§6.4 Runge–Kutta methods。RK4 的更新公式与精度阶。
- Douglas Wilhelm Harder,滑铁卢大学,7.2 Boundary-value problems。两点边值问题、割线试射、线性情形与有限差分。
- SciPy 官方文档,
scipy.integrate.solve_bvp。一般边界残差的接口、配点法说明与正弦特征问题示例。
本文各实验使用文中给出的简化模型;解析轨迹、退化情形和扰动关系均可直接代回相应微分方程及边界核对。有限次数的试射图用于解释这些模型,不替代一般边值问题的存在性或收敛性证明。
- Title: 打靶法与边界条件匹配:从出发斜率找到整条曲线
- Author: 姜智浩
- Created at : 2026-10-22 09:30:00
- Updated at : 2026-10-22 09:55:10
- Link: https://super-213.github.io/zhihaojiang.github.io/2026/10/22/shooting-boundary-matching/
- License: This work is licensed under CC BY-NC-SA 4.0.
Loading comments…