2014-06-10 52 views
0

我想用Newton-Raphson迭代方法求解一個非線性方程組,並且爲了探索我的變量的參數空間,將以前的解決方案和使用它們作爲我的第一次初步猜測,以便我留在景點盆地。邏輯索引和雙精度數字

我現在救我在一個結構陣列的解決方案,我存儲在一個文件.MAT,約在這樣:

load('solutions.mat','sol'); 
str = struct('a',Param1,'b',Param2,'solution',SolutionVector); 
sol=[sol;str]; 
save('solutions.mat','sol'); 

現在,我做的另一個運行,在我需要爲不同的上述方案參數NewParam1和NewParam2。如果參數1 = NewParam1-deltaParam1和參數2 = NewParam2 - deltaParam2,然後

load('solutions.mat','sol'); 
index = [sol.a]== NewParam1 - deltaParam1 & [sol.b]== NewParam2 - deltaParam2; 
% logical index to find solution from first block 
SolutionVector = sol(index).solution; 

我有時會收到一條錯誤消息說,沒有這樣的解決方案存在。問題在於我的參數的雙精度,因爲2-1〜= 1可能發生在Matlab中,但我似乎無法找到實現相同結果的替代方法。我曾嘗試在保存過程中將數字參數更改爲字符串,但後來我遇到了使用字符串進行邏輯索引的問題。

理想情況下,我想避免將我的參數乘以10的冪使它們成爲整數,因爲這會使代碼由於參數的數量而變得非常混亂。除此之外,任何幫助將不勝感激。謝謝!

+1

而不是使用'==',爲什麼不保留一些小的餘量。說1e-10(或'eps') –

回答

1

比較MATLAB中的雙精度數字時,千萬不要使用==。原因是,正如你在這個問題中說的那樣,一些數字不能用二進制數字精確表示,就像1/3不能用十進制數字精確寫出一樣。

你應該做的是這樣的:

index = abs([sol.a] - (NewParam1 - deltaParam1)) < 1e-10 & ... 
     abs([sol.b] - (NewParam2 - deltaParam2)) < 1e-10; 

其實,我建議不要使用eps,因爲它是如此之小,它實際上可能在某些情況下會失敗。如果您需要非常高的準確度(但我們多少次使用小於1e-10的數字),則可以使用比1e-10更小的數字?