int ModelDefinition::Iterate0(double* X) { // Gillespie's Langevin equation Propensity(X); double dx = S[0][0]*a[0] + S[0][1]*a[1] + S[0][2]*a[2] + S[0][3]*a[3]; //double dy = S[1][0]*a[0] + S[1][1]*a[1] + S[1][2]*a[2] + S[1][3]*a[3]; //double nx, ny; double nx; while(true){ for (int i=0; i<m; i++) { N[i] = randn_notrig(); } nx = X[0] + dx*dt + (S[0][0]*sqrt_a[0]*N[0] + S[0][1]*sqrt_a[1]*N[1] + S[0][2]*sqrt_a[2]*N[2] + S[0][3]*sqrt_a[3]*N[3])*sqrt_dt; //ny = X[1] + dy*dt + (S[1][0]*sqrt_a[0]*N[0] + S[1][1]*sqrt_a[1]*N[1] + S[1][2]*sqrt_a[2]*N[2] + S[1][3]*sqrt_a[3]*N[3])*sqrt_dt; if (nx >= 0) { //if (nx >= 0 && ny >= 0) { break; } } X[0] = nx; //X[1] = ny; return 0; }
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void Gillespie(int Nevents, double Volume, double* T, int NmlcV[], int NmlcF[]) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ { int i, m=0, event; double r1, r2; double A[NREACT], SCT[NREACT], x; /* Compute the stochastic reaction rates */ Update_RCONST(); StochasticRates( RCONST, Volume, SCT ); for (event = 1; event <= Nevents; event++) { /* Uniformly distributed ranfor (m numbers */ r1 = (double)rand()/(double)RAND_MAX; r2 = (double)rand()/(double)RAND_MAX; /* Avoid log of zero */ r2 = (r2-1.0e-14) ? r2 : 1.0e-14; /* Propensity vector */ TIME = *T; Propensity ( NmlcV, NmlcF, SCT, A ); /* Cumulative sum of propensities */ for (i=1; i<NREACT; i++) A[i] = A[i-1]+A[i]; /* Index of next reaction */ x = r1*A[NREACT-1]; for ( i = 0; i<NREACT; i++) if (A[i] >= x) { m = i+1; break; } /* Update T with time to next reaction */ *T = *T - log(r2)/A[NREACT-1]; /* Update state vector after reaction m */ MoleculeChange( m, NmlcV ); } /* for event */ } /* Gillespie */
int ModelDefinition::Iterate1(double* X) { Propensity(X); double B[m][m]; for (int i=0; i<m; i++) { for (int j=0; j<m; j++) { if (j<i) { B[i][j] = B[j][i]; } else { B[i][j] = sqrt_a[i] * sqrt_a[j] * Rcorr[i][j]; } } } for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (j<i) { CovR[i][j] = CovR[j][i]; } else{ CovR[i][j] = 0.0; for (int r=0; r<m; r++) { for (int s=0; s<m; s++) { CovR[i][j] += S[i][r] * B[r][s] * S[j][s]; } } } } } double dx = S[0][0]*a[0] + S[0][1]*a[1] + S[0][2]*a[2] + S[0][3]*a[3]; //double dy = S[1][0]*a[0] + S[1][1]*a[1] + S[1][2]*a[2] + S[1][3]*a[3]; // A is a lower-triangular matrix double A11 = sqrt(CovR[0][0]);// double A12 = 0.0; double A21 = CovR[0][1]/A11; double A22 = sqrt(CovR[1][1] - A21*A21);// if (isnan(A11) || isnan(A21) || isnan(A22)) { cout << "oops" << endl; return -1; } double nx; //double nx,ny; while(true){ for (int i=0; i<n; i++) { N[i] = randn_notrig(); } //ny = X[1] + dy*dt + (A21*N[0] + A22*N[1])*sqrt_dt; nx = X[0] + dx*dt + (A11*N[0] + A12*N[1])*sqrt_dt; //if(nx>=0 && ny >=0){ if(nx>=0){ break; } } X[0] = nx; //X[1] = ny; return 0; }