# Converted from stochnon.m# A + B <-> C stochastic simulationimportnumpyasnpfromscipy.integrateimportsolve_ivpfrommiscimportstairs,octave_savenmolec=400k1=1.0;k2=1.0k=np.array([k1/nmolec,k2])stoi=np.array([[-1,-1,1],[1,1,-1]])stoiT=stoi.Tnspec=3x_arr=np.zeros((3,nmolec*4+1))x_arr[0,0]=nmolecx_arr[1,0]=0.9*nmolecx_arr[2,0]=0nsim=nmolec*4time=np.zeros(nsim+1)rng=np.random.RandomState(0)forninrange(nsim):r=np.array([k[0]*x_arr[0,n]*x_arr[1,n],k[1]*x_arr[2,n]])rtot=np.sum(r)ifrtot==0:time[n+1]=time[n];x_arr[:,n+1]=x_arr[:,n];continuepp=rng.rand(2)tau=-np.log(pp[0])/rtottime[n+1]=time[n]+taum=int(np.sum(np.cumsum(r)<=pp[1]*rtot))ifm>=2:m=1x_arr[:,n+1]=x_arr[:,n]+stoiT[:,m]ts,xs=stairs(time,x_arr.T)ts=ts[:,0]x0_0=x_arr[0,0]xscale=xs/x0_0ca0=x_arr[0,0]/x0_0cb0=x_arr[1,0]/x0_0cc0=x_arr[2,0]/x0_0deff_det(t,x):ca=x[0]cb=ca-ca0+cb0cc=cc0+ca0-careturn[-k1*ca*cb+k2*cc]sqeps=np.sqrt(np.finfo(float).eps)sol=solve_ivp(f_det,[time[0],time[-1]],[ca0],method='Radau',t_eval=time,rtol=sqeps,atol=sqeps)ca=sol.y[0]cb=ca-ca0+cb0cc=cc0+ca0-catable1=np.column_stack([ts,xscale])table2=np.column_stack([time,ca,cb,cc])octave_save('stochnon.dat',('table1',table1),('table2',table2))