2011-02-24 80 views
4

我期待這個表達式整合:如何在MATLAB中正確設置數值積分?

Normal Distribution function:

不過,我似乎有問題,建立功能。作爲this MATLAB的解釋概括,我已經定義了一個名爲「NDfx.m」它看起來像這樣一個單獨的函數:

function [ y ] = NDfx(x) 

    y = (1/sqrt(2*pi))*exp(-.5*x^2); % Error occurs here 

    end 

然而,當我把它稱爲我的主函數中我在註釋行得到一個錯誤之上。我的主要功能如下:

function[P] = NormalDistro(u,o2,x) 

delta = x-u; 
dev = abs((delta)/o2);   % Normalizes the parameters entered into function 
P_inner = quad(@NDfx,-dev,dev); % Integrates function NDfx from -dev to dev (error here) 
P_outer = 1 - P_inner;   % Calculation of outer bounds of the integral 

if delta > 0 
    P = P_inner + (P_outer/2); 

elseif delta < 0 
    P = P_outer/2; 

elseif dev == 0 
    P = .5; 

end 
end 

,我得到特定的錯誤是:在==

錯誤> MPOWER

輸入必須是標量和方陣

+0

或者您可以切換到Mathematica,例如您的答案 - www.wolframalpha.com/input/?i=Integrate[e^(-x^2/2)/Sqrt[2Pi],x] – Margus 2011-02-24 04:38:15

+0

儘管這很棒我正在爲其他人編寫一個函數,以便在MATLAB中使用這個函數... – KronoS 2011-02-24 04:40:49

回答

5

您已經正確設置了一切用於集成。錯誤在於函數本身的定義。當將變量用於將被集成的函數時,「。」 (週期)當它們被施加到可變必須先於運營商如^*

function [y] = NDfx(x) 

    y = (1/sqrt(2*pi))*exp(-.5*(x.^2)); 

end 
+4

這個點是需要的,以便按每個元素完成取冪,而不是嘗試將矩陣提升爲冪運算符'。^'與運算符'^'不同)。這是必要的,因爲數值積分器會將值向量傳遞給'NDfx',並且函數需要分別應用於每個值,並將結果返回到與傳入的值相同形狀的向量中。所謂的* vectorized *函數,並且它比每個需要評估的新值都重新調用函數更有效率。 – user57368 2011-02-24 06:16:15

+0

感謝您的澄清@ user57368 – KronoS 2011-02-24 14:47:54

0

柯諾和user57368是正確的。他們已經正確回答你的實際問題。我的回答只是回答你沒有問的問題。那就是,你爲什麼在這裏使用quad?關鍵是許多人想要整合這種形式的功能,並且已經完成了!使用現有的工具來解決您的問題,因爲這些工具通常是由知道如何準確高效地解決問題的人編寫的。

在這種情況下,現有的工具由函數erf和erfc組成。它們爲您的問題提供準確,高效,矢量化的解決方案。您需要做的唯一事情就是弄清楚如何將這些積分轉換爲您當前的問題,通過簡單地將輸入變換爲erf和輸出來完成。

+1

謹慎展示@woodchips的工作原理? – 2011-02-24 13:56:51

+0

我也想發佈一個問題,解決如何在MATLAB中設置數值積分,因爲這之前沒有正確解決。現在,在MATLAB中設置積分的用戶可以在此處輕鬆找到它。 – KronoS 2011-02-24 14:50:11