使用randsample的随机样本?

时间:2012-02-03 17:42:40

标签: matlab stochastic-process

我想用randsample对P和I进行随机步骤模拟,就像下面这个简单的一样。

P=zeros(1,5); I=zeros(1,5)

%easy way

for i=1:5
X=rand; dt=0.01; 

a=randi(50,1);  
b=randi(50,1);
c=randi(50,1);
d=randi(50,1);



if X<=a*dt, 
   P(i+1)=P(i+1)+1;
elseif X>a*dt && X<=(a+b)*dt
   P(i+1)=P(i)-1;
elseif X>(a+b)*dt && X<=(a+b+c)*dt
   I(i+1)=I(i)-1;
elseif X>(a+b+c)*dt && X<=(a+b+c+d)*dt
   I(i+1)=I(i)+1;       
else  %do nothing
  P(i+1)=P(i);
  I(i+1)=P(i);
end

%使用randsample

    Pvec=[a b c d (some value for doing nothing)]*dt;
    Pvec=Pvec./sum(Pvec);
    s=randsample(1:5,1,'true',Pvec);

这不正确。你会如何有效地做到这一点?

这就是我想要做的事,但我认为这不是正确的...... enter image description here

更新竞争人群I和P代码基于这组方程式。

enter image description here

theta_P=0.15;delta_P=0.01;alpha_I=0.4;gamma_I=0.01;delta_I=0.005;lambda_I=0.05;
m=100;   % # runs
time=10; % # Total time of simulation
dt=0.01; % # Time step
D=6000; T=10/dt;

P=zeros(m,time/dt); I=zeros(m,time/dt);

for i=1:m
 for j=1:time/dt         
  arrivalI=alpha_I+P(i,j)*lambda_I;
  lossI=I(i,j)*gamma_I+P(i,j)*I(i,j)*delta_I;

     if j<=T
        alpha_P=D/T;
     else
        alpha_P=0;
     end

  arrivalP=alpha_P+P(i,j)*theta_P;
  lossP=P(i,j)*I(i,j)*delta_P;


  X=rand;

Pvec=[arrivalI lossI arrivalP lossP]*dt;%
Pvec=Pvec./sum(Pvec);

s=randsample(1:4,1,'true',Pvec);


if s==1
    I(i,j+1)=I(i,j)+1;%;
    P(i,j+1)=P(i,j);
elseif s==2
    I(i,j+1)=I(i,j)-1;%
    P(i,j+1)=P(i,j);
elseif s==3

    P(i,j+1)=P(i,j)+1;%
    I(i,j+1)=I(i,j);
elseif s==4

    P(i,j+1)=P(i,j)-1;%;
    I(i,j+1)=I(i,j);
else

    P(i,j+1)=P(i,j);  %check
    I(i,j+1)=I(i,j);
end


end

   subplot(2,2,1:2)
%     
   if P(i,j)>5
   loglog(abs(P(i,:)),'-r')
%    
   else
    loglog(abs(P(i,:)),'-b')
%          
   end
  hold on 
  axis([1 1e3 1 1e4])
end

1 个答案:

答案 0 :(得分:0)

我认为你不能通过调用randsample来复制你的第一个代码块“简单方法”。

第一个代码块递归地生成PI

虽然randsample生成的样本有或没有替换人口:在这种情况下1:5

您可能想尝试randseq(需要Bioinformatics工具箱)。就效率而言,通常无法对递归操作进行矢量化。