2014-06-19 44 views
0

我試圖計算錯誤如何取決於梯形法則的步驟h。這個誤差應該隨着h值變小而變小,但對我來說這不會發生。這是我的代碼:在MATLAB中計算梯形法則的錯誤

Iref的計算和驗證與辛普森的方法和MATLAB功能四的參考值,分別

for h = 0.01:0.1:1 
    x = a:h:b; 
    v = y(x); 
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h; 
    Error = abs(Itrap-Iref) 
end 

我覺得有什麼毛病我使用小時的方式,因爲梯形法則適用於已知積分。如果有人能夠幫助我,我會非常高興,因爲我不明白爲什麼錯誤會「跳躍」。

回答

0

事實上,絕對誤差並不總是越小,你的積分步驟就越小; here's why

0

我不知道這個問題的可能的是,不是所有的時間間隔 - 每個步長h - 具有相同的ab只是因爲x的構造方式。試着用另外的fprintf聲明如下:

for h = 0.01:0.1:1 
    x = a:h:b; 
    fprintf('a=%f b=%f\n',x(1),x(end)); 
    v = y(x); 
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h; 
    Error = abs(Itrap-Iref); 
end 

根據您的ab(我選擇a=0b=5)所有a值是相同的(如預期),但b變化從4.55至5.0。

我認爲您總是希望保持區間[a,b]對於您選擇的每個步長都相同,以便更好地比較每次迭代。因此,不是遍歷步長,而是反覆遍歷[a,b]內的等間隔子區間數n

不是

for h = 0.01:0.1:1 
    x = a:h:b;  

你可以做更多的東西一樣

% iterate over each value of n, chosen so that the step size 
% is similar to what you had before 
for n = [501 46 24 17 13 10 9 8 7 6] 

    % create an equally spaced vector of n numbers between a and b 
    x = linspace(a,b,n); 

    % get the step delta 
    h = x(2)-x(1); 

    v = y(x); 
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h; 
    Error = abs(Itrap-Iref); 

    fprintf('a=%f b=%f len=%d h=%f Error=%f\n',x(1),x(end),length(x),h,Error); 
end 

當你評估上面的代碼,你會發現,ab是每個迭代一致,h大致是什麼你之前選擇了,隨着步長的增加Error確實增加。

嘗試以上,看看會發生什麼!