打靶法与边界条件匹配:从出发斜率找到整条曲线

姜智浩 Lv5

从左边发出一颗小球,希望它在指定的水平位置经过一个目标。起点和目标都固定,轨迹向下弯曲的规则也已知;还没决定的是,小球出发时要朝上倾斜多少。

先用一个简化模型做这个任务。把水平位置记作 ,高度记作 ,起点为 ,目标为 。选好尺度后,轨迹遵循 :沿着水平方向前进时,曲线的斜率以固定速率减小。这里 表示斜率, 表示斜率随 的变化率;两个撇号不表示高度的平方。全文实验里的量均经过缩放,没有物理单位。

这个规则对应无空气阻力、水平速度固定的抛物线模型;实验调节的是初始竖直速度与水平速度之比,并非在固定总速率下任意改变发射角。它只是帮助理解方法的教学模型。

可以先猜一个出发斜率,看看落点高了还是低了,再调整下一次。后面要解决的是:当轨迹复杂到不能直接写出公式时,怎样把这种尝试变成有依据的计算,以及怎样判断结果可信。

先试射,再整理成方程

把出发斜率记为 。在下面的实验中,先保留一条试射曲线,再选择一个不同的 ,比较两次在 处的高度。不要急着找精确值,可以先找到一次偏高、一次偏低的试射。

实验同时显示“落点减目标”,也就是有符号残差。正数表示偏高,负数表示偏低,0 表示恰好匹配。换一个右端目标后,再检验原来的出发斜率是否仍然合适;需要时可以逐级展开提示。

这个例子可以完整算出来。斜率以速率 改变,所以从 出发,到位置 时变成

从 0 走到 ,高度的变化等于这段区间内斜率的累积。累积常数 得到 ,累积 得到 ;再用起点高度为 0,得到

分号后的 提醒我们:每个出发斜率对应一条曲线。到右端 ,高度是 ,因此目标为 0 时应取 。代回可得 ,两端都是 0,中点高度为 。这与实验中的曲线相互核对。

如果目标高度改成 ,希腊字母 在这里表示一个给定的数,就要满足

这个答案依赖当前方程。更一般的情形里,斜率和落点未必保持这样简单的关系,但“从一个斜率出发,计算落点,再比较目标”的结构仍然可以保留。

把边值问题变成初值问题

设一条未知曲线满足

是左右端位置,、 是规定的两端函数值。 是已知规则,输入当前位置、当前高度与当前斜率,输出斜率的变化率。前面的例子就是 、、、。

条件分别给在两个端点,这叫两点边值问题。许多数值方法却擅长另一种输入:在同一个位置同时知道高度和斜率,例如 、,然后逐步向右计算。这叫初值问题。

边值问题缺少的正是出发斜率。打靶法暂时补上一个猜测 ,求解

再把右端偏差写成一个关于 的函数:

目标转为寻找 。 的一次计算可能需要积分整条轨迹,因此它虽然只输入一个数,内部做的工作并不少。内层负责从左走到右,外层负责调整出发斜率。这种用初值求解器和求根器组合求解边值问题的做法,见 Driscoll 与 Braun 的教材 《Fundamentals of Numerical Computation》§10.2。

打靶法的两层计算:猜斜率,积分到右端,检查残差,再更新斜率

左端条件已经由初值严格指定,右端条件通过残差匹配;原来的微分方程并没有被舍弃。若每个候选初值问题在 上有唯一解,那么任何使 的斜率都会给出边值问题的解。反过来,任何边值问题的解都有自己的左端斜率,把它拿来试射,就会得到对应的零点。

这里的条件不能省略。对一阶形式的方程,右端连续、对状态局部满足 Lipschitz 条件(状态改变一点,右端的改变量不超过某个固定倍数乘状态改变量),是保证局部初值解存在唯一的常用充分条件;要定义右端落点,还必须保证解能延伸到 。局部存在并不排除解在到达右端前变得无界。更不能从“每次试射唯一”推出“所有试射里恰好只有一条命中”。后面会看到无解与多解的例子。

内层怎样逐步走到右端

先令 ,把一个二阶方程改成两个一阶方程:

这里 只是斜率的新名字。每一步既更新高度,也更新斜率;若只更新高度、把斜率始终固定为 ,算出的就只是一条直线。

最朴素的一步是:用当前斜率估计这小段的高度变化,再用当前 估计斜率变化,即 、。 是水平步长,下标 表示走到了第几个位置。这是显式欧拉法,它能解释“向右走”的含义,但步长较大时误差可能明显。

