如何在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(对应根-3、1、2),你可以直接在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




