示例#1
0
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;
}
示例#2
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 */
示例#3
0
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;
}