2015-03-02 44 views
1

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

看看'eps'函数(http://se.mathworks.com/help/matlab/ref/eps.html)。如果你让这个“足够接近”的参数取决于你想比较的两个值的“eps”,那么你可能可以解决你的问题。 – 2015-03-02 10:19:08

+0

你可以发布一个最小的代码示例吗?你如何准确地做有条件的if语句?你如何检测并显示根数? – JaBe 2015-03-02 10:20:37

+0

Hi JaBe。我添加了我在函数结尾使用的代码。为了统计根数,我只需要这些根数就可以显示出来。我至少需要1e-6的准确性,所以我选择1e-7作为足够接近的条件。 – william 2015-03-02 10:28:29

回答

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 
相关问题