判别式 · 弦长 · 点差法
直线与圆锥曲线的联立
直线与圆锥曲线的题目几乎都从联立开始:把直线方程代入曲线方程消去一个变量,得到一元二次方程。此后的信息都从这个方程里读:判别式给公共点个数,韦达定理给弦长与中点,而二次项系数本身给出一类容易漏掉的情形。
1 · 联立与判别式
以椭圆
a2x2+b2y2=1
与直线
y=kx+m
为例,代入消
y:
(a21+b2k2)x2+b22kmx+(b2m2−1)=0
Δ>0、=0、<0
分别对应两个、一个、零个公共点。这一步与 直线与圆 那边的做法并列:圆可以用「圆心到直线的距离与半径比较」绕开联立,而椭圆没有这种半径,联立是常规路线。
竖直线
x=x0
要单独写:它的斜率不存在,代入时消去的是
x
而不是
y,得到关于
y
的方程。lineConic 按直线一般式的
B
是否为零分这两支,两支之外没有别的情形。
图 1-1 · 直线与三族曲线的联立。可切换曲线、拖动斜率与截距,读数给出二次项系数、判别式、公共点与弦长;退化的一支单独标出。
2 · 弦长与韦达定理
设两个公共点为
A(x1,y1)、B(x2,y2)。yi=kxi+m
给出
y1−y2=k(x1−x2),从而
∣AB∣=1+k2∣x1−x2∣
而
∣x1−x2∣=(x1+x2)2−4x1x2
可由韦达定理直接从系数算出,无须解出两个根。竖直弦的
k
不存在,改用
∣AB∣=∣y1−y2∣。
例 2.1 椭圆
25x2+9y2=1
与直线
y=x−1
的弦长。联立得
(251+91)x2−92x+(91−1)=0,即
34x2−50x−200=0(两边乘
225)。x1+x2=1725、x1x2=−17100,故
∣x1−x2∣=289625+17400=2897425,弦长
=2⋅177425≈7.17。
3 · 二次项系数为零:一个公共点而不相切
联立后二次项的系数并非总不为零。它为零时方程退化成一次,恰有一个根,此时直线与曲线只有一个公共点,但这不是相切。
三族各有这样一族直线:双曲线是与渐近线平行的直线(系数
a21−b2k2
在
k=±ab
处为零),抛物线是与对称轴平行的直线(y2=2px
与
y=m
联立后没有
x2
项),椭圆则没有,它的系数
a21+b2k2
恒为正,这也是椭圆有界的代数表现。
警示 ·「只有一个公共点」不等于「相切」。相切的判据是二次项系数不为零而判别式为零;退化的判据是二次项系数为零。两者在公共点个数上无从区分,故 lineConic 分类时先看系数、再看判别式,并把退化那一支单独标成
degenerate。含参数的题目里若答案要求「相切」,退化的那个参数值必须排除。
4 · 中点弦与点差法
已知弦的中点
(x0,y0)
求弦所在直线,不必解方程。把两端点代入曲线方程后相减,因式分解出
x1+x2=2x0
与
y1+y2=2y0,直接得到斜率:
| 曲线 |
中点弦斜率 |
|
椭圆
a2x2+b2y2=1
|
k=−a2y0b2x0
|
|
双曲线
a2x2−b2y2=1
|
k=a2y0b2x0
|
|
抛物线
y2=2px
|
k=y0p
|
三式的分母都是
y0。y0=0
意味着中点落在对称轴上,此时弦竖直,而竖直不是「斜率为无穷」,是这条弦没有斜率。实测椭圆
16x2+4y2=1
取中点
(2,0),公式给出
−∞;midChordSlope 因此在
∣y0∣<10−9
时返回 null,把这一情形交给调用方按竖直弦处理,而不是让 Infinity 流进后续的直线构造。
点差法还有一处前提容易漏:算出的斜率只在「该中点确实是某条弦的中点」时有意义。椭圆内部的点都满足这一条,而椭圆外部的点不满足——公式照样给出一个数,但它对应的直线与椭圆无交点。单测因此反过来验:先联立求出一条真实的弦,取它的中点代入公式,看得到的斜率是否等于这条弦两端点连线的实际斜率。
5 · 参考文献
- Vieta's formulas. Wikipedia. 韦达定理,弦长与中点公式的代数基础。https://en.wikipedia.org/wiki/Vieta%27s_formulas
- Discriminant. Wikipedia. 判别式与实根个数。https://en.wikipedia.org/wiki/Discriminant
- Conic section. Wikipedia. 直线与二次曲线求交的一般处理。https://en.wikipedia.org/wiki/Conic_section