接下来的实验采用经典四阶 Runge–Kutta 方法,简称 RK4。在同一步内,它还会估计中途和末端的状态,用四次斜率信息合成更新;不必先掌握完整公式也能继续理解外层打靶。

RK4:具体更新公式与精度条件

将两个状态合并为列向量 ,其中上标 表示转置,用于将一行排成一列。定义 ,问题就成为 。

从 的近似状态 出发,一步 RK4 为

是第 次估计的状态变化率,;中间试探状态并不全是真实轨迹上的点。公式中的向量加法同时作用于高度与斜率。

在固定有限区间、解与右端足够光滑且满足相应 Lipschitz 条件时,RK4 从精确起点出发的一步误差为 ,累计的全局误差为 。这里 表示当 足够小时,误差可被某个与 无关的常数乘 控制。它不保证每次减半步长都精确改善 16 倍,也未包含无限缩小步长后的舍入影响。公式与阶数可核查 FNC §6.4。

外层用残差选择下一次试射

换一个用数值积分来试射的任务:

它不再是前面的小球模型,而是用于核对计算的数学例子。改变方程后,不能沿用“斜率等于目标加 1”的答案。

先试 ,轨迹一直为 0,右端低于目标。再试 ,会高于目标。若落点随 连续变化,就可以在 中找一次命中。二分法先试中间斜率 ,其中 、 是当前斜率区间的左右端点;再根据 的符号,只保留仍然两端异号的那一半。

下方实验允许选择初始区间。可以先预测 是否适合二分,再切换查看依据。播放会按轮展示试射,单步、回看和重置使用同一组计算结果。这里的一轮包含一次完整的内层积分,播放速度不表示计算耗时。

二分的依据是介值定理:连续函数两端异号,中间至少有一个零点。一次更新后,这个性质仍被保留;每轮区间长度减半。初始长度为 ,更新 次后长度是 ,再取中点,它离区间内某个根至多 。这个保证针对所求函数的根,不自动涵盖数值积分误差。

同号区间不满足这个保证;对一般函数,同号区间甚至可能含有两个零点或一个相切的零点。实验拒绝开始二分,只说明当前设置缺少包根依据。它没有证明整个边值问题无解。

本例的解析式可以用来独立检查数值结果:

其中双曲正弦 ;求两次导数会回到它自身,所以代回 ,再检查起点高度和斜率,就能验证公式。星号 表示真正匹配边界的斜率。原边值问题的解析解为

因此 的残差约为 , 的残差约为 ;区间 两端都偏高,且本例的残差是递增直线,根确实不在这个区间内。这里额外使用了本例的解析式,结论比一般的“同号不能保证包根”更强。

割线法与牛顿法分别利用什么

二分法容易保住候选区间,却只利用符号。若已试过两个斜率 、,也可以把残差图上对应的两点连成直线,用这条割线与横轴的交点作为下一次猜测:

下标 是外层迭代轮次。分母是两次残差之差;为 0 时不能做这一步,过小时也可能产生很大的跳跃。对本例,精确的 本来就是直线,任意两次不同试射在精确算术下就足以定位根。对非线性问题,割线可能走出原区间,没有无条件的收敛保证。

如果还能计算残差对斜率的变化率 ,就可以用牛顿法:

它用当前位置的切线预测零点。对足够光滑的残差函数,在简单根 附近、初值足够接近时,牛顿法具有局部二次收敛,即下一轮误差可由常数乘本轮误差的平方控制;从远处出发、导数为零或试射不能到达右端时,都需要额外处理。实际可将快速更新与保留包根区间结合,必要时退回二分。

不靠两次相减,怎样求残差导数

令 ,表示初始斜率改变一点,曲线随之改变多少。在 对 、 连续可微,且解对初值可微依赖的条件下,对原方程按参数 求导,得到

与 是分别对高度和斜率的偏导数;它们沿当前试射曲线取值。初始高度固定,所以 ;初始斜率就是 ,对自身求导得到 。

把 一起向右积分,便有 。本例 ,所以 、、,得到 ,与直接对 求导的结果一致。

也可用两次邻近试射估计 ,但两次积分误差与相减的舍入误差会进入估计;差分间隔不是越小越好。

命中数值端点,不等于已经算准

实验二有四个读数。除了试射斜率,还特意把三种误差或残差放在一起:

