Convergence of multiplicative Ito scheme
This script is an implementation of a really simple stochastic ODE with multiplicative noise to test the Euler Maruyama scheme.
Contents
clear all, close all
Begin defining various parameters and setting initializations
Initialize the random number generator and seed it.
rng('shuffle');
Specify the global parameters.
mysig=0.3; myper=3e-2;
Specify the time step and stochastic parameters.
Sets how many time steps between saves.
numsteps=10;
Sets the number of outputs.
numouts=1000;
Sets the time step. Stochastic methods are low order so small time steps tend to be required.
dt=1e-5;
For white noise this is needed.
dtrt=sqrt(dt); dtb=dt*numsteps; dtbrt=sqrt(dtb);
Sets the number of ensemble members.
numens=4000;
Set up arrays for storage and store initial state.
noise=randn(numsteps*numouts,numens); t=0; xs=zeros(numouts+1,numens); xs2=zeros(numouts+1,numens); xbs=zeros(numouts+1,numens); x0=ones(1,numens); xs(1,:)=x0; xbs(1,:)=x0; xd=x0(1);x=x0;x2=x0; ts(1)=t; cntr=0; xs(1,:)=x; xds(1)=xd; ts(1)=t;
Primary Loop
for ii=1:numouts
oldt=t;
oldnoise=noise(cntr+1,:);
for jj=1:numsteps
cntr=cntr+1; xd=xd+dt*sin(2*pi*t/myper);
Notice the extra multiplicative term.
x=x+dt*sin(2*pi*t/myper)+dtrt*mysig*noise(cntr,:)*sin(2*pi*t/myper); t=t+dt;
end
Notice the extra multiplicative term.
xbs(ii+1,:)=xbs(ii,:)+dtb*sin(2*pi*oldt/myper)+dtbrt*mysig*oldnoise*sin(2*pi*oldt/myper); xs(ii+1,:)=x; xds(ii+1)=xd; ts(ii+1)=t;
end
Plot
Plot one path, mean and standard deviation.
figure(1) clf subplot(3,1,1) plot(ts,xs(:,1),'b.',ts,xds,'r.',ts,xbs(:,1),'k.') title('sample path, mean and std vs time') subplot(3,1,2) plot(ts,mean(xs,2),'b.',ts,xds,'r.',ts,mean(xbs,2),'k.') legend('control','deterministic','larger dt','Location','best') subplot(3,1,3) plot(ts,std(xs,[],2),'b.',ts,std(xbs,[],2),'k.')
Plot statistics by ensemble size.
figure(2) clf subplot(2,1,1) plot(ts,mean(xs,2),'b.',ts,xds,'r.',ts,mean(xs(:,1:numens/2),2),'k.',ts,mean(xs(:,1:numens/4),2),'g.') title('convergence by ensemble size') legend('control','deterministic','half ensemble','quarter ensemble','Location','best') subplot(2,1,2) plot(ts,std(xs,[],2),'b.',ts,std(xs(:,1:numens/2),[],2),'k.',ts,std(xs(:,1:numens/4),[],2),'g.')