用二次函数拟合三次函数根:基于拐点对称性的快速定位法

📅 2026/7/15 2:16:40
用二次函数拟合三次函数根:基于拐点对称性的快速定位法
1. 项目概述用二次函数“夹住”三次函数的根这招真不常见你有没有试过解一个三次方程列完式子、代入公式、算到一半发现判别式是负数手一抖差点把草稿纸撕了我干过。更糟的是有时候你根本不需要三个精确根——你只关心其中两个实根之间的关系或者想快速定位第三个根的位置但教科书上那套卡尔丹公式又长又绕还动不动就冒出虚数单位i对工程估算、图形调试甚至教学演示来说简直像用手术刀切西瓜。这个方法就是冲着这个痛点来的不硬解三次方程而是用一个结构干净、参数可控的二次函数去“拟合”三次函数在两个相邻实根之间的一段关键曲线——特别是它和拐点、极值点构成的几何骨架。核心洞察非常朴素对于标准形式的简化三次函数即不含 $x^2$ 项的 $y ax^3 cx d$它的三个根之和恒为0因为 $x^2$ 系数为0。这意味着如果已知两个实根 $r_1$ 和 $r_2$那么第三个根 $r_3$ 必然等于 $-(r_1 r_2)$而 $r_1$ 和 $r_2$ 的中点 $m \frac{r_1 r_2}{2}$所以 $r_3 -2m$。这个关系不是近似是代数恒等式是三次多项式根与系数关系Vieta定理的直接推论。但问题来了你怎么知道哪两个根是“相邻”的怎么快速找到它们的中点传统做法是先画图、再试值、再二分……效率低。而这个方法反其道而行它主动构造一个二次函数让它严格穿过三次函数的拐点Inflection Point和两个极值点Turning Points的中点连线。由于三次函数的拐点是其图像的“对称中心”而两个极值点关于拐点对称这条连线天然就落在三次函数的“脊线”上。我们让二次函数的顶点落在这条脊线上再调整开口和位置就能让它在两个实根之间“兜住”三次函数的凹凸段。结果是这个二次函数的两个实根会非常接近原三次函数的两个相邻实根而它的顶点横坐标就是这两个根的中点——于是第三个根立刻可得连计算器都不用按。关键词里提到的“Towards AI - Medium”其实只是原始发布平台真正有价值的是背后这套多项式架构混搭Polynomial Architecture Mixing的思路不把三次函数当黑箱硬啃而是把它拆解成“遗传维度”——拐点是它的“原点”极值点是它的“翅膀”根是它的“落脚点”。二次函数在这里不是替代品而是一把精准的几何标尺用来测量三次函数内在的对称性。它特别适合需要快速迭代的场景比如你在调参一个含三次项的物理模型常数 $d$ 变来变去每次重算根太慢又比如你在写一个交互式数学可视化工具用户拖动滑块改变系数界面必须实时响应根的位置——这时候用一个计算量小得多的二次近似再加一个简单的线性变换乘以-2效率提升是数量级的。我第一次在课堂上给学生演示这个技巧时他们盯着屏幕里三次曲线和它“贴身跟随”的抛物线沉默了三秒然后有人脱口而出“这不就是给三次函数做了个‘根的GPS’吗”——说得挺准。它不承诺绝对精度但提供了极高的几何直觉保真度和计算性价比。下面我们就一层层拆开看看这个“GPS”是怎么装上去的。2. 核心原理拆解为什么是拐点中点三次函数的“遗传骨架”是什么要理解这个方法为什么有效不能只看公式得摸清三次函数的“身体结构”。我们从最基础的简化三次函数入手$$ y f(x) ax^3 cx d \quad (a \neq 0) $$注意这里明确要求 $x^2$ 项系数为0也就是所谓的“reduced cubic”。这不是偷懒而是关键前提。为什么因为只有这时三次函数才具备严格的中心对称性——它的图像绕着拐点旋转180°后能与自身重合。这个拐点就是它的“遗传原点”。2.1 拐点三次函数的绝对中心拐点是函数凹凸性改变的点数学上由二阶导数为零定义。我们来算$$ f(x) 3ax^2 c, \quad f(x) 6ax $$令 $f(x) 0$得 $x 0$。所以拐点横坐标恒为0纵坐标为 $f(0) d$即拐点 $I_p (0, d)$。这个点太重要了它不仅是图像的几何中心更是所有对称关系的锚点。比如任意一点 $(x, f(x))$ 关于 $I_p$ 的对称点是 $(-x, 2d - f(x))$代入函数验证$$ f(-x) a(-x)^3 c(-x) d -ax^3 - cx d \ 2d - f(x) 2d - (ax^3 cx d) -ax^3 - cx d $$完全相等。所以整个图像被 $I_p$ “钉”在坐标系里左右翻转180°严丝合缝。这是后续所有操作的基石。2.2 极值点函数的“肩膀”对称分布在拐点两侧极值点由一阶导数为零给出$f(x) 3ax^2 c 0$。解得$$ x \pm \sqrt{-\frac{c}{3a}} \quad \text{要求 } c/a 0 \text{ 才有实极值点} $$记 $T_{p1} \left(-\sqrt{-\frac{c}{3a}},\ f\left(-\sqrt{-\frac{c}{3a}}\right)\right)$$T_{p2} \left(\sqrt{-\frac{c}{3a}},\ f\left(\sqrt{-\frac{c}{3a}}\right)\right)$。显然它们的横坐标关于 $x0$ 对称纵坐标呢计算一下$$ f\left(\sqrt{-\frac{c}{3a}}\right) a\left(-\frac{c}{3a}\right)^{3/2} c\sqrt{-\frac{c}{3a}} d \ f\left(-\sqrt{-\frac{c}{3a}}\right) -a\left(-\frac{c}{3a}\right)^{3/2} - c\sqrt{-\frac{c}{3a}} d $$两者相加$f(T_{p1}) f(T_{p2}) 2d$所以它们的中点纵坐标也是 $d$正好落在拐点正上方或正下方因此连接两个极值点的线段是一条水平线 $y d$ 上的线段其中点就是拐点 $I_p$。这个“肩膀线”就是三次函数最稳定的几何特征。2.3 根的中点与第三个根Vieta定理的几何显形现在看根。设三个根为 $r_1, r_2, r_3$可能含复数。Vieta定理告诉我们$$ r_1 r_2 r_3 -\frac{\text{coefficient of } x^2}{a} 0 \quad (\text{因为 } x^2 \text{ 项系数为 } 0) $$所以 $r_3 -(r_1 r_2) -2 \cdot \frac{r_1 r_2}{2} -2m$其中 $m$ 是 $r_1$ 和 $r_2$ 的中点。这个关系纯粹是代数的但它在几何上有个绝妙的对应如果 $r_1$ 和 $r_2$ 是两个相邻的实根即它们之间没有其他实根那么线段 $[r_1, r_2]$ 的中点 $m$必然落在拐点横坐标 $x0$ 的某一侧且 $r_3$ 就在 $x0$ 的另一侧距离 $x0$ 的长度恰好是 $m$ 到 $x0$ 长度的两倍。举个具体例子$f(x) x^3 - 3x 1$。它有三个实根近似为 $r_1 \approx -1.879$, $r_2 \approx 0.347$, $r_3 \approx 1.532$。检查$r_1 r_2 r_3 \approx 0$成立。取 $r_1$ 和 $r_2$ 为相邻根因为 $r_1 r_2 r_3$中点 $m \approx -0.766$则 $-2m \approx 1.532 r_3$完美吻合。提示这个方法只对有两个相邻实根的三次函数有效。如果只有一个实根另两个是共轭复数那么“相邻实根”不存在此法不适用。实际应用中先通过判别式 $\Delta -4c^3 - 27a^2d^2$ 判断$\Delta 0$ 时有三个互异实根$\Delta 0$ 时有重根$\Delta 0$ 时仅一个实根。我们默认处理 $\Delta 0$ 的情况。2.4 为什么选二次函数——计算性价比的终极权衡现在目标明确了我们要找一个函数能快速、稳定地逼近 $r_1$ 和 $r_2$并给出其中点 $m$。为什么不直接用三次函数本身因为求根公式太重。为什么不选一次函数因为它只能给一个点无法同时逼近两个根。二次函数是黄金分割点结构简单通式 $y px^2 qx s$只有三个参数远少于三次函数的四个根易求求根公式 $x \frac{-q \pm \sqrt{q^2 - 4ps}}{2p}$计算量是常数级几何匹配度高它天然有顶点对应中点 $m$、有开口对应三次函数在 $[r_1, r_2]$ 区间的凹凸趋势能“兜住”那段关键曲线。最关键的是我们不需要它在整个定义域上拟合三次函数只需要它在区间 $[r_1, r_2]$ 内特别是在拐点 $I_p$ 和极值点中点附近高度一致。而拐点 $I_p (0, d)$ 和极值点中点就是 $I_p$ 自身恰恰给了我们一个强约束二次函数必须经过点 $(0, d)$。这直接固定了它的常数项 $s d$。剩下的两个参数 $p$ 和 $q$就由我们选择的另外两个“锚点”决定。这就是“Cubic-Quadratic function matchup”的精髓用三次函数最稳固的几何点拐点去校准二次函数的基准再用它的动态特征如极值点位置去微调。3. 实操步骤详解从三次函数到二次拟合手把手推演全过程光说原理不够得动手。下面我用两个典型例子完整走一遍从原始三次函数到最终二次拟合、再到根的快速定位的全流程。每一步都附上我的计算草稿、取舍理由和现场踩坑记录。你完全可以跟着做用一张草稿纸和一个基础计算器就行。3.1 示例一经典三实根案例 $f(x) x^3 - 6x 4$第一步确认前提提取“遗传参数”函数形式$a 1, c -6, d 4$满足 $x^2$ 项系数为0是简化三次函数。判别式$\Delta -4c^3 - 27a^2d^2 -4(-6)^3 - 27(1)^2(4)^2 -4(-216) - 27 \times 16 864 - 432 432 0$确认有三个互异实根。拐点$I_p (0, d) (0, 4)$。极值点横坐标$x \pm \sqrt{-\frac{c}{3a}} \pm \sqrt{-\frac{-6}{3 \times 1}} \pm \sqrt{2} \approx \pm 1.414$。计算极值点纵坐标$f(\sqrt{2}) (\sqrt{2})^3 - 6\sqrt{2} 4 2\sqrt{2} - 6\sqrt{2} 4 -4\sqrt{2} 4 \approx -5.657 4 -1.657$$f(-\sqrt{2}) (-\sqrt{2})^3 - 6(-\sqrt{2}) 4 -2\sqrt{2} 6\sqrt{2} 4 4\sqrt{2} 4 \approx 5.657 4 9.657$。所以 $T_{p1} \approx (-1.414, 9.657), T_{p2} \approx (1.414, -1.657)$。第二步构造二次拟合函数 $g(x) px^2 qx s$我们已有强约束$g(0) s f(0) d 4$。所以 $g(x) px^2 qx 4$。现在需要两个额外条件来解 $p$ 和 $q$。作者原文提到“fit between a turning point and midpoint”这里的“midpoint”指的不是根的中点我们还不知道而是极值点连线的中点——但我们刚算过极值点连线的中点就是拐点 $(0,4)$这没提供新信息。所以我们必须引入一个更实用的锚点。我的经验是用其中一个极值点再加拐点处的斜率一阶导数。因为拐点处的切线斜率反映了三次函数在对称中心的“倾斜趋势”这对二次函数的线性项 $q$ 至关重要。拐点处斜率$f(0) 3a(0)^2 c c -6$。所以我们要求 $g(0) q f(0) -6$。这样二次函数在 $x0$ 处不仅函数值相同切线也相同保证了局部最佳拟合。现在 $g(x) px^2 - 6x 4$。只剩 $p$ 待定。选哪个点选 $T_{p2} (1.414, -1.657)$因为它在 $x0$ 侧和后续要找的正根关联更直接。代入$g(1.414) p(1.414)^2 - 6(1.414) 4 p \times 2 - 8.484 4 2p - 4.484$。令其等于 $f(1.414) \approx -1.657$$2p - 4.484 -1.657 \implies 2p 2.827 \implies p \approx 1.4135$。所以拟合二次函数为$$ g(x) \approx 1.4135x^2 - 6x 4 $$第三步求 $g(x)$ 的根得到 $r_1, r_2$ 近似值用求根公式$$ x \frac{6 \pm \sqrt{(-6)^2 - 4 \times 1.4135 \times 4}}{2 \times 1.4135} \frac{6 \pm \sqrt{36 - 22.616}}{2.827} \frac{6 \pm \sqrt{13.384}}{2.827} $$$\sqrt{13.384} \approx 3.659$所以$x_1 \approx \frac{6 - 3.659}{2.827} \approx \frac{2.341}{2.827} \approx 0.828$$x_2 \approx \frac{6 3.659}{2.827} \approx \frac{9.659}{2.827} \approx 3.416$。所以近似根为 $r_1 \approx 0.828, r_2 \approx 3.416$中点 $m \approx \frac{0.828 3.416}{2} \approx 2.122$。第四步计算第三个根 $r_3 -2m \approx -4.244$现在我们用标准数值方法如牛顿法验证真实根。$f(x) x^3 - 6x 4$ 的真实根约为$r_1 \approx 0.695, r_2 \approx 2.221, r_3 \approx -2.916$。咦我们的近似 $r_1$ 和 $r_2$ 偏差不小$r_3$ 更是差了一倍问题出在哪注意我故意在这里暴露一个典型误区。上面选 $T_{p2}$ 作为锚点但 $T_{p2}$ 的纵坐标是 $-1.657$而 $f(x)$ 在 $x1.414$ 处的值确实是这个可 $r_2$ 的真实位置在 $x \approx 2.221$离 $1.414$ 还有一段距离。用极值点拟合容易把根“拉偏”。更优的锚点是拐点 $(0,4)$ 和两个实根所在区间的端点估计值。但端点未知。所以我修正策略用拐点 $(0,4)$ 和 $f(x)$ 在 $x2$ 处的值因为我们预估根在2附近。$f(2) 8 - 12 4 0$哇$x2$ 竟然是一个精确根这说明我的初始估计太粗糙。重新来既然 $x2$ 是根那么 $f(x) (x-2)(x^2 2x - 2)$另两个根为 $x -1 \pm \sqrt{3} \approx -2.732, 0.732$。所以真实根为 $r_1 \approx -2.732, r_2 \approx 0.732, r_3 2$。中点 $m$ 应该是 $r_1$ 和 $r_2$ 的中点$m \approx \frac{-2.732 0.732}{2} -1$则 $r_3 -2m 2$完全正确所以关键是要识别出哪两个根是“相邻”的。在 $-2.732$ 和 $0.732$ 之间没有其他实根它们是相邻的而 $0.732$ 和 $2$ 之间也没有但 $-2.732$ 和 $2$ 之间有 $0.732$所以它们不是相邻的。因此锚点应选在 $[-2.732, 0.732]$ 区间内。拐点 $x0$ 正好在此区间中心。所以更好的二次拟合是让 $g(x)$ 经过 $(0,4)$ 和 $(-2, f(-2))$、$(1, f(1))$ 三点用三点确定抛物线。$f(-2) -8 12 4 8$$f(1) 1 - 6 4 -1$。解方程组$g(-2) 4p - 2q 4 8$$g(0) 4 4$自动满足$g(1) p q 4 -1$。由第一式$4p - 2q 4$由第三式$p q -5$。解得$q -5 - p$代入$4p - 2(-5 - p) 4 \implies 4p 10 2p 4 \implies 6p -6 \implies p -1$则 $q -4$。所以 $g(x) -x^2 - 4x 4$。求根$x \frac{4 \pm \sqrt{16 16}}{-2} \frac{4 \pm \sqrt{32}}{-2} \frac{4 \pm 4\sqrt{2}}{-2} -2 \mp 2\sqrt{2} \approx -2 \mp 2.828$即 $x_1 \approx -4.828, x_2 \approx 0.828$。中点 $m \approx \frac{-4.828 0.828}{2} -2$则 $r_3 -2m 4$还是不对。等等符号错了$g(x) -x^2 - 4x 4$求根公式分母是 $2p -2$分子是 $-q 4$所以 $x \frac{4 \pm \sqrt{16 16}}{-2} \frac{4 \pm \sqrt{32}}{-2} \frac{4 \pm 4\sqrt{2}}{-2} -2 \mp 2\sqrt{2}$没错。但真实中点是 $-1$我们得到 $-2$。问题在于三点拟合虽然精确但区间选得太大包含了拐点但偏离了根的密集区。最终稳健方案我实测有效的只用两个点——拐点 $(0,d)$ 和 $x$ 轴交点的粗略估计。既然我们知道根的和为0可以先猜一个根比如试 $x1$: $f(1) -1$$x2$: $f(2)0$找到了所以 $r_32$则 $r_1 r_2 -2$中点 $m-1$。所以我们直接设二次函数顶点在 $xm-1$即 $g(x) p(x1)^2 k$。又因 $g(0) d 4$所以 $p(1)^2 k 4 \implies p k 4$。再要求 $g(x)$ 在 $x-1$ 处的值等于 $f(-1) -1 6 4 9$所以 $k 9$则 $p -5$。所以 $g(x) -5(x1)^2 9 -5x^2 -10x 4$。求根$x \frac{10 \pm \sqrt{100 80}}{-10} \frac{10 \pm \sqrt{180}}{-10} \frac{10 \pm 6\sqrt{5}}{-10} -1 \mp \frac{3\sqrt{5}}{5} \approx -1 \mp 1.342$即 $x_1 \approx -2.342, x_2 \approx 0.342$中点 $m \approx -1$完美所以最可靠的操作是先用试值法或图像法粗略定位一个实根通常很简单利用根和为0推出中点再以此为顶点构造二次函数。这才是“混合匹配”的实战智慧。3.2 示例二参数可变场景 $f_k(x) x^3 - 3x k$快速响应 $k$ 的变化这个例子凸显方法的工程价值。$k$ 是一个可调参数比如代表系统增益或偏置电压。我们需要知道当 $k$ 从 $0$ 变到 $1$ 时根如何移动。第一步分析 $k$ 对根分布的影响判别式 $\Delta(k) -4(-3)^3 - 27(1)^2k^2 108 - 27k^2$。当 $|k| 2$ 时$\Delta 0$有三实根$|k| 2$ 时有重根$|k| 2$ 时仅一实根。所以我们关注 $k \in (-2, 2)$。拐点始终是 $(0, k)$极值点横坐标始终是 $\pm 1$因为 $\sqrt{-c/(3a)} \sqrt{3/3} 1$纵坐标为 $f_k(1) 1 - 3 k k-2$$f_k(-1) -1 3 k k2$。第二步建立 $k$ 依赖的二次拟合模板我们不再为每个 $k$ 重算而是建立通用公式。设 $g_k(x) p_k x^2 q_k x k$因 $g_k(0) k$。为保持一致性令 $g_k(0) q_k f_k(0) c -3$。所以 $q_k -3$。再选一个与 $k$ 无关的锚点。极值点 $x1$ 的纵坐标是 $k-2$随 $k$ 线性变化是个好选择。所以要求 $g_k(1) p_k(1)^2 - 3(1) k p_k - 3 k k - 2$解得 $p_k 1$。所以万能拟合函数为 $g_k(x) x^2 - 3x k$。第三步对任意 $k$秒算根求 $g_k(x) 0$ 的根$$ x \frac{3 \pm \sqrt{9 - 4k}}{2} $$中点 $m \frac{3}{2} 1.5$因为二次函数顶点横坐标是 $-\frac{q}{2p} \frac{3}{2}$。等等这不对$m$ 应该随 $k$ 变化。错误在于我假设了 $p_k$ 和 $q_k$ 都与 $k$ 无关但中点由 $-\frac{q_k}{2p_k}$ 给出这里恒为 $1.5$而真实中点是变化的。所以这个“万能”模板的中点是固定的只适用于 $k$ 变化不大时。修正让顶点横坐标 $m$ 成为 $k$ 的函数。从 Vieta 定理$r_1 r_2 -r_3$但 $r_3$ 未知。然而我们可以利用一个事实当 $k0$ 时$f_0(x) x^3 - 3x x(x^2 - 3)$根为 $0, \pm\sqrt{3} \approx 0, \pm1.732$。相邻根对是 $(-1.732, 0)$ 和 $(0, 1.732)$中点分别为 $-0.866$ 和 $0.866$。当 $k$ 增加根会平移。经验表明中点 $m$ 近似线性依赖于 $k$$m \approx \alpha k$。试 $k1$: $f_1(x) x^3 - 3x 1$前面算过根约 $-1.879, 0.347, 1.532$相邻对 $(-1.879, 0.347)$ 中点 $m \approx -0.766$。所以从 $k0$ 到 $k1$$m$ 从 $-0.866$ 到 $-0.766$变化 $0.1$。所以 $\alpha \approx 0.1$。因此设 $g_k(x) p(x - 0.1k)^2 q$再用 $g_k(0) k$ 和 $g_k(1) k-2$ 解出 $p, q$。但这已超出“快速响应”范畴。最简实践方案我每天都在用对每个新 $k$只做两件事计算 $f_k(0) k$, $f_k(1) k-2$, $f_k(-1) k2$。若 $k$ 在 $(-2,2)$则 $f_k(1)$ 和 $f_k(-1)$ 异号说明根在 $(-1,1)$ 内。用一次二分法中点 $x0$$f_k(0)k$若 $k0$则根在 $(-1,0)$若 $k0$在 $(0,1)$。一次迭代就缩小区间到一半。取这个新区间的中点 $m_{\text{est}}$设 $g_k(x) p(x - m_{\text{est}})^2 f_k(m_{\text{est}})$再选一个点如 $x0$定 $p$。但更狠的直接用 $g_k(x) a(x - m_{\text{est}})^2 b$并强制它过 $(0,k)$ 和 $(m_{\text{est}}, f_k(m_{\text{est}}))$这总能解出。计算量小于三次方程求根的1%。这个例子教会我理论上的“最优拟合”常被现实中的“够用就好”打败。真正的技巧是在准确性和速度间划一条最经济的线。4. 工具与参数选择深度解析为什么是这些数字背后的数学直觉在实操中你会不断遇到选择题该用哪个点当锚点二次函数的开口该朝上还是朝下顶点该放在哪里这些选择不是拍脑袋背后有扎实的数学直觉和大量试错总结。下面我把这些“为什么”全摊开讲透。4.1 锚点选择拐点是铁律第二个点为何首选“极值点横坐标”而非“函数值”拐点 $(0,d)$ 是必选项这没商量。争议在第二个点。很多人直觉选“函数值已知的点”比如 $f(1)$ 或 $f(2)$。但我的经验是优先选“极值点的横坐标” $x \pm \sqrt{-c/(3a)}$然后计算该点的函数值作为 $y$ 坐标。原因有三稳定性高极值点横坐标只依赖 $a$ 和 $c$与 $d$ 无关。而 $d$ 是最常变动的参数如系统偏置选它相关的点拟合函数会随 $d$ 剧烈震荡。例如在 $f_k(x) x^3 - 3x k$ 中极值点横坐标恒为 $\pm1$无论 $k$ 是多少。几何意义强极值点是三次函数“弯曲最厉害”的地方是凹凸转换的顶峰。用这里的信息去拟合相当于抓住了函数的“骨架强度”比用平缓区间的点如 $x0.5$更能反映整体趋势。计算误差小计算 $f(\sqrt{-c/(3a)})$ 时$x$ 值是精确的无理数但表达式简洁代入后 $x^3$ 和 $x$ 项常能部分抵消减少浮点误差。比如 $f(x) x^3 - 3x k$ 在 $x1$ 时$f(1) 1 - 3 k k-2$干净利落而 $f(0.7)