【问题标题】:Understanding Non-homogeneous Poisson Process Matlab code理解非齐次泊松过程 Matlab 代码
【发布时间】:2016-03-14 16:29:14
【问题描述】:

我找到了以下 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 而不是 sum

4) 给定的强度函数是\lambda (t) = 100 - 10*(t-7) with 7 \leq t \leq 12t = 7 + nonhomopp('100-10*',5)如何表示这个?

对不起,如果这么多,谢谢!

【问题讨论】:

  • 那是一段非常奇怪的代码。您是否有任何输入可以使函数在没有错误消息的情况下运行?
  • 是的@Daniel,当我运行它时出现错误,但随后运行t = 7 + nonhomopp('100-10*',5) 会生成一个直方图

标签: matlab poisson


【解决方案1】:

回答 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)

【讨论】:

  • 谢谢@Daniel,这样的代码更有意义!我希望我能接受这两个答案,因为这同样有帮助>.
【解决方案2】:
  1. 函数未定义为xx 只是输出变量。在 Matlab 中,函数被声明为function [output variable(s)] = &lt;function name&gt;(input variables)。如果该函数只有一个输出,则可以省略方括号(就像您的情况一样)。相反,输入参数周围的括号是强制性的,无论有多少输入参数。使用 end 结束函数体也是一种很好的做法,就像使用循环和 if/else 一样。
  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。泊松分布本身是通过直方图返回。

【讨论】:

  • 谢谢@Alessiox;我想我更好地理解代码!最后一件事,为什么当我尝试nonhomopp('10*-100',5) 这不起作用?那么如果我们有一个像x^2+x+10 这样的强度函数,会如何评估呢?
  • 您必须仔细注意eval 命令。 eval 命令将您作为第一个输入提供的字符串与字符串x 连接起来。在这种新情况下,您连接'10*-100x',但这是 Matlab 语法中的无效命令。即使您尝试以常规方式而不是eval 运行它,语法也是无效的。 10* 没有任何意义,这个乘法没有第二个参数。 100x 也是无效的,因为在 Matlab 中,您必须在计算乘法时明确写下 *
  • 关于您提出的新强度函数,该表达式不容易连接并提供给eval。同样,它还取决于您将什么作为第一个输入参数提供给您的函数。该输入必须连接到eval...这是关键。对于更复杂的强度函数,我推荐@Daniel 的答案,使用匿名函数。
  • Don't use eval ever。听从 Daniel 对匿名函数的建议
猜你喜欢
  • 2022-11-23
  • 2019-07-14
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
相关资源
最近更新 更多