2016-02-13 121 views
2

我發現下面的Matlab代碼來模擬一個非齊次泊松過程瞭解非齊次泊松過程的Matlab代碼

function x = nonhomopp(intens,T) 
% example of generating a 
% nonhomogeneousl poisson process on [0,T] with intensity function intens 

x = 0:.1:T; 
m = eval([intens 'x']); 
m2 = max(m); % generate homogeneouos poisson process 
u = rand(1,ceil(1.5*T*m2)); 
y = cumsum(-(1/m2)*log(u)); %points of homogeneous pp 
y = y(y<T); n=length(y); % select those points less than T 
m = eval([intens 'y']); % evaluates intensity function 
y = y(rand(1,n)<m/m2); % filter out some points 
hist(y,10) 

% then run 
% t = 7 + nonhomopp('100-10*',5) 

我是新來的Matlab和無法理解這是如何工作的。我已閱讀所有這些功能的Mathworks公司的網頁,並在四個地方很困惑:

1)爲什麼函數定義爲X然後間隔也被稱爲X?像這是濫用符號嗎?

2)如何在方括號影響EVAL,

eval([intens 'x']) 

,爲什麼X的單引號?

3)爲什麼他們使用cumsum而不是總和

4)給定的強度函數是\lambda (t) = 100 - 10*(t-7) with 7 \leq t \leq 12t = 7 + nonhomopp('100-10*',5)如何表示?

對不起,如果這是這麼多,謝謝!

+0

這是一段非常奇怪的代碼。你有沒有任何輸入,使功能運行沒有錯誤信息? – Daniel

+0

是@Daniel,當我運行它時,我得到一個錯誤,但後來運行't = 7 + nonhomopp('100-10 *',5)'產生一個直方圖 – Sunhwa

回答

2
  1. 功能沒有被定義爲xx僅僅是輸出變量。在Matlab函數中聲明爲function [output variable(s)] = <function name>(input variables)。如果函數只有一個輸出,方括號可以省略(就像你的情況一樣)。無論輸入參數有多少,輸入參數的括號都是強制的。像使用循環和if/else一樣,使用end來結束函數的主體也是一種很好的做法。
  2. eval使用字符串作爲輸入,而方括號正在將字符串'intens'與字符串'x'連接起來。 x在引號中,因爲eval再次以字符串格式輸入,即使它指的是變量。
  3. cumsumsum的行爲不同。 sum返回一個標量,該標量是數組中所有元素的總和,而cumsum返回另一個包含累計和的數組。如果我們的陣列是[1:5],sum([1:5])將返回15,因爲它是1 + 2 + 3 + 4 + 5。相反,cumsum([1:5])將返回[1 3 6 10 15],其中輸出數組的每個元素都是來自輸入數組的以前元素(本身包含的)的總和。
  4. 什麼命令t = 7 + nonhomopp('100-10*',5)返回的是簡單的時間值t而不是lambda的值,的確,通過查看t,最小值是7,最大值是12。泊松分佈本身通過直方圖返回。
+0

謝謝@Alessiox;我想我更瞭解代碼!最後一件事,爲什麼當我嘗試'nonhomopp('10 * -100',5)'這不起作用?那麼,如果我們有一個強度函數如'x^2 + x + 10',那麼如何評估呢? – Sunhwa

+1

你必須小心注意'eval'命令。 'eval'命令將您給第一個輸入的字符串和字符串'x'連接起來。在這種新的情況下,您將「10 * -100x」連接起來,但這是Matlab語法中無效的命令。即使您嘗試以常規方式而不是'eval'運行它,語法也是無效的。 '10 *'沒有任何意義,這個乘法沒有第二個參數。 '100x'也是無效的,因爲在Matlab中你必須在評估乘法運算時明確寫下'*'。 – Alessiox

+1

關於您提出的新強度函數,該表達式並不容易連接並饋送到「eval」。此外,它還取決於您作爲第一個輸入參數提供給您的函數的內容。該輸入必須在'eval'中連接......這是關鍵。對於更復雜的強度函數,我推薦@丹尼爾的答案,用匿名函數。 – Alessiox

2

要回答2)。這是一段不必要的複雜代碼。要理解它,只評估方括號和它的內容。它會產生字符串100-10*x,然後對其進行評估。這裏是一個沒有eval的版本,而是使用匿名函數。這是應該如何實施的。

function x = nonhomopp(intens,T) 
% example of generating a 
% nonhomogeneousl poisson process on [0,T] with intensity function intens 

x = 0:.1:T; 
m = intens(x); 
m2 = max(m); % generate homogeneouos poisson process 
u = rand(1,ceil(1.5*T*m2)); 
y = cumsum(-(1/m2)*log(u)); %points of homogeneous pp 
y = y(y<T); n=length(y); % select those points less than T 
m = intens(y); % evaluates intensity function 
y = y(rand(1,n)<m/m2); % filter out some points 
hist(y,10) 

可以稱之爲這樣

t = 7 + honhomopp(@(x)(100-10*x),5) 
+3

謝謝@Daniel,這是代碼更有意義!我希望我能接受這兩個答案,因爲這同樣有用。「< – Sunhwa