了解非齐次泊松过程的Matlab代码

问题描述:

我发现下面的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

  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)。这是一段不必要的复杂代码。要理解它,只评估方括号和它的内容。它会产生字符串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