数学 / 不等式 · 从性质到典型解法 / 一元二次不等式:抛物线与判别式 待审核 3 / 8
ax2+bx+c>0ax^2 + bx + c > 0 · Δ\Delta

一元二次不等式:抛物线与判别式

一元二次不等式 ax2+bx+c>0ax^2 + bx + c > 0(a≠0a \ne 0)的解,就是二次函数 y=ax2+bx+cy = ax^2 + bx + c 的抛物线落在 xx 轴上方的那段 xx。定出解集只需两件信息:抛物线与 xx 轴的交点个数,以及开口方向。

1 · 判别式与开口方向

Δ=b2−4ac\Delta = b^2 - 4ac · 交点个数

判别式 Δ=b2−4ac\Delta = b^2 - 4ac 决定交点个数:Δ>0\Delta > 0 两个交点,Δ=0\Delta = 0 相切于一点,Δ<0\Delta < 0 无交点。开口方向由 aa 的符号决定,a>0a > 0 向上、a<0a < 0 向下。

两者缺一不可,而且各管一件事:判别式回答「有没有根、有几个」,开口方向回答「上方那一段落在哪里」。同样是 Δ>0\Delta > 0,a>0a > 0 时 ax2+bx+c>0ax^2 + bx + c > 0 的解在两根之外,a<0a < 0 时反而在两根之间,因为开口向下时上方的那段恰好夹在两个交点当中。

图 1-1 · 抛物线随系数变形,图上标出与 xx 轴的交点、对称轴与顶点。可调三个系数与不等号,观察判别式如何决定交点个数以及解集的开闭。

2 · 解集形态的对照表

reference · a>0a > 0

固定开口向上,把三种判别式情形与四种不等号列成对照。记两个不同实根为 x1<x2x_1 < x_2,重根为 x0=−b2ax_0 = -\dfrac{b}{2a}。a<0a < 0 的情形把不等号两边同乘 −1-1 并反向,即转化为 a>0a > 0 后查表。

表 2-1 · 开口向上时四种不等号在三种判别式情形下的解集。
a>0a > 0 Δ>0\Delta > 0(两根 x1<x2x_1 < x_2) Δ=0\Delta = 0(重根 x0x_0) Δ<0\Delta < 0(无实根)
ax2+bx+c>0ax^2 + bx + c > 0 (−∞,x1)∪(x2,+∞)(-\infty, x_1) \cup (x_2, +\infty) (−∞,x0)∪(x0,+∞)(-\infty, x_0) \cup (x_0, +\infty) R\mathbb{R}
ax2+bx+c<0ax^2 + bx + c < 0 (x1,x2)(x_1, x_2) ∅\emptyset ∅\emptyset
ax2+bx+c≥0ax^2 + bx + c \ge 0 (−∞,x1]∪[x2,+∞)(-\infty, x_1] \cup [x_2, +\infty) R\mathbb{R} R\mathbb{R}
ax2+bx+c≤0ax^2 + bx + c \le 0 [x1,x2][x_1, x_2] {x0}\lbrace x_0 \rbrace ∅\emptyset

表里最容易记错的是 Δ=0\Delta = 0 那一列:>0> 0 的解是挖掉一点的整条数轴,≥0\ge 0 的解是整条数轴,≤0\le 0 的解只有一个点,<0< 0 无解。四种不等号在这一列上给出四种不同的答案。

3 · 求根公式算坏小根

catastrophic cancellation · b2≫4acb^2 \gg 4ac

查表要先有根,而根通常由求根公式 x=−b±Δ2ax = \dfrac{-b \pm \sqrt{\Delta}}{2a} 算出。两根相差悬殊时,这条公式会把小的那个算坏,坏到偏差以两成计。

原因是相消:b2≫4acb^2 \gg 4ac 时 Δ≈∣b∣\sqrt{\Delta} \approx |b|,于是 −b+Δ-b + \sqrt{\Delta} 这一支是两个近乎相等的数相减,有效位大量抵消。取 x2−108x+1=0x^2 - 10^8 x + 1 = 0,真实的两根是 10810^8 与 10−810^{-8} 附近。朴素公式算出的小根是 7.450580596924×10−97.450580596924 \times 10^{-9},与 10−810^{-8} 差了约 25%25\%,代回原式的残差是 0.2550.255。改用 x1=qax_1 = \dfrac{q}{a}、x2=cqx_2 = \dfrac{c}{q}(其中 q=−b+sign⁡(b)Δ2q = -\dfrac{b + \operatorname{sign}(b)\sqrt{\Delta}}{2})避开那次减法,小根算出 1.000000000000×10−81.000000000000 \times 10^{-8},残差 1.11×10−161.11 \times 10^{-16}。

警示 · 偏差可以彻底吃掉一个根。取 x2+109x+1=0x^2 + 10^9 x + 1 = 0,两根约为 −109-10^9 与 −10−9-10^{-9},朴素公式对小根算出的是精确的 00——不是一个很小的负数,是零本身,而 00 并不是这个方程的根。把它当作解集的端点,得到的区间端点就落错了位置。规模温和一些也照样有损:x2−104x+1x^2 - 10^4 x + 1 的小根,朴素公式给出 1.000000011118×10−41.000000011118 \times 10^{-4},稳定算法给出 1.000000010000×10−41.000000010000 \times 10^{-4},末三位不同(实测于 node v26.6.0)。

判别式自身反而少有意外。Δ\Delta 理论上为零的几组系数实测都精确得到 00:(1,2,1)(1, 2, 1)、(1,−2,1)(1, -2, 1)、(4,4,1)(4, 4, 1),以及量级悬殊的 (1,107,2.5×1013)(1, 10^7, 2.5 \times 10^{13}) 都算出零,因为 b2b^2 与 4ac4ac 在这些例子里都是可精确表示的整数。所以「Δ=0\Delta = 0 判不准」在这一族输入上并不成立,出问题的是它之后的那次减法。

4 · 参考文献

  1. Quadratic function. Wikipedia. 抛物线的开口、顶点与判别式。https://en.wikipedia.org/wiki/Quadratic_function
  2. Quadratic formula. Wikipedia. 求根公式及其数值稳定的改写。https://en.wikipedia.org/wiki/Quadratic_formula
  3. Loss of significance. Wikipedia. 相消导致的有效位损失。https://en.wikipedia.org/wiki/Loss_of_significance
  4. Forsythe, G. E. (1966). How do you solve a quadratic equation? Technical Report CS40, Stanford University. 求根公式的数值陷阱与稳定算法。