2014-02-19 91 views
1

這是我的數值方法課程。我非常努力地理解MATLAB及其語法,但我是100%自學的,所以如果我的嘗試看起來很荒謬,請耐心等待。製作對矢量輸入敏感的功能

我寫了這個非常簡單的函數逼近查到

function e= calcEulerLimit(n) 
e = (1 + 1./n).^n; 
end 

這是使用限制N於無窮大的方法數e的「基本」的定義。對於MATLAB我定義了以下向量(當我在後面談到N,我總是提及這一載體n

n=[1:1:10]=[ 1 2 3 4 5 6 7 8 9 10 ] 

,輸出的作品如我所料就好了,這是對矢量敏感當我在MATLAB中調用我的函數時輸入n

>> calcEulerlimit(n) 

ans = 

    2.0000 2.2500 2.3704 2.4414 2.4883 2.5216 2.5465 2.5658 2.5812 2.5937 

現在我想要做同樣如上泰勒的方法,使用無限求和公式來描述E,這裏是我卡住了,下面簡單的代碼工作:

function e = calcEulerSum(n) 
e=1;    % base-case, start variable 
for i=1:1:n  % for loop with step size one 
    e=e+1/factorial(i) 
end 
end 

但是當我想輸入一個向量,例如n來計算所有變量時,這個輸入當然不起作用。

我試圖沿線與其他東西循環,while循環,但while循環似乎從未終止:

function e = calcEulerSum3(n) 
while n 
e=1; 
e = e + 1./cumprod(n); 
end 
end 

使用cumprod(n)讓我向量的每一列元素的階乘值n

回答

3

您正在嘗試向量化您的功能。您的標量解決方案的工作,以便讓我們來看看它在做什麼作爲i遞增:

 e0 = 1; 
i = 1: e(1) = e0 + 1/factorial(1) 
i = 2: e(2) = e(1) + 1/factorial(2) = e0 + 1/factorial(1) + 1/factorial(2) 
            = e0 + sum(1./factorial(1:2)) 
i = 3: e(3) = e(2) + 1/factorial(3) = ... 
            = e0 + sum(1./factorial(1:3)) 
    ... 
i = n: e(n) = e(n-1) + 1/factorial(n) = e0 + 1/factorial(1) + ... + 1/factorial(n) 
             = e0 + sum(1./factorial(1:n)) 

所以,你可以拿出的一般表達式計算給出n矢量ecumsum函數將派上用場。

+0

謝謝您的回答,我會閱讀有關cumsum, 到目前爲止,我在 對於i = N,E = 1,E = E + 1./factorial(n); 這對我來說似乎很清楚,但我得到的輸出是2,1.5,1.667,1.0417 所以它看起來像是'工程'除了添加部分。 – Spaced

+0

@Spaced:'n'是一個向量。如果你正在使用'for'循環,你可能需要索引它:'n(i)'。而且你可能還需要將輸出保存在一個向量中:'e(i)'。 – horchler

+0

看到我上面的僞代碼示例。輸出'e'將成爲一個向量,對吧?你能計算'e'的第一個元素嗎?給出第一個元素,你現在可以計算第二個元素('i = 2')嗎?依此類推...您可以在'for'循環中執行此操作,然後您可以使用'cumsum'在一行代碼中看到它是如何實現的。 – horchler

1

for i=whatsoever,statement(i);endwhatsoever的每個元素執行語句。如果它是一個單一的數字,那麼在這個數字上,如果它是一個矢量/數組,那麼在它的每個元素上。

1:1:n創建整數從1數組n當場(1:n會做,太)。如果n已經是具有要迭代的元素的向量,則可以直接使用它:for i=n

但是,爲什麼在第一個和第三個代碼塊中使用虛線版本的操作,而不是第二個?因爲你讀過關於MATLAB的矢量化?那麼你似乎在正確的軌道上,但請記住,點矢量化是完全擺脫顯式循環。

+0

非常感謝您的解釋@ arne.b 我正在閱讀Matlab的每一個手冊,我都可以在網上找到它,在第二個例子中,我除以階乘(i),它總是一個數字。 然而,在第三個例子中,我將通過向量進行分割,並且我已經讀過,在這種情況下,我將不得不使用./來指定一個元素分割。輸出確實有效,但它不正確。我會試着更好地理解它。 – Spaced

+0

@horchler如何「減少顯式循環的數量」?至少,如果之前有'for'循環,而'while循環之後做同樣的循環,則沒有向量化。 :-) –

+0

@ arne.b:你編輯的版本要好得多(更精確/謹慎)。我已經投票贊成你對「for」循環如何處理向量的解釋。 – horchler

-1
function e = calcEulerSum(n) 
e=nan(1,length(n));    % initialize to nan 
for j=1:length(n)    % for each element in the input 
    e(j)=sum(1./factorial(0:n(j))); %each entry is computed in this step, one at a time 
end 

在這段代碼中,每個近似都是矢量化的,但我沒有看到一個簡單的矢量化整個程序的方法。也沒有錯誤檢查,例如確保n的元素是非負整數,或者n是一個向量而不是數組。

在原始示例中,while永不終止,因爲n永不改變。

這應該足以幫助您開始。

乾杯!