计算函数低于数字的时间

时间:2018-04-30 16:47:19

标签: matlab

我对MatLab很陌生,最近我一直在研究布朗运动并将其应用于随机种群动态。我试图计算值低于阈值所需的平均时间。具体来说,要达到1或更低,因为在那一点上人口肯定会灭绝。

我必须生成此数据的代码在给定指定数量的时间步长和迭代的情况下输出具有随时间变化的函数轨迹的图形。有没有办法计算我的每个轨迹达到这个数字的时间,以便我接受平均值?

非常感谢任何想法。如果相关,我可以提供我的代码。提前谢谢!

我的代码如下:

function [x] = myBrownianMotion3(N, nPaths)
% N         = number of steps
% nPaths    = number of paths

 x = zeros(nPaths,N);

 dt = 0.1;
 sdt = sqrt(dt);

 x(:,1) = 10*ones(nPaths,1); %initial population sizes are 10
 t(1) = 0;

    for n = 1:N

         a = randn(nPaths,1)*sdt;
        % a = sign(randn(nPaths,1))*sdt; %sign of a normally
        %                distributed random number
        %                returns -1, 0, or 1

        mu = 0;
        sig = 0.2*x(:,n);
        x(:,n+1) = x(:,n) + mu*dt + sig.*a; %adds new value to current location
        t(n+1) = t(n) + dt; %time dep on steps
    end
plot(t,x)
xlabel('Time'), ylabel('Population size'), title('Stochastic Population Model')

end

=======

现在,我知道这抓住了终点:

A = myBrownianMotion3(n, nPaths);
A(:,end);
B = A(:,end);

但我不知道如何计算实际时间低于1.我希望这很清楚。

1 个答案:

答案 0 :(得分:0)

这很简单。假设A的输出为myBrownianMotion3,阈值编号为K,请按以下步骤操作:

t_fall = A < K;
t_fall = sum(cumprod(~t_fall,2),2) + 1;
t_fall(t_fall == size(A,2) + 1,:) = NaN;

让我们举一个具体的例子:

A = myBrownianMotion3(200,25); % 200 Steps % 25 Paths
K = 1; % Threshold 1

t_fall = A < K;
t_fall = sum(cumprod(~t_fall,2),2) + 1;
t_fall(t_fall == size(A,2) + 1,:) = NaN;

可能的结果之一可能是,例如:

t_fall = [
   NaN;
   NaN;
   167;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   111;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   NaN;
   98
];

表示只有3个路径低于指定的阈值K=13rd位于t=16713th位于t=111 } lastt=98。{/ p>