You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MATLAB中二次多项式极值点超出区间[x0,x2]的原因探究及精度疑问

为何二次多项式极值点超出区间?数值精度是元凶吗?

先拆解你的问题:你用三个点构造二次多项式,按公式计算的极值点却跑出了区间,核心疑问是数值精度是否背锅——答案是没错,就是数值精度的锅,但本质是你选的前两个点太“近”了,触发了数值计算的病态性

问题根源拆解

  1. 前两个点的间距极小,函数值被浮点数“抹平”
    你给出的x0和x1差值约为$1.297×10{-9}$,这已经远小于双精度浮点数的有效分辨范围(双精度约有15-17位有效数字)。计算$f(x)=\ln(x)\sin(x2)$时,x的微小变化带来的函数值差异,小到双精度浮点数无法区分,所以f0和f1被舍入成了完全相同的值:0.32047580694770583

  2. 公式计算遭遇“病态条件”,有效数字丢失
    理论上,当f0=f1时,我们可以把极值点公式简化:
    $$x_3 = \frac{x_0 + x_1}{2}$$
    这个值应该在[x0,x1]区间内,自然也属于[x0,x2]。但实际计算中,因为f0和f1并非真的完全相等(只是浮点数无法表示出差异),再加上x0-x1是极小值,计算分母和分子时,微小误差被放大,最终导致结果偏离理论值,甚至超出区间。

    举个直观的例子:当你用两个几乎重合的点去拟合抛物线,相当于给算法一个“模糊”的输入,它无法准确判断抛物线的开口方向和顶点位置,微小的数值误差就会被无限放大,最终给出离谱的结果。

验证与解决思路

  • 用更高精度验证:如果在MATLAB中改用符号计算(比如vpa保留30位有效数字),计算f0和f1的真实差异,再代入公式,就能得到接近$\frac{x0+x1}{2}$的正确结果。
  • 调整采样点:把x0和x1的间距拉大,让函数值的差异足够被浮点数分辨,这样计算出来的极值点就会落在区间内。

内容的提问来源于stack exchange,提问作者Ongky Denny Wijaya

火山引擎 最新活动