2015-03-02 66 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