这里第一次编程。所以我在matlab中编写了这个函数,用迭代过程找到三次多项式的根。该函数必须得到正确的根数,所以最后,我使用if语句去掉一个根,如果它与我发现的任何其他根足够接近,因为它可能是一个重复的根。然而,正如我刚才发现的那样,问题在于,如果多项式的系数非常小,则根将全部超级接近0.我的代码将输出只有一个根0,当真的它应显示3个解决方案为0.
我觉得这是一个相当困难的困境,因为迭代过程永远不会为双根获得两次精确数字,所以不仅仅是比较数字是否完全相同。可能他们实际上是两个不同的根,彼此非常接近。有什么建议吗?
编辑:这是我写的代码,让它不显示两次双根,但我已经意识到这可能有可能摆脱实际根源。
rts = [root1, root2, root3];
if abs(root1 - root2) < 1*10^(-7)
rts = [root1, root3];
end
if abs(root1 - root3) < 1*10^(-7)
rts = [root1, root2];
end
if abs(root2 - root3) < 1*10^(-7)
rts = [root1, root2];
end
if abs(root1 - root2) < 1*10^(-7) && abs(root1 - root3) < 1*10^(-7)
rts = root1;
end
答案 0 :(得分:0)
假设你在rts
数组中的根是单调递增的。您的代码的问题是您覆盖rts
数组,具体取决于哪些条件为真。对不等根different_rts
使用新变量。
如果下一个根与最后存储的根的差异大于阈值,则将其添加到数组中。
rts = [ 0 1e-8 0.1 ]
nDifferent = 1; % number of different roots
different_rts = rts(1) % initialize with first value
for ri=2:numel(rts)
if( abs(different_rts(nDifferent)-rts(ri))>1e-7 ) % if difference is greater add next root
nDifferent = nDifferent + 1;
different_rts(nDifferent) = rts(ri);
end
end