importnumpyasnpimportmatplotlib.pyplotaspltfromscipy.linalgimportexpm,null_space# Stochastic reaction simulation# A +B <-> C# Determine equilibrium via chemical master equation# Set state vector x: [A; B; C]Vol=200x=np.array([1,5,0])*Volnmol=x[0]# Set the reaction rate vector kk=np.array([1/Vol,3])extent=np.linspace(1,0,nmol+1)# Construct A of the chemical master equation# dP/dt = A*PA=np.zeros((nmol+1,nmol+1))foriinrange(nmol+1):n=inu=nmol-na=nb=x[1]-nuc=nuA[i,i]=-(k[0]*a*b+k[1]*c)ifi>0:A[i,i-1]=k[1]*(c+1)ifi<nmol:A[i,i+1]=k[0]*(a+1)*(b+1)v=null_space(A)v=v/np.sum(v)plt.figure()plt.plot(v)# Set initial condition for pp=np.zeros((nmol+1,1))p[-1]=1*nmoldeltat=0.01tfinal=1time=np.arange(0,tfinal+deltat,deltat)Ad=expm(A*deltat)p_all=np.zeros((nmol+1,len(time)))p_all[:,0]=p.flatten()foriinrange(1,len(time)):p_all[:,i]=Ad@p_all[:,i-1]p_all[:,i]=p_all[:,i]/np.sum(p_all[:,i])*nmol# Decide on density of extents for plottingelines=50eskip=int(np.ceil(nmol/elines))eindex=np.arange(0,nmol+1,eskip)tlines=30tskip=int(np.ceil((len(time)-1)/tlines))tstart=2tindex=np.arange(tstart,len(time),tskip)-2plt.figure()X,Y=np.meshgrid(time[tindex],extent[eindex])plt.pcolormesh(X,Y,p_all[eindex,:][:,tindex])plt.colorbar()plt.show(block=False)# Save output for plotting in readable .dat formatwithopen('prob_dis_large.dat','w')asf:forjinrange(len(eindex)):foriinrange(len(tindex)):output=[time[tindex[i]],extent[eindex[j]],p_all[eindex[j],tindex[i]]]np.savetxt(f,[output],fmt='%g',newline='\n')ifj<len(eindex)-1:f.write('\n')