记号 具体在比较什么 能说明什么
RK4 算出的右端高度减去 1 外层对当前数值积分结果匹配到什么程度
同一斜率的解析右端高度减去 1 排除积分误差后,这次试射是否真正命中
所有网格点上,数值高度与 的最大绝对差 当前离散输出与原边值问题解析解的差距

, 是把区间分成的步数,网格点是 、。若数值高度记为 ,最后一项定义为

它只在这些节点取最大值,不是对所有连续位置都已证明的最大误差。折线连起数值节点只是绘图方式,也不能当作 RK4 的高阶连续插值。

先让 的试射到达停止状态,再改成 并再次完成迭代,比较保留的结果。两次都可能让 ,但 和 并不相同:外层可能已经很准确地解出了一个含积分近似的落点方程。要改善连续问题的解,还得控制内层误差。

用默认初始区间 、相同停止规则,完成两组试射,可复算出以下结果(数值已舍入):

积分步数 停止时 同一斜率的 网格解误差
8
16

表中的 检查所选斜率对应的精确试射, 检查实际积分输出;这两个量不必相同。数值积分误差还可能抵消一部分斜率偏差,不能只按某一个读数判断整次计算。

把数值端点误差记作 ,就有

所以只压低第一项并不足够。步长加密可以帮助检查积分误差,却通常不是一个无需条件的严格误差界;本实验额外使用解析解,才能直接显示差距。

实验用 JavaScript 的双精度浮点数计算,显示约 7 位有效数字,显示舍入不参与后续迭代。外层最多 40 轮,以 为停止准则;同号区间、非有限数、浮点区间停滞和达到上限均与成功状态区分。实际程序也应保留这些区别,不能一到轮数上限就输出“收敛”。

边界条件可能选不出唯一曲线

如果把规则换成

曲线会像正弦波那样起伏, 控制它在同一区间内变化的快慢。从斜率 出发,精确轨迹与残差分别是

可以对这个表达式求导,核对 ,再求二阶导数,核对原方程。注意 与外层迭代下标只是本节之外的记号复用;本节 始终是方程参数。

先保留默认的 、,把 从 1 改为 2,比较中点高度与右端残差。然后切换到精确 ,分别尝试两个目标。这个实验不做数值积分,以便只观察方程和边界本身带来的区别。

当 ,匹配斜率唯一:

默认 、 的唯一解就是 。但选择 时,右端残差仅约 ,中点高度却约为 。若只把端点残差小于 当作充分验收,就会接受一条在内部明显偏离零解的曲线。

这里的关系可以直接算出,不只依赖一次观察。因为 ,所以

残差变成内部误差时,被乘上了一个可能很大的因子。残差与解误差之间需要条件性的桥梁。在这个例子中, 接近 0,使边界问题对右端数据也敏感:把 增加 ,解会增加 。这属于原问题的敏感性,不能只靠换一个求根器消除。

当 时,,所有试射的右端都为 0,于是:

  • 若 ,每个 都命中,得到无穷多条曲线。边界条件没有选出唯一幅度。
  • 若 ,没有任何 能命中,问题无解。

两端给了两个条件,也不保证它们一定有效地确定两个自由度。这个结论直接来自本例的解析式。类似的正弦特征情形也见 SciPy solve_bvp 文档中的 Sturm–Liouville 例子。实验中的“精确 ”按符号关系将右端系数设为 0;没有把浮点计算中一个很小的数冒充严格零。

线性问题可以直接组合两次试射

前面三个模型都对 线性。对一般线性方程

是已知连续函数。先求一个满足 、 的试射 ;再求一个满足

的试射 。第二个方程去掉了外加项 。由于线性叠加, 满足原方程,且左端高度为 、斜率为 。因此

若 ,便能直接取

这说明线性问题在精确计算下不必反复迭代;两次初值求解就能完成组合。若 ,则根据 是否等于 ,分别得到无穷多解或无解。前面的振荡例子恰好有 ,把三种情况都展示了出来。线性打靶的教学说明也可参考 滑铁卢大学的边值问题讲义。

在浮点计算中, 太小、两次试射误差较大或组合发生严重相消,仍会影响结果。代数上一次求出斜率,并不免除数值验证。

这种组合只适用于线性方程。非线性方程的残差图可能弯曲,也可能有几个分离的零点;例如 、 的 Bratu 问题有两个解,见 SciPy 文档的对应例子。找到一次命中,不能自动宣布已经找全所有解。

方程可解,单次打靶仍可能难算

