% fig1.m
% Script for fig 1.
% Calls p0f, p1f, qsf.
N=1000; R0=1.17; alpha1=1; alpha2=1; nmax=160;
p0=p0f(N,R0,alpha1,alpha2);
p1=p1f(N,R0,alpha1,alpha2);
qs=qsf(N,R0,alpha1,alpha2);
n=1:nmax;
K1=(R0-1)*N/(alpha1*R0+alpha2);
sig1=sqrt((alpha1+alpha2)*R0*N)/(alpha1*R0+alpha2);
y1=(n-K1)/sig1;
p1a=phi(y1)/sig1;
plot(n,p0(n),'r',n,p1(n),'g',n,qs(n),'b',n,p1a,':g')
%w=axis; w(4)=0.04; axis(w), grid
% fig2.m
% Script for fig 2.
% Show the left tails of p1, p0, qs, and their approximations, for R0>1.
% I have two approximations for each of p0 and p1.
% The approximations that hold for n=o(sqrt(N)) are called p0a1 and p1a1.
% The better approximations that hold for n=O(sqrt(N)) are called p0a2 and p1a2.
% The approximation of qs that holds for n=o(sqrt(N)) is called qsa1.
% Calls p0f, p1f, qsf, beta1f, phi.
N=1000; R0=1.16; alpha1=1; alpha2=1; nmax=20;
p1=p1f(N,R0,alpha1,alpha2);
p0=p0f(N,R0,alpha1,alpha2);
qs=qsf(N,R0,alpha1,alpha2);
beta1=beta1f(N,R0,alpha1,alpha2);
mu2=log(R0)*N/(alpha1+alpha2); sig2=sqrt(N)/sqrt(alpha1+alpha2); beta2=mu2/sig2;
a=(alpha1*R0+alpha2)/sqrt(alpha1+alpha2);
n=1:nmax;
y2=(n-mu2)/sig2;
a1=a*phi(beta1)/(R0*sqrt(N));
p1a1=a1*R0.^n;
a2=a1/phi(beta2);
p1a2=a2*phi(y2);
b1=(R0-1)*sqrt(N)*phi(beta1)/a;
p0a1=b1*R0.^n./n;
b2=b1/phi(beta2);
p0a2=b2*phi(y2)./n;
qsa1=b1*(R0.^n-1)./n;
K1=(R0-1)*N/(alpha1*R0+alpha2);
sig1=sqrt(R0*N)/a;
y1=(n-K1)/sig1;
tail=phi(y1)/sig1;
semilogy(n,p0(n),'r',n,p1(n),'g',n,qs(n),'b',n,tail,'m',n,p0a2,':r',n,p1a2,':g',n,qsa1,':b')
w=axis; w(3)=0.00005; axis(w)
% fig3.m
% Script for plotting fig3: Distributions p0, p1, qs for R0<1.
% Calls p0f, p1f, qsf.
N=1000; R0=0.9; alpha1=1; alpha2=1; nmax=25;
p0=p0f(N,R0,alpha1,alpha2);
p1=p1f(N,R0,alpha1,alpha2);
qs=qsf(N,R0,alpha1,alpha2);
n=1:nmax;
p1a=(1-R0)*R0.^(n-1);
p0a=-(1/log(1-R0))*R0.^n./n;
plot(n,p0(n),'r',n,p1(n),'g',n,qs(n),'b',n,p0a,':r',n,p1a,':g')
w=axis; w(4)=0.15; axis(w)
% fig4.m
% Script for fig4. Plots H(rho), H0(rho) and H1(rho) for rho<0.
% Calls h0f, h1f, hf.
rhob=-3; alpha=1;
rho=-3:0.1:0;
h0=h0f(rho,rhob);
h1=h1f(rho);
h=hf(rho,alpha);
plot(rho,h0,rho,h1,rho,h)
% fig5.m
% Script for fig5. Plots H(rho), H0(rho) and H1(rho) for rho>0.
% Calls h0f, h1f, hf.
rhob=-3; alpha=0.2;
rho=0:0.1:3;
h0=h0f(rho,rhob);
h1=h1f(rho);
h=hf(rho,alpha);
semilogy(rho,h0,'r',rho,h1,'g',rho,h,'b')
w=axis; w(3)=0.5; w(4)=250; axis(w)
% fig6.m
% Script for fig6.
% Plots p0, p1, qs, and their approximations, in the transition region.
% Calls p0f, p1f, qsf, phi, capphi, h0f, hf.
rho=2; N=1000; R0=1+rho*sqrt(alpha1+alpha2)/sqrt(N); alpha1=1; alpha2=1;
nmax=50; rhob=-3;
p0=p0f(N,R0,alpha1,alpha2);
p1=p1f(N,R0,alpha1,alpha2);
qs=qsf(N,R0,alpha1,alpha2);
l=min([length(p0),length(p1),length(qs)]);
n=1:nmax;
sig3=sqrt(N/(alpha1+alpha2)); mu3=rho*sig3; y3=(n-mu3)/sig3;
p1a=phi(y3)/(sig3*capphi(rho));
sig1=sqrt((alpha1+alpha2)*R0*N)/(alpha1*R0+alpha2);
a=(log(sig3)+h0f(rho,rhob))*phi(rho);
p0a=(1/a)*phi(y3)./n;
R1=1+(rho*sqrt(alpha1+alpha2)+1/hf(rho,alpha1+alpha2))/sqrt(N);
b=phi(rho)*(1+rho*sqrt(alpha1+alpha2)*hf(rho,alpha1+alpha2));
qsa=(1/b)*(1-1./R1.^n).*phi(y3)./n;
plot(n,p0(n),'r',n,p1(n),'g',n,qs(n),'b',n,p0a,':r',n,p1a,':g',n,qsa,':b')
w=axis; w(4)=0.2; axis(w)
% fig7.m
% Script for fig7.
% Plots Expectations of X0, X1, XQ, and their approximations, in the transition region.
% Calls p0f, p1f, qsf, h0f, h1f, hf.
rho=-3:0.2:3; N=1000; alpha1=0.5; alpha2=0.5; rhob=-3;
l=length(rho); ex0=zeros(size(rho)); ex1=ex0; exq=ex0; k1=ex0;
ex0a=ex0; ex1a=ex0; exqa=ex0;
alpha=alpha1+alpha2; M=N/alpha;
for j=1:l
R0=1+rho(j)/sqrt(M);
p0=p0f(N,R0,alpha1,alpha2);
n=1:length(p0);
ex0(j)=sum(n.*p0);
p1=p1f(N,R0,alpha1,alpha2);
n=1:length(p1);
ex1(j)=sum(n.*p1);
qs=qsf(N,R0,alpha1,alpha2);
n=1:length(qs);
exq(j)=sum(n.*qs);
h1=h1f(rho(j)); h0=h0f(rho(j),rhob); h=hf(rho(j),alpha);
ex1a(j)=(rho(j)+1/h1)*sqrt(M);
ex0a(j)=h1*sqrt(M)/(0.5*log(M)+h0);
k=1/(h*sqrt(alpha));
exqa(j)=(h1-h1f(-k))*sqrt(M)/(1+rho(j)/k);
if j<(l+1)/2
k1(j)=0;
else
k1(j)=rho(j)*sqrt(M);
end
end
plot(rho,ex0,'r',rho,ex1,'g',rho,exq,'b',rho,ex0a,':r',rho,ex1a,':g')
hold on
plot(rho,exqa,':b',rho,k1,'b')
%plot(rho,ex0,rho,ex1,rho,exq,rho,ex0a,':',rho,ex1a,':',rho,exqa,':',rho,k1)
% fig8.m
% Plot T[tauQ] as function of rho.
% Calls qsf, beta1f, hf.
N=1000; alpha1=0.5; alpha2=0.5; alpha=alpha1+alpha2; M=N/alpha;
rho=-5:0.2:5; R0=1+rho/sqrt(M);
et=zeros(size(rho));
for k=1:length(rho)
qs=qsf(N,R0(k),alpha1,alpha2);
et(k)=1/qs(1);
end
rho1=3:0.2:5; R1=1+rho1/sqrt(M);
beta1=beta1f(N,R1,alpha1,alpha2);
et1=(alpha1*R1+alpha2)./(sqrt(alpha*N)*(R1-1).^2.*phi(beta1));
rho2=-5:3;
et2=sqrt(N)*hf(rho2,alpha);
semilogy(rho,et,'r',rho1,et1,'b:',rho2,et2,'g:')
w=axis; w(3)=5; w(4)=2e5; axis(w)
function y=beta1f(N,R0,alpha1,alpha2)
% R0 is allowed to be a vector.
if alpha1==0
y=sign(R0-1).*sqrt(2*N*(R0-1-log(R0))/alpha2);
elseif alpha2==0
y=sign(R0-1).*sqrt(2*N*(log(R0)-(R0-1)./R0)/alpha1);
else
alpha=alpha1+alpha2;
a=(alpha/alpha1)*log((alpha1*R0+alpha2)/alpha);
y=sign(R0-1).*sqrt(2*N*(a-log(R0))/alpha2);
end
function y=capphi(x)
% capphi.m Computes the normal cdf Phi(x).
% For x<=-7 I use asymptotic approximation.
% Phi(x)=[erf(x/sqrt(2))+1]/2;
% The density is denoted phi(x).
% x is allowed to be a vector.
% Calls phi.
y=x; ii0=find(x<=-7); ii1=find(x>-7);
if length(ii0)>0
z=x(ii0); kk=26;
x1=-1./z; x2=x1;
for k=2:kk
x1=-x1*(2*k-3)./z.^2;
x2=x2+x1;
end
y(ii0)=phi(x(ii0)).*x2;
end
if length(ii1>0)
y(ii1)=(erf(x(ii1)/sqrt(2))+1)/2;
end
function y=h0f(rho,rhob)
% Computes the function H0(rho); 1/p1^(0) is
% approximated by 0.5*log(N)+H0(rho) for rho=O(1).
% rho is allowed to be a vector.
% Calls haf and h1f.
mb=floor((rhob^2-1+sqrt((rhob^2+1)^2+4*rhob^2))/4);
harhob=haf(rhob,mb);
l=length(rho); y=zeros(size(rho));
for k=1:l
if rho(k)<=rhob
y(k)=haf(rho(k),mb);
else
y(k)=harhob+quad8('h1f',rhob,rho(k));
end
end
function y=h1f(x)
% Computes H1(x)=Phi(x)/phi(x). x is allowed to be a vector.
% Calls capphi and phi.
y=capphi(x)./phi(x);
function y=haf(rho,mb)
% Determines the function Ha(rho) with the sum below running from 2 to mb.
sum=0; a=-1;
for k=2:mb
a=-a*(2*k-3);
term=a/((2*k-2)*rho^(2*k-2));
sum=sum+term;
end
y=-log(abs(rho))-sum;
function y=hf(rho,alpha)
% Determine the function H(rho,alpha) that is important for approximating the
% quasi-stationary distribution in the transition region.
% rho is allowed to be a vector.
% fzero finds a zero of the function hhf. h1(rho(k)) is initial approximation.
% rho(k) and alpha are parameters passed to hhf.
options=optimset('Display','off'); % Sets all other fields equal to [].
for k=1:length(rho)
y(k)=fzero('hhf',[0.001,h1f(rho(k))],options,rho(k),alpha);
end
function y=hhf(x,rho,alpha)
% This function is 0 for x=H(rho,alpha).
% Is used for determining H(rho,alpha) in hf.
% The main job done here is to integrate H1. Uses h1f.
if x>1/30,
aa=quad8('h1f',-1/x,rho);
else
aa=-log(30*x)+quad8('h1f',-1/30,rho);
end
y=aa-1-rho*x*sqrt(alpha);
function y=phi(x)
% phi.m Computes the normal density phi(x).
% x ix allowed to be a vector.
y=zeros(size(x));
y=exp(-x.^2/2)/sqrt(2*pi);
function p=p0f(N,R0,alpha1,alpha2)
% Determine the stationary distribution p0(N,R0,alpha1,alpha2) of the
% approximation X0 for the Verhulst model.
p=zeros(1,N);
p(1)=1; sum=1;
for k=2:N
p(k)=p(k-1)*(1-1/k)*(1-alpha1*(k-1)/N)*R0/(1+alpha2*k/N);
sum=sum+p(k);
if p(k)<2*eps*sum; break; end
end
% Determine where p is positive!
ispos=find(p>0); p=p(ispos);
p=p/sum;
function p=p1f(N,R0,alpha1,alpha2)
% Determine the stationary distribution p1(N,R0,alpha1,alpha2) of the
% approximation X1 for the Verhulst model.
p=zeros(1,N);
p(1)=1; sum=1;
for k=2:N
p(k)=p(k-1)*(1-alpha1*(k-1)/N)*R0/(1+alpha2*(k-1)/N);
sum=sum+p(k);
if p(k)<2*eps*sum; break; end
end
%Determine where p is positive!
ispos=find(p>0); p=p(ispos);
p=p/sum;
function qs1=qsf(N,R0,alpha1,alpha2)
% Determine the qs distribution using iteration.
% Each step of iteration starts from qs0 and determines qs1.
% The initial distribution qs0 equals p1.
% steps is number of iteration steps.
% Each term is called term(k); its numerator is num(k).
% The sum of the first n terms is called summa(n).
% Calls p1f, p0f.
p1=p1f(N,R0,alpha1,alpha2); p0=p0f(N,R0,alpha1,alpha2);
% The components of these two vectors are positive!
% Run iteration only up to an n-value where both p0 and p1
% are positive!
l=min(length(p1),length(p0));
p1=p1(1:l); p0=p0(1:l);
qs0=p1;
% Declare the vectors qs1, num, term, summa, ett:
qs1=zeros(size(qs0)); num=qs1; term=qs1; summa=qs1; ett=ones(size(qs0));
for steps=1:100
qsum=cumsum(qs0);
num=ett-[0 qsum(1:l-1)];
term=p1(1)*num./p1;
summa=cumsum(term);
qs1=p0.*summa/p0(1);
qs1=qs1/sum(qs1);
x1=max(qs1./qs0); x2=max(qs0./qs1);
if max(x1,x2)-1<eps*1e9, break, end
qs0=qs1;
end