五种方法 · 纯粹性检验
轨迹方程的求法
前六页的每一族曲线都从「满足某个距离条件的点的集合」出发,而把条件翻成方程那一步,各页是就地做的。本页把这一步单独拎出来:给定一个几何条件,怎样写出它决定的那条曲线的方程,以及写出来之后还欠什么。
1 · 纯粹性与完备性
定义 1.1(轨迹方程) 设
C
是平面上的一个点集,F(x,y)=0
是一个方程。称该方程为
C
的轨迹方程,当且仅当两条同时成立:C
中每一点的坐标都满足方程(纯粹性),且满足方程的每一组坐标都给出
C
中的点(完备性)。
两条要求是两个方向的包含关系。纯粹性说轨迹点集含于解集,完备性说解集含于轨迹点集,两者合起来才是相等。课本里的求法通常只保证前一条——推导的每一步都是「由条件推出等式」,得到的是必要条件;解集里会不会混进不满足原条件的点,推导本身不回答。
所以求轨迹的产物不是一个方程,而是一个方程加一份剔除清单。core/locus.ts 的 LocusScene 据此把 shape(方程的解集)与 holes(须剔除的点)分作两个字段,单测也分两头验:采样点代进方程是否为零,以及解集上除 holes 外的点是否都取得到。
2 · 方法的选择与判据
五种方法的产物都是一个方程,入手处却各不相同:动点的位置由什么决定,就从那里下手。
| 方法 |
判据 |
| 直接法 |
几何条件能直接翻译成动点坐标之间的等式 |
| 定义法 |
条件化简后正好是某族圆锥曲线的定义式 |
| 相关点法 |
动点由另一个在已知曲线上的点带动 |
| 参数法 |
两个坐标各自好写成同一个参数的函数,而它们之间的直接关系不好写 |
| 交轨法 |
动点是两族曲线的交点,两族共用同一个参数 |
2.1 · 直接法
设
A(−2,0)、B(2,0),动点
P(x,y)
使
PA
与
PB
的斜率之积等于
m。把两条斜率照定义写出来相乘:
x+2y⋅x−2y=m,即y2=m(x2−4)
m=0
时两边除以
4m,整理得
4x2−4my2=1。m<0
给出椭圆,m=−1
给出圆
x2+y2=4,m>0
给出双曲线,m=0
则塌成
x
轴。写方程只用了一步代入,代价是两个点:(±2,0)
满足最终方程,却使
kPA
或
kPB
没有定义,必须剔除。
2.2 · 定义法
⊙C1
的圆心是
(−3,0)、半径
1,⊙C2
的圆心是
(3,0)、半径
r2。动圆
P
与前者外切、与后者内切,其半径记作
R,则
∣PC1∣=R+1、∣PC2∣=r2−R,相加得
∣PC1∣+∣PC2∣=1+r2
右端与
R
无关。这已是椭圆的定义式(见 椭圆的定义与标准方程 §1),r2>5
时该定值大于
∣C1C2∣=6,读出
a=21+r2、c=3,方程即刻写出,一次坐标都不必代。定义法省掉的是化简,省不掉的是存在性,这一点留到 §4。
2.3 · 相关点法
主动点
Q
在圆
x2+y2=4
上,M(6,0)
是定点,被动点
P
满足
MP=μMQ。在已知曲线上的是
Q,P
只被它带动,所以要先把
Q
的坐标反解成
P
的坐标:Q=M+μ1(P−M)。代进
Q
满足的方程,整理得
(x−6(1−μ))2+y2=(2μ)2
相关点法的关键步骤只有这一次反解:代进去的必须是主动点的坐标,而主动点的坐标要用被动点的坐标表出。μ=0
时反解失效,P
恒等于
M,轨迹塌成一个点。
2.4 · 参数法
以
t
为参数,取
x=1+t22(1−t2),y=1+t22bt
消参靠一个恒等式
(1−t2)2+4t2=(1+t2)2:
(2x)2+(by)2=(1+t2)2(1−t2)2+4t2=1
几何上
t
与过
(−2,0)
的直线的斜率成比例,每条这样的直线与椭圆再交于一点,那一点就是
P。t
取遍全体实数,唯独
(−2,0)
取不到:它对应竖直的那条直线,而竖直线与椭圆的第二个交点仍是它自己。消参得到的方程比轨迹多这一个点。
2.5 · 交轨法
两族直线共用参数
m:
l1:mx−y+1=0,l2:x+my−m−d=0
l1
恒过
(0,1),l2
恒过
(d,1),同一个
m
下两者的斜率是
m
与
−m1,互相垂直。交点
P
看这两个定点的张角是直角,轨迹是以它们为直径的圆。消参也得同一结果:解出
x=1+m2d、y=1+1+m2md,代入验证即
(x−2d)2+(y−1)2=(2d)2
(0,1)
要剔除。它在每一条
l1
上,却不在任何一条
l2
上:代入
l2
得
−d,而
d=0。
图 2-1 · 五种方法各自的典型构型。虚线是轨迹方程的解集,实线是参数走遍区间时动点真正描出的轨迹,两者不重合处即须剔除的部分。可切换方法,并调构型参数与动点参数。
3 · 阿波罗尼斯圆
定理 3.1 平面内到两个定点
A、B
的距离之比为常数
λ(λ>0
且
λ=1)的点,其轨迹是一个圆,称为阿波罗尼斯圆(Apollonius circle)。
证明 记
A(a1,a2)、B(b1,b2),动点
P(x,y)。条件
∣PA∣=λ∣PB∣
两边平方并展开,得
(1−λ2)(x2+y2)−2(a1−λ2b1)x−2(a2−λ2b2)y+(a12+a22)−λ2(b12+b22)=0
λ=1
时二次项系数
1−λ2
不为零,两边除以它再配方,得圆心
1−λ2A−λ2B、半径
∣1−λ2∣λ∣AB∣
的圆。距离非负,两边平方可逆,展开与配方都是恒等变形,故解集与轨迹逐点相等,这一次没有要剔除的点。■
另一条算路给出同一个圆:把
AB
按
λ
内分与外分的两点
1+λA+λB
与
1−λA−λB
各自满足距离之比为
λ,且它们是这个圆的一条直径的两端。locus.test.ts 拿它当参照量,验的是配方的结果而不必重抄配方。
λ
逼近
1
时圆心与半径的分母都是
1−λ2,两者同阶发散;圆本身却没有跑掉。跑掉的是外分点
1−λA−λB,它把圆拽成一条直线,那条直线就是
AB
的中垂线,也正是
λ=1
的答案。取
A(−3,0)、B(3,0),圆离中垂线最近的那一点的距离有闭式
∣x0∣−r=1+λ3∣1−λ∣
按
∣1−λ∣
一阶趋零。λ=1−10−4
时圆心与半径都在
3×104
量级,而这条缝只有
1.5×10−4。
这条缝也是「同量级大数相减」的一个现成标本。实测(node v26,双精度):1−λ=10−6
时闭式与「圆心减半径」的相对误差还只有
7.1×10−5,10−7
跳到
1.8×10−2,10−8
已是
3
倍,10−9
时直接相减给出
0,而真实缝宽是
1.5×10−9。apolloniusGap 只给闭式,不给相减。
图 3-1 · 到两定点距离之比为
λ
的点的轨迹。可调
λ
观察圆心与半径随
1−λ2
同阶发散,并对照闭式与直接相减两种算法给出的圆到中垂线的距离。
4 · 剔除清单的来源
| 来源 |
例 |
方程为什么留不住它 |
| 分母为零、斜率不存在 |
直接法的
(±2,0)
|
化简时两边同乘了一个可能为零的量 |
| 参数的极限位置 |
参数法的
(−2,0)、交轨法的
(0,1)
|
消参把参数的无穷远处也算进了解集 |
| 构型自身的存在性约束 |
定义法里动圆的半径须为正 |
这一条根本没进过化简 |
第二类的点常被当成「差一点点就取到了」,实测不支持这个说法。参数法那一栏取
b=1.5:t=12
时动点离洞还有
0.2498,t=103
时是
3.0×10−3,t=106
时是
3.0×10−6。距离按
1/∣t∣
一阶趋零,加密参数只会让它更小,永远不会让它变成零。
第三类最容易漏,定义法那一栏就栽在它上面。∣PC1∣+∣PC2∣=1+r2
认出椭圆之后方程已经写完,但动圆的半径
R=∣PC1∣−1
还得为正,而这个要求不出现在化简过程里。C1
本身是这个椭圆的一个焦点,∣PC1∣
的最小值是
a−c,约束于是化为
a−c>1,即
r2>7。这一栏原先给
r2
的下界取的是
5.5,单测第一次跑就断在
R>0
上:r2=6
时左顶点处
R=−0.5,那一段「动圆」根本不存在,椭圆左端有一整段弧不属于轨迹。改动落在构型的参数范围上(下界抬到
7.5),正文的推导没有跟着改;r2=7
是临界值,R=0,动圆退化成点圆。
值得一提的是纯粹性那一侧一直很干净:五个构型各取四百个采样点代进自己的方程,最大残差落在
4.4×10−16
与
6.7×10−16
之间,也就是两三个 ULP。出问题的从来是完备性那一侧,而完备性不归数值管,它是推导之外补上的一次逻辑检查。
5 · 参考文献
- Locus (mathematics). Wikipedia. 轨迹的定义,以及「点集等同于方程的解集」这一表述。https://en.wikipedia.org/wiki/Locus_(mathematics)
- Circles of Apollonius. Wikipedia. 阿波罗尼斯圆的定义、圆心与半径,以及比值为 1 时的退化。https://en.wikipedia.org/wiki/Circles_of_Apollonius
- Parametric equation. Wikipedia. 参数方程与消参,含圆的有理参数化。https://en.wikipedia.org/wiki/Parametric_equation
- Thales's theorem. Wikipedia. 直径所对的圆周角为直角,交轨法那一栏的几何依据。https://en.wikipedia.org/wiki/Thales%27s_theorem