另一种困难出现在从左到右的传播过程。考虑

是规定的正参数。这个边值问题有唯一解析解

它是一条从 1 衰减到 0 的曲线。与之对应的初始斜率为 ,其中 、。

如果出发斜率比正确值多一点 ,两条精确试射的差就满足相同的齐次方程,左端高度差为 0,左端斜率差为 ,因而

下方固定 ,只改变 。可以先估计:当参考解始终位于 时,这么小的斜率偏差能否让落点离开这个范围。图使用解析扰动公式,隔离出这一个误差来源;它没有假装运行某个真实求解器。

当 ,放大倍数约为 ,同样的 斜率偏差会造成约 的端点偏差,远大于原解的高度范围。

这说明单次打靶的初值传播可以很敏感。原解中的增长与衰减分量需要精细抵消,斜率误差或积分过程中引入的误差可能激发增长分量。它与上一节接近共振时“原边值问题对边界数据敏感”是两种不同的机制。FNC §10.2.2 讨论了打靶传播中的误差放大。

对当前常系数方程,这个区别还能直接验证:若只让左右给定高度分别扰动 ,解的变化为

两个系数非负,且和不超过 1,因此 。在边界值作为输入、函数值最大绝对误差作为输出度量时,这个边值问题对边界扰动并不放大;敏感的是用单个初始斜率跨越整个区间的那种计算表示。这里没有讨论对方程系数扰动的条件数。

遇到这种传播困难,可以考虑多重打靶:把区间分成若干段,每段都有自己的初始高度与斜率,只在较短距离内积分,再把各段连接条件一起求解。对二阶方程,内部接点需要同时匹配 和 ;只让高度接上而留下折角,还不满足同一条光滑解的要求。

也可以使用有限差分或配点法,在整个区间上同时约束近似解。比如本例以中心差分近似二阶导数,内部节点满足

已知的首尾高度进入右端,得到三对角方程组,可接到上一篇三对角方程组与追赶法理解。多重打靶增加了未知数,差分与配点引入了离散近似;选法要考虑误差控制和问题结构,不能只按“试射次数少”排名。SciPy 的 solve_bvp 使用四阶配点及残差控制,它不是把单次打靶包装成了一个函数。

换成右端斜率条件,再判断怎样匹配

打靶法并不限于指定两端高度。回到 、,这次不规定右端高度,而要求曲线到右端时恰好水平,即 。

可以先自己选择残差:它应检查右端高度,还是检查右端斜率?选择后再代入前面得到的 ,核对合适的出发斜率。这个改变不需要重新发明积分方法,改变的是“怎样算命中”。

查看斜率边界和混合边界的匹配结果

要求 ,应定义 ,所以 ,轨迹为 。此时右端高度为 1,并不回到 0;若还同时强加 ,就与这个任务不相容。

指定函数值通常叫 Dirichlet 条件,指定导数叫 Neumann 条件。若右端规定函数值和导数的线性组合,例如

其中 是给定常数且 不同时为 0,就可以定义

都非零时常称为 Robin 条件。若右端要求 ,代入抛物线公式得到 ,故 ;此时右端高度 与斜率 相加为 0。真实物理量带单位时, 需要承担相应量纲,不能把不同单位的量任意相加。

再往一般情形推广,若一阶系统的状态向量为 ,边界关系写成 ,就根据左端已知关系,用参数向量 表示尚未确定的自由度,再对剩余边界残差求解。未知自由度有几个,通常就要匹配几个独立的残差分量;数量相同还不够,局部唯一性也需要残差对参数的 Jacobian 矩阵非奇异。这个矩阵记录每个残差对每个参数的变化率,是一维条件 的对应物。

回看这些任务,打靶法的核心是把尚未确定的出发信息作为参数,用真实的演化方程生成轨迹,再检查题目实际规定的边界。使用前要确认试射能到达另一端、残差求根有依据;接受结果时还要检查积分精度和误差放大。端点匹配成功,是解题链条中的一步。

参考资料

  1. Tobin A. Driscoll、Richard J. Braun,Fundamentals of Numerical Computation,§10.2 Shooting。打靶的残差构造与单次传播的不稳定性。
  2. 同上,§6.4 Runge–Kutta methods。RK4 的更新公式与精度阶。
  3. Douglas Wilhelm Harder,滑铁卢大学,7.2 Boundary-value problems。两点边值问题、割线试射、线性情形与有限差分。
  4. 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.
Comments

Loading comments…