7.6求根问题的敏感性与多项式的零点
求根问题的敏感性与多项式的零点 深度讲解与推导证明
各位同学,今天我们来学习数值分析中决定求根结果可靠性的核心问题——求根的敏感性与病态代数方程。我们之前学习的牛顿法、弦截法等迭代算法,解决的是「如何快速收敛到根」的问题;而今天的内容,解决的是「这个根求得到底准不准、方程本身能不能可靠求根」的本质问题。哪怕迭代算法再完美,若方程本身是病态的,我们也可能得到完全失真的结果。
一、求根问题敏感性的本质:正问题与反问题的病态性
1.1 函数求值(正问题)的误差传递
我们先从最基础的微分误差分析入手,明确「正问题」的误差规律。
对于可微函数 \(y=f(x)\),正问题是:给定自变量 \(x\),求函数值 \(y=f(x)\)。
若自变量 \(x\) 存在微小误差 \(\Delta x\),则函数值的误差 \(\Delta y = f(x+\Delta x) - f(x)\),由微分的定义,当 \(|\Delta x|\) 充分小时,有一阶近似:
两边取绝对值,得到误差放大倍数:
这个式子的意义是:函数求值的误差放大倍数,等于函数在该点导数的绝对值。\(|f'(x)|\) 越大,自变量的微小误差会被放大为函数值的巨大误差;反之则误差被抑制。
1.2 方程求根(反问题)的误差传递与敏感性
方程求根是典型的反问题:我们的目标是找到 \(x^*\) 使得 \(f(x^*)=0\)(即给定目标函数值 \(y=0\),反求自变量 \(x\))。
假设我们通过数值方法得到了近似根 \(\bar{x}\),对应的函数值误差为:
(因为真实根满足 \(f(x^*)=0\))
我们关心的是解的误差 \(\Delta x = |\bar{x} - x^*|\),将正问题的误差关系反过来,即可得到反问题的误差放大规律:
若我们的数值计算满足函数值的精度要求 \(|f(\bar{x})| \leq \varepsilon\)(\(\varepsilon\) 为允许的函数值误差),则解的误差上限为:
这就是求根问题敏感性的核心公式,我们可以得到两个关键结论:
- 求根问题的误差放大倍数,与函数求值的误差放大倍数互为倒数,二者的病态性完全相反;
- 当 \(|f'(x^*)|\) 非常小时(曲线在根附近几乎与x轴平行),哪怕函数值的误差 \(\varepsilon\) 极小,解的误差 \(|\Delta x|\) 也会被放大到非常大的数值,此时求根问题是敏感(病态)的;
- 当 \(|f'(x^*)|\) 较大时(曲线在根附近陡峭),函数值的误差不会被过度放大,求根问题是不敏感(良态)的。
1.3 良态与病态求根问题的几何意义
结合图7-8,我们可以直观理解二者的区别:
- 良态求根(图a):曲线 \(y=f(x)\) 在根 \(x^*\) 附近陡峭,\(|f'(x^*)|\) 大。哪怕函数值有微小波动,曲线与x轴交点的偏移量也极小,解的误差可控。
- 病态求根(图b):曲线 \(y=f(x)\) 在根 \(x^*\) 附近极度平缓,几乎与x轴重合,\(|f'(x^*)|\) 趋近于0。函数值的微小波动,会导致曲线与x轴交点的巨大偏移,解的误差完全不可控。
二、多项式方程的根对系数扰动的敏感性分析
工程中最常见的非线性求根问题,就是n次代数多项式方程的求根,我们接下来专门分析多项式的根对系数扰动的敏感性,推导核心的灵敏度公式。
2.1 基础定义与扰动模型
首先定义n次标准多项式:
设该多项式的n个根为 \(x_1, x_2, \dots, x_n\),满足 \(p(x_k)=0, \ k=1,2,\dots,n\)。
在实际计算中,多项式的系数往往存在微小误差(如测量误差、浮点舍入误差),我们用扰动模型描述这种情况:
其中:
- \(\varepsilon\) 是一个绝对值极小的扰动参数;
- \(q(x)\) 是次数不超过n的非零多项式,描述扰动的形式(例如给某一项系数加扰动,对应 \(q(x)\) 为对应次数的单项式);
- \(p_\varepsilon(x)\) 的根记为 \(x_1(\varepsilon), x_2(\varepsilon), \dots, x_n(\varepsilon)\),显然当 \(\varepsilon=0\) 时,\(x_k(0)=x_k\),即原多项式的根。
我们的核心目标是:分析当 \(\varepsilon\) 极小时,根的变化量 \(|x_k(\varepsilon)-x_k|\) 有多大,也就是根对系数扰动的灵敏度。
2.2 根的灵敏度公式的严格推导
由于 \(p_\varepsilon(x_k(\varepsilon))=0\) 对任意充分小的 \(\varepsilon\) 成立,因此等式两边可以对 \(\varepsilon\) 求全导数,利用链式法则和乘积求导法则推导灵敏度。
步骤1:对扰动方程两边求全导数
步骤2:分别求导展开
- 第一项 \(\frac{d}{d\varepsilon}p(x(\varepsilon))\):由链式法则,先对 \(x\) 求导,再对 \(\varepsilon\) 求导,得:\[\frac{d}{d\varepsilon}p(x(\varepsilon)) = p'(x(\varepsilon)) \cdot \frac{dx}{d\varepsilon} \]
- 第二项 \(\frac{d}{d\varepsilon}\left[\varepsilon q(x(\varepsilon))\right]\):由乘积求导法则 + 链式法则,得:\[\frac{d}{d\varepsilon}\left[\varepsilon q(x(\varepsilon))\right] = q(x(\varepsilon)) + \varepsilon \cdot q'(x(\varepsilon)) \cdot \frac{dx}{d\varepsilon} \]
步骤3:整理方程,解出 \(\frac{dx}{d\varepsilon}\)
将两项代入求导后的等式,合并含 \(\frac{dx}{d\varepsilon}\) 的项:
最终得到导数的通用表达式:
步骤4:代入 \(\varepsilon=0\),得到根的灵敏度
当 \(\varepsilon=0\) 时,\(x=x_k(0)=x_k\),代入上式,得到根对扰动的灵敏度公式:
这个导数的绝对值,直接描述了根对系数扰动的敏感程度:绝对值越大,\(\varepsilon\) 的微小变化会引起根的巨大偏移,方程越病态。
2.3 根的一阶扰动近似公式
当 \(|\varepsilon|\) 充分小时,我们将 \(x_k(\varepsilon)\) 在 \(\varepsilon=0\) 处做一阶泰勒展开,忽略高阶无穷小项,得到根的扰动近似公式:
将灵敏度公式代入,得到教材中的核心公式(7.29):
2.4 病态代数方程的定义
对于多项式方程(7.27),若系数的微小扰动 \(\varepsilon\),会导致根的变化量 \(|x_k(\varepsilon)-x_k|\) 非常大,我们就称这个代数方程是病态的;反之则为良态的。
三、经典例题解析:Wilkinson多项式的病态性分析
例7.11是数值分析史上最经典的病态方程案例——Wilkinson多项式,由英国数值分析大师James Wilkinson提出,用来揭示高次多项式求根的极端病态性。
3.1 例题背景与扰动设置
原多项式为7次Wilkinson多项式:
该多项式的根为 \(x_k=k, \ k=1,2,\dots,7\),都是分离的整数实根,看起来形式极其简单。
我们给多项式的 \(x^6\) 项系数施加一个极小的扰动:取 \(q(x)=x^6\),\(\varepsilon=-0.002\),即扰动后的多项式为:
这个扰动仅为原 \(x^6\) 项系数(-28)的 \(0.007\%\),几乎可以忽略不计,我们来分析根的变化。
3.2 灵敏度计算与扰动根的近似
步骤1:计算 \(p'(x_k)\)
对于多项式 \(p(x)=\prod_{j=1}^7 (x-j)\),由乘积求导法则,导数为:
代入 \(x=k\)(原根),除了 \(i=k\) 的项,其余项都包含 \((x-k)\) 因子,代入后为0,因此:
将乘积拆分为两部分化简:
- 前半部分:\(j=1\) 到 \(k-1\),\(k-j = 1,2,\dots,k-1\),乘积为 \((k-1)!\)
- 后半部分:\(j=k+1\) 到 \(7\),\(k-j = -1,-2,\dots,-(7-k)\),乘积为 \((-1)^{7-k} \cdot (7-k)!\)
因此最终化简为:
步骤2:代入扰动近似公式
已知 \(q(x)=x^6\),因此 \(q(k)=k^6\),\(\varepsilon=-0.002\),代入公式(7.29):
化简符号后得到教材中的近似式:
3.3 结果分析与病态性判定
我们直接给出扰动后方程的真实根:
我们可以得到三个颠覆性的结论:
- 极小的系数扰动,导致根出现了巨大偏移:比如原根5,扰动后变成了一对共轭复根,实部偏移量超过0.45,虚部绝对值超过0.54;
- 原本全部为实根的多项式,在微小扰动后出现了复根,根的性质都发生了改变;
- 哪怕是根分离、形式简单的低次(7次)多项式,也可能存在极端病态性。
因此,这个Wilkinson多项式方程是严重病态的。
四、影响多项式求根病态性的核心因素
结合理论推导与例题,我们总结出决定多项式病态性的4个核心因素:
- 根的密集程度:根之间的距离越小、分布越密集,多项式在根附近的导数 \(|p'(x_k)|\) 越小,病态性越严重;
- 多项式的次数:多项式的次数越高,病态性越容易出现,高次多项式的求根结果往往可靠性极低;
- 根的模长大小:模长大的根,对高次项系数的扰动更敏感;模长小的根,对低次项系数的扰动更敏感;
- 系数的量级差异:多项式各项系数的量级差距越大,舍入误差带来的扰动影响越明显,病态性越严重。
五、核心知识点归纳总结表
| 核心概念 | 定义与公式 | 核心意义 | 关键判断标准 |
|---|---|---|---|
| 求根问题的敏感性 | 解的误差上限:$ | \Delta x | \leq \frac{\varepsilon}{ |
| 根的灵敏度公式 | \(\frac{dx_k(0)}{d\varepsilon} = \frac{-q(x_k)}{p'(x_k)}\) | 描述多项式的根对系数微小扰动的敏感程度 | 导数绝对值越大,根对扰动越敏感,方程越病态 |
| 根的一阶扰动近似 | \(x_k(\varepsilon) \approx x_k - \frac{q(x_k)}{p'(x_k)} \cdot \varepsilon\) | 量化系数微小扰动后,根的偏移量的近似值 | 偏移量 $ |
| 良态求根问题 | 系数/函数值的微小扰动,仅导致根/解的微小偏移 | 数值求根结果可靠,迭代算法的精度可以得到保证 | 1. 根附近 $ |
| 病态代数方程 | 系数的微小扰动,导致根的巨大偏移,甚至根的性质发生改变 | 数值求根结果不可靠,哪怕迭代算法收敛,结果也可能完全失真 | 1. 根附近 $ |
| 正问题与反问题的病态性关系 | 函数求值(正问题)误差放大倍数:$ | f'(x^*) | \(;求根(反问题)误差放大倍数:\)\frac{1}{ |
多项式的零点(全部根求解)深度讲解与方法推导
各位同学,上一节课我们讲解了多项式求根的病态性,明确了「方程本身是否能可靠求根」的核心问题;今天我们来解决工程中最核心的需求——如何求解n次多项式的全部零点(全部根,含实根与复根)。
根据代数基本定理,在复数域内,n次多项式
有且仅有n个根(重根按重数计)。为了简化计算,我们通常将多项式首一化,两边除以首项系数\(a_0\),得到首一多项式的标准形式:
我们所有的求解方法,都围绕这个首一多项式展开。
一、核心方法1:牛顿法结合多项式降阶法
这是求解多项式单根、逐步获取全部根的基础方法,核心思想是「求一个根,降一次阶,反复迭代直到求出全部根」。
1.1 基础工具:秦九韶算法(霍纳算法)
牛顿法每步迭代都需要计算\(p(x_k)\)和\(p'(x_k)\),对于高次多项式,直接展开计算的时间复杂度极高,而秦九韶算法可以将n次多项式求值的计算量降到O(n),是多项式计算的核心工具。
1.1.1 多项式求值的秦九韶算法
对于n次多项式\(p(x) = a_0x^n + a_1x^{n-1} + \dots + a_{n-1}x + a_n\),我们将其改写为嵌套乘法形式:
定义递推序列:
则最终\(b_n = p(x)\),这就是秦九韶算法的核心,仅需n次乘法和n次加法即可完成多项式求值。
1.1.2 多项式导数的秦九韶算法
对上述递推式求导,我们可以同步计算\(p'(x)\)。对\(p(x)\)求导得:
我们可以在求值的递推过程中,同步计算导数的递推序列:
则最终\(c_{n-1} = p'(x)\)。
这意味着,我们可以用秦九韶算法,在一次嵌套计算中,同时得到\(p(x_k)\)和\(p'(x_k)\),完美适配牛顿法的迭代需求,计算效率极高。
1.2 牛顿法求多项式单根
针对多项式\(p(x)\),牛顿法的迭代公式为:
迭代终止条件为\(|x_1^{(k+1)} - x_1^{(k)}| \leq \varepsilon\)(\(\varepsilon\)为预设的允许误差),此时得到第一个根的近似值\(x_1 \approx x_1^{(k+1)}\)。
1.3 多项式降阶与全部根求解
根据多项式因式分解定理,若\(x_1\)是\(p(x)=0\)的根,则\(p(x)\)可以分解为:
其中\(q_1(x)\)是n-1次多项式,称为\(p(x)\)的商多项式。我们可以通过多项式带余除法(同样用秦九韶算法实现)求出\(q_1(x)\)的全部系数。
接下来,我们对\(q_1(x)\)重复上述过程:用牛顿法求\(q_1(x)=0\)的一个根\(x_2\),再分解为\(q_1(x)=(x-x_2)q_2(x)\),\(q_2(x)\)是n-2次多项式。
以此类推,直到\(q_{n-2}(x)\)为二次多项式,直接用求根公式求出最后两个根,即可得到原多项式的全部n个根。
1.4 误差累积问题与修正方案
问题本质
在反复降阶的过程中,前一个根的求解误差会传递到商多项式中,随着降阶次数增加,误差会不断累积,导致后续根的精度严重下降,甚至完全失真。
修正方案
每求出一个根\(x_i\)后,不直接用降阶后的商多项式迭代下一个根,而是将\(x_i\)作为初值,代入原多项式\(p(x)\) 用牛顿法做1-2次迭代修正,得到精度更高的根,再用修正后的根做多项式降阶。这样可以极大抑制误差的累积,保证所有根的求解精度。
1.5 复根的共轭成对处理
对于实系数多项式,复根一定是共轭成对出现的:若\(x_1 = a + ib\)是\(p(x)=0\)的根,则其共轭\(\overline{x_1} = a - ib\)也一定是根。
此时,我们可以直接构造二次实系数因子:
将原多项式除以这个二次因子,直接得到n-2次的商多项式,一次降阶2次,避免了两次单根降阶的误差累积,同时无需处理复数运算的商多项式。
二、核心方法2:抛物线法(密勒法)求多项式全部零点
抛物线法是求解多项式全部零点的更优方法,尤其适合求解复根,也是工程中常用的方法。
2.1 抛物线法的核心优势
对比牛顿法,抛物线法有三个不可替代的优势:
- 无需计算导数:仅需多项式的函数值,避免了导数计算的开销和误差;
- 天然支持复根求解:即使初始值全为实数,迭代过程也能自动得到复根,无需设置复初值;
- 收敛阶更高:收敛阶约1.84,接近牛顿法的二阶收敛,收敛速度极快;
- 适配二次降阶:求出一个复根后,利用共轭成对特性,直接构造二次因子降阶2次,效率远高于牛顿法的单次降阶。
2.2 抛物线法的迭代流程(针对多项式)
- 选取三个初始值\(x_0, x_1, x_2\),计算对应的多项式值\(p(x_0), p(x_1), p(x_2)\);
- 计算一阶差商\(f[x_1,x_0], f[x_2,x_1]\)和二阶差商\(f[x_2,x_1,x_0]\);
- 计算\(\omega = f[x_2,x_1] + f[x_2,x_1,x_0](x_2 - x_1)\);
- 代入迭代公式,选取使分母模最大的符号,计算\(x_3\):\[x_3 = x_2 - \frac{2p(x_2)}{\omega \pm \sqrt{\omega^2 - 4p(x_2)f[x_2,x_1,x_0]}} \]
- 迭代直到\(|p(x_k)| < \varepsilon\),得到根\(x^*\);
- 若\(x^*\)为复根,利用共轭特性构造二次因子,将多项式降阶2次;若为实根,可直接降阶1次,或再求一个实根降阶2次;
- 对降阶后的多项式重复上述过程,直到求出全部根。
三、核心方法3:友矩阵特征值法
这是现代数值计算软件(MATLAB、Python numpy)中求解多项式根的主流工业级方法,核心思想是将多项式求根问题,转化为矩阵特征值求解问题,彻底避免了迭代法的初值选择、误差累积、收敛性等问题。
3.1 友矩阵的构造
对于首一多项式(7.30):
我们构造其友矩阵(伴随矩阵):
这是一个n阶方阵,第一行为多项式系数的相反数,次对角线全为1,其余元素为0。
3.2 核心定理:友矩阵的特征值就是多项式的根
我们可以严格证明,友矩阵\(P\)的特征多项式,就是原多项式(7.30):
因此,友矩阵\(P\)的全部特征值,就是原多项式的全部n个根。
3.3 方法优势
- 无初值依赖:无需选择迭代初值,彻底避免了初值选择不当导致的发散问题;
- 数值稳定性极高:矩阵特征值求解有成熟的QR算法,数值稳定性远高于迭代降阶法,尤其适合高次、病态多项式的求根;
- 一次性求出全部根:无需逐次降阶,一次特征值分解即可得到全部实根和复根,效率极高;
- 适配工业级软件:所有主流数值计算软件的多项式求根函数,底层均采用友矩阵+QR算法实现,可靠性经过了几十年的工程验证。
四、例题解析(例7.12):求4次多项式的全部零点
例题题干
求多项式\(p(x)=16x^4 -40x^3 +5x^2 +20x +6\)的全部零点。
解题步骤详解
步骤1:方法选择与初始值设置
我们采用抛物线法求解,因为多项式是4次的,可能存在复根,抛物线法天然适配复根求解。选取初始值\(x_0=0.5, x_1=-0.5, x_2=0\),迭代终止条件为\(|p(x_i)| < 10^{-5}\)。
步骤2:抛物线法迭代求解复根
我们按照抛物线法的迭代公式,逐步计算,迭代结果如下表:
| 迭代步数\(i\) | 迭代值\(x_i\) | 多项式值\(p(x_i)\) |
|---|---|---|
| 3 | \(-0.555556+0.598352i\) | \(-29.4007-3.89872i\) |
| 4 | \(-0.435450+0.102101i\) | \(1.33222-1.19310i\) |
| 5 | \(-0.390631+0.141852i\) | \(-0.375058-0.670168i\) |
| 6 | \(-0.357698+0.169926i\) | \(-0.146750-0.00744623i\) |
| 7 | \(-0.356051+0.162856i\) | \(-0.184022\times10^{-2}+0.538456\times10^{-3}i\) |
| 8 | \(-0.356062+0.162758i\) | \(0.164836\times10^{-5}+0.892713\times10^{-6}i\) |
迭代8步后,\(|p(x_i)| < 10^{-5}\),满足精度要求,得到第一个复根:
步骤3:利用共轭特性得到第二个复根
实系数多项式的复根共轭成对,因此第二个复根为:
步骤4:构造二次因子,多项式降阶
由两个共轭复根,构造二次实因子:
原多项式首项系数为16,因此分解为:
得到降阶后的二次多项式:\(q(x)=x^2 - 3.212124x + 2.446658\)。
步骤5:求解二次方程的两个实根
对二次方程\(x^2 - 3.212124x + 2.446658=0\),用求根公式得:
计算得:
步骤6:牛顿法修正根的精度
将\(x_3, x_4\)作为初值,代入原多项式\(p(x)\)用牛顿法迭代1次,得到更高精度的根:
最终结果
原多项式的全部零点为:
- 一对共轭复根:\(-0.356062 \pm 0.162758i\)
- 两个实根:\(1.24167744\)、\(1.97044608\)
五、多项式全部零点求解方法归纳总结表
| 方法名称 | 核心原理 | 收敛阶/求解特性 | 核心优点 | 核心缺点 | 适用场景 |
|---|---|---|---|---|---|
| 牛顿法+逐次降阶法 | 牛顿法求单根,多项式因式分解逐次降阶,直到求出全部根 | 单根二阶收敛,逐次降阶 | 公式简单,收敛速度快,秦九韶算法计算效率高 | 1. 需要计算导数;2. 逐次降阶存在误差累积;3. 求复根需要复初值;4. 对初值敏感,可能发散 | 低次多项式、导数易计算、仅需求实根的场景 |
| 抛物线法(密勒法)+二次降阶法 | 三点二次插值构造抛物线,求抛物线与x轴交点作为根,共轭复根二次降阶 | 超线性收敛(≈1.84),一次可降2阶 | 1. 无需计算导数;2. 天然支持复根求解,无需复初值;3. 收敛速度接近牛顿法;4. 二次降阶减少误差累积 | 公式较复杂,需要三个初始值,计算量略高于牛顿法 | 中低次多项式、存在复根、导数难以计算的场景,工程中最常用的通用方法 |
| 友矩阵特征值法 | 构造多项式的友矩阵,求解矩阵的全部特征值,即为多项式的全部根 | 一次性求出全部根,无迭代收敛问题 | 1. 无初值依赖,彻底避免发散问题;2. 数值稳定性极高,适配病态多项式;3. 一次性得到全部实根和复根;4. 工业级算法,可靠性强 | 需要掌握矩阵特征值求解算法,手动计算困难,依赖数值计算工具 | 高次多项式、病态多项式、需要一次性求出全部根的工程场景,是MATLAB、Python等软件的底层实现方法 |
补充关键注意事项
- 对于高次多项式,优先选择友矩阵特征值法,避免迭代法的初值选择和误差累积问题;
- 实系数多项式求根时,利用复根共轭成对的特性,优先采用二次降阶,减少迭代次数和误差累积;
- 无论采用哪种方法,求出根后,都建议代入原多项式验证\(|p(x^*)|\)的大小,确认根的精度;
- 对于病态多项式,需采用双精度浮点计算,避免舍入误差被放大,导致根完全失真。
posted on 2026-02-28 08:26 Indian_Mysore 阅读(0) 评论(0) 收藏 举报
浙公网安备 33010602011771号