2015-04-13 33 views
0

您好,我對以下函數的結果有疑問 輸入是x的行向量,我們使用∑_(n=0)^(n=50)▒(x^n)/n!(即從n = 0到n = 50的求和使用輸出計算的exp值x^n)/n!) 循環將終止或者當n達到50或(x^n)/n! < 0.01查找exp

function [summ] = ExpFunction(x) 

//有一個循環迭代。

有兩個版本 1)我們編寫一個if如果看看值(x^n)/n!是否> = 0.01。如果是的話就把它加到summ上。 2)首先將它添加到summ,然後檢查(x^n)/n!是否> = 0.01。如果沒有,則終止該程序。

我的問題是,爲什麼這兩個版本產生不同的結果和第二個版本似乎產生更好的結果(即越接近EXP(X))

謝謝

版本1:

function [result] = Exp(x) 
result = 0; 
a = 0; 
n = 0; 
while(n <= 50) 
{ 
    a = (x.^n)/factorial(n) %% The factorial function is self written have have been checked. 
    if(abs(a) >= 0.01) 
     result = result + a; 
    else 
     break; 
    n = n + 1; 
} 

第二個版本是做result = result + a;在檢查絕對值之前(a)> = 0.01

+0

版本1和2似乎在做不同的事情。版本2增加了一個額外的術語,其中'(x^n)/ n! <0.01「,而版本1沒有。你能再次檢查你的邏輯嗎? –

+0

但版本2可能會添加小於0.01的風險。例如,對於x = 2,在n = 8時小於0.01。使用版本1:我們會避免總結 – Kenlucius

+0

發佈您的所有代碼,謝謝。你的問題是誤導 –

回答

0

這個問題看起來很簡單。該系列正在增加(即,每個加法導致更大的總和)並且正在從下面接近極限值。這意味着添加到總和中的每個新術語都越來越接近最終值=極限。這導致每個添加對結果更好地近似。 同樣清楚的是,第一種方法,不添加該術語,會導致比第二種方法稍微不準確的結果,這會增加該術語。

顯而易見,通過添加更多條款可以提高結果的準確性。唯一的成本是額外的計算時間。您的終止標準(x^n/factorial(n)< 0.01)是否爲x的所有值提供了足夠好的值?我會期望你使用更像(x^n/factorial(n)< g(x))的公式,其中g(x)是一個涉及x的公式。我建議你回到系列文本,並確定是否需要更好的g(x)來滿足精度要求。

+0

歡呼聲。我現在明白了 – Kenlucius