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

如何在Matlab中查找多项式重根?及unique函数异常问题求助

解决Matlab中unique对多项式根去重失效的问题

你遇到的其实是浮点数精度导致的重复值误判问题——虽然控制台显示的都是-3.0000,但实际上每次fzero返回的结果可能存在极其微小的差异(比如-3.0000000001-2.9999999998),而unique默认是严格的精确值比较,所以会把这些近似值当成不同元素保留,就出现了重复的-3

下面给你几个可行的解决方案:

方案1:给unique设置容差参数

从Matlab R2015a版本开始,unique支持通过tol参数指定误差容忍范围,把在容差内的数值视为相等。你可以设置一个合理的小容差(比如1e-6):

answerArrayUnique = unique(answerArray, 'tol', 1e-6);

这样所有和-3的差异小于1e-6的数值都会被合并成一个-3,完美解决重复问题。

方案2:先对结果四舍五入再去重

如果你的Matlab版本较旧,不支持tol参数,可以先把结果四舍五入到和控制台显示一致的小数位(比如4位),再调用unique

roundedArray = round(answerArray, 4);
answerArrayUnique = unique(roundedArray);

这样就能把那些有微小差异的-3统一成-3.0000,再去重就不会出现重复了。

额外优化建议:直接用roots求多项式根

其实对于多项式求根,完全不需要用fzero遍历初始值这么麻烦,Matlab自带的roots函数可以直接计算多项式的所有根,结果更精确也不会有重复问题。假设你的多项式是f(x) = x^3 - 7x + 6(对应根-312),你可以直接在Compute.m里写:

% 多项式系数,按x的降幂排列:x³ + 0x² -7x +6
coeffs = [1 0 -7 6];
rootsArray = roots(coeffs);
% 如果只需要实数根,过滤掉虚部(如果有的话)
realRoots = rootsArray(imag(rootsArray) == 0);
% 排序后得到干净的根列表
sortedRealRoots = sort(realRoots);

这种方法比fzero遍历高效得多,也从根源上避免了去重的问题。

内容的提问来源于stack exchange,提问作者obizues

火山引擎 最新活动