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

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

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

1 · 判别式与开口方向

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

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

两者缺一不可,而且各管一件事:判别式回答「有没有根、有几个」,开口方向回答「上方那一段落在哪里」。同样是 Δ>0\Delta > 0a>0a > 0ax2+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+c0ax^2 + bx + c \ge 0 (,x1][x2,+)(-\infty, x_1] \cup [x_2, +\infty) R\mathbb{R} R\mathbb{R}
ax2+bx+c0ax^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 · b24acb^2 \gg 4ac

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

原因是相消:b24acb^2 \gg 4acΔb\sqrt{\Delta} \approx |b|,于是 b+Δ-b + \sqrt{\Delta} 这一支是两个近乎相等的数相减,有效位大量抵消。取 x2108x+1=0x^2 - 10^8 x + 1 = 0,真实的两根是 10810^810810^{-8} 附近。朴素公式算出的小根是 7.450580596924×1097.450580596924 \times 10^{-9},与 10810^{-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×1081.000000000000 \times 10^{-8},残差 1.11×10161.11 \times 10^{-16}

警示 · 偏差可以彻底吃掉一个根。取 x2+109x+1=0x^2 + 10^9 x + 1 = 0,两根约为 109-10^9109-10^{-9},朴素公式对小根算出的是精确的 00——不是一个很小的负数,是零本身,而 00 并不是这个方程的根。把它当作解集的端点,得到的区间端点就落错了位置。规模温和一些也照样有损:x2104x+1x^2 - 10^4 x + 1 的小根,朴素公式给出 1.000000011118×1041.000000011118 \times 10^{-4},稳定算法给出 1.000000010000×1041.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^24ac4ac 在这些例子里都是可精确表示的整数。所以「Δ=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. 求根公式的数值陷阱与稳定算法。