2016-11-30 132 views
0

我試圖用Matlab來使用最小二乘法來擬合一些數據。while循環,直到符合函數值的某個條件

我找到了最合適的參數,我想確定他們現在的不確定性。爲了確定第一個參數的不確定性,比如a,我們已經看到,當然應該對一個參數應用一個變化,直到函數(在那個變化下評估)減去原始函數值的差值等於1

也就是說,我的Matlab代碼中有一個名爲[bestparam]的矢量,它包含四個參數a,b,c和d。

我也有一個函數定義在另一個文件中,稱爲chi-square,我用最好的參數進行了評估。

我現在想要對參數a應用一個小的變化,並繼續這樣做直到卡方(a +變化) - 卡方= 1。差值必須恰好爲1。我爲此實現了以下代碼:

i = 0; 
a_new = a + i; 
%small variation on the parameter a 
new_param = [a_new b c d]; 
%my new parameters at which I want the function chisquare to be evaluated 
newchisquare = feval(@chisquare, [new_param], X, Y, dY); 
%the function value 
while newchisquare - chisquarevalue ~= 1 
    i = i + 0.0001; 
    a_new = a_new + i; 
    new_param = [a_new b c d]; 
    newchisquare = feval(@chisquare, [new_param], X, Y, dY); 
end 
disp(a_new); 
disp(newchisquare); 

但是當我執行這個循環時,它永遠不會停止運行。當我將條件更改爲< 1,即差值應該大於1時,它會在5秒後停止。但是,這些函數值之間的差異不再只是一個。例如,我的原始函數值是63.5509,而新的函數值是64.6145,它不是剛好大1。

那麼是否有某種方法來實現代碼,並不斷更新參數a,直到差別恰好爲1?幫助表示讚賞。

回答

1

執行數字方法我不會推薦使用像==~=這樣的操作,除非您確定要比較兩個整數。只有您的價值的小偏差可能會導致您的代碼永遠不會停止。如果大致正確,您可以應用一些公差閾值使代碼停止:

TOL = 1e-2; 
while (abs(newchisquare - chisquarevalue) <= 1 - TOL) 
    % your code 
end