具体情况的提示或指针

时间:2015-03-02 10:08:13

标签: matlab

这里第一次编程。所以我在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

1 个答案:

答案 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