ax2+bx+c>0
·
Δ
一元二次不等式:抛物线与判别式
一元二次不等式
ax2+bx+c>0(a=0)的解,就是二次函数
y=ax2+bx+c
的抛物线落在
x
轴上方的那段
x。定出解集只需两件信息:抛物线与
x
轴的交点个数,以及开口方向。
1 · 判别式与开口方向
Δ=b2−4ac
· 交点个数
判别式
Δ=b2−4ac
决定交点个数:Δ>0
两个交点,Δ=0
相切于一点,Δ<0
无交点。开口方向由
a
的符号决定,a>0
向上、a<0
向下。
两者缺一不可,而且各管一件事:判别式回答「有没有根、有几个」,开口方向回答「上方那一段落在哪里」。同样是
Δ>0,a>0
时
ax2+bx+c>0
的解在两根之外,a<0
时反而在两根之间,因为开口向下时上方的那段恰好夹在两个交点当中。
图 1-1 · 抛物线随系数变形,图上标出与
x
轴的交点、对称轴与顶点。可调三个系数与不等号,观察判别式如何决定交点个数以及解集的开闭。
2 · 解集形态的对照表
reference ·
a>0
固定开口向上,把三种判别式情形与四种不等号列成对照。记两个不同实根为
x1<x2,重根为
x0=−2ab。a<0
的情形把不等号两边同乘
−1
并反向,即转化为
a>0
后查表。
表 2-1 · 开口向上时四种不等号在三种判别式情形下的解集。
|
a>0
|
Δ>0(两根
x1<x2)
|
Δ=0(重根
x0)
|
Δ<0(无实根)
|
|
ax2+bx+c>0
|
(−∞,x1)∪(x2,+∞)
|
(−∞,x0)∪(x0,+∞)
|
R
|
|
ax2+bx+c<0
|
(x1,x2)
|
∅
|
∅
|
|
ax2+bx+c≥0
|
(−∞,x1]∪[x2,+∞)
|
R
|
R
|
|
ax2+bx+c≤0
|
[x1,x2]
|
{x0}
|
∅
|
表里最容易记错的是
Δ=0
那一列:>0
的解是挖掉一点的整条数轴,≥0
的解是整条数轴,≤0
的解只有一个点,<0
无解。四种不等号在这一列上给出四种不同的答案。
3 · 求根公式算坏小根
catastrophic cancellation ·
b2≫4ac
查表要先有根,而根通常由求根公式
x=2a−b±Δ
算出。两根相差悬殊时,这条公式会把小的那个算坏,坏到偏差以两成计。
原因是相消:b2≫4ac
时
Δ≈∣b∣,于是
−b+Δ
这一支是两个近乎相等的数相减,有效位大量抵消。取
x2−108x+1=0,真实的两根是
108
与
10−8
附近。朴素公式算出的小根是
7.450580596924×10−9,与
10−8
差了约
25%,代回原式的残差是
0.255。改用
x1=aq、x2=qc(其中
q=−2b+sign(b)Δ)避开那次减法,小根算出
1.000000000000×10−8,残差
1.11×10−16。
警示 · 偏差可以彻底吃掉一个根。取
x2+109x+1=0,两根约为
−109
与
−10−9,朴素公式对小根算出的是精确的
0——不是一个很小的负数,是零本身,而
0
并不是这个方程的根。把它当作解集的端点,得到的区间端点就落错了位置。规模温和一些也照样有损:x2−104x+1
的小根,朴素公式给出
1.000000011118×10−4,稳定算法给出
1.000000010000×10−4,末三位不同(实测于 node v26.6.0)。
判别式自身反而少有意外。Δ
理论上为零的几组系数实测都精确得到
0:(1,2,1)、(1,−2,1)、(4,4,1),以及量级悬殊的
(1,107,2.5×1013)
都算出零,因为
b2
与
4ac
在这些例子里都是可精确表示的整数。所以「Δ=0
判不准」在这一族输入上并不成立,出问题的是它之后的那次减法。
4 · 参考文献
- Quadratic function. Wikipedia. 抛物线的开口、顶点与判别式。https://en.wikipedia.org/wiki/Quadratic_function
- Quadratic formula. Wikipedia. 求根公式及其数值稳定的改写。https://en.wikipedia.org/wiki/Quadratic_formula
- Loss of significance. Wikipedia. 相消导致的有效位损失。https://en.wikipedia.org/wiki/Loss_of_significance
- Forsythe, G. E. (1966). How do you solve a quadratic equation? Technical Report CS40, Stanford University. 求根公式的数值陷阱与稳定算法。