Пример #1
0
void evol_f(real *fin, real *fout)
{
	int id, ip;
	double Cf1, Cf2;
	
//	cal_sigma();
	cal_p();
	streaming(fin,fout);
	
	cal_feqf_diff(fin,Cf);
	for (id=0; id<points*15; id++) {
		Cf1      = -itau_f * Cf[id] + p[id];
		ip       = nextf[id];
		fin[id] += 0.5 * dt * Cf1;
		fout[ip]+= dt * Cf1;
	}
	
//	cal_rho(fout);
	cal_u(fout);
//	cal_sigma();
	cal_p();
	cal_feqf_diff(fout,fout);
	for (id=0; id<points*15; id++) {
		ip       = nextf[id];
		Cf2      = -itau_f * fout[ip] + p[ip];
		fin[id] += dt * 0.5 * Cf2;
	}
	
	streaming(fin,fout);
	
//	cal_rho(fout);
	cal_u(fout);
}
Пример #2
0
int main(void)
{
	int i,j,n;
	char str[1000];char str3[1000];char str2[1000];
	cal_p();
	cal_fac();
	/* for(i=0;i<N;++i){ */
	/*     for(j=0;j<N;++j){ */
	/*         printf("%s ",print_bignum(str,p[i][j])); */
	/*     } */
	/*     printf("\n"); */
	/* } */
	/* for(i=0;i<N;++i){ */
	/*     printf("%d\t%s\n",i,print_bignum(str,fac[i])); */
	/* } */
	n=0;
	while(scanf("%d%d",&i,&j),i||j){
		++n;
		if(i>=j){
			printf("Test #%d:\n%s\n",n,print_bignum(str2,mul(mul(fac[i],fac[j]),p[i][j])));
		} else {
			printf("Test #%d:\n0\n",n);
		}
	}
	return 0;
}
Пример #3
0
Файл: theq.c Проект: EQ4/SPTK
int theq(double *t, double *h, double *a, double *b, const int n, double eps)
{
   static double **r = NULL, **x, **xx, **p;
   static int size;
   double ex[4], ep[2], vx[4], bx[4], g[2];
   int i;

   if (r == NULL) {
      r = mtrx2(n, 4);
      x = mtrx2(n, 4);
      xx = mtrx2(n, 4);
      p = mtrx2(n, 2);
      size = n;
   }
   if (n > size) {
      for (i = 0; i < size; i++) {
         free((char *) r[i]);
         free((char *) x[i]);
         free((char *) xx[i]);
         free((char *) p[i]);
      }
      free((char *) r);
      free((char *) x);
      free((char *) xx);
      free((char *) p);

      r = mtrx2(n, 4);
      x = mtrx2(n, 4);
      xx = mtrx2(n, 4);
      p = mtrx2(n, 2);
      size = n;
   }

   if (eps < 0.0)
      eps = 1.0e-6;

   /* make r */
   for (i = 0; i < n; i++) {
      r[i][0] = r[i][3] = t[i];
      r[i][1] = h[n - 1 + i];
      r[i][2] = h[n - 1 - i];
   }

   /* step 1 */
   x[0][0] = x[0][3] = 1.0;
   if (cal_p0(p, r, b, n, eps) == -1)
      return (-1);

   vx[0] = r[0][0];
   vx[1] = r[0][1];
   vx[2] = r[0][2];
   vx[3] = r[0][3];

   /* step 2 */
   for (i = 1; i < n; i++) {
      cal_ex(ex, r, x, i);
      cal_ep(ep, r, p, i);
      if (cal_bx(bx, vx, ex, eps) == -1)
         return (-1);
      cal_x(x, xx, bx, i);
      cal_vx(vx, ex, bx);
      if (cal_g(g, vx, b, ep, i, n, eps) == -1)
         return (-1);
      cal_p(p, x, g, i);
   }

   /* step 3 */
   for (i = 0; i < n; i++)
      a[i] = p[i][0];

   return (0);
}
Пример #4
0
void evol_f(real f1[Nx][Ny][Nz][15], real f2[Nx][Ny][Nz][15], real Q0[Nx][Ny][Nz][3][3])
{
	int i,j,k,ii,jj;
	int ip, jp, kp;
	real Cf1, Cf2, CG1, CG2;
	real temp;

	cal_feqf_new(f_eq, f1, sigma);
	cal_p(p, f1, f_eq);

	streaming(f1,f2);
	if(particle_on!=0)p_bc(f1,f2);
	
	for(i=0;i<Nx;i++){
	    for(j=0;j<Ny;j++){
	    	for(k=0;k<Nz;k++){
				for(ii=0;ii<15;ii++) {
					Cf[i][j][k][ii] = - itau_f * (f1[i][j][k][ii] - f_eq[i][j][k][ii]) + p[i][j][k][ii];
					ip = i + e[ii][0];
					jp = j + e[ii][1];
					kp = k + e[ii][2];					
					if ( ((kp>=0 && kp <Nz) || wall_on==0) && (particle_on==0 || particle_on !=0 && link_point2[i][j][k][ii]==0) ) {
						if (ip >= Nx) {
							ip -= Nx;
						} else if (ip<0) {
							ip += Nx;
						}
						if (jp >= Ny) {
							jp -= Ny;
						} else if (jp<0) {
							jp += Ny;
						}
						jj = ii;
					}
					else {
						ip = i;
						jp = j;
						kp = k;
						jj = bounce(ii);
					}
					f2[ip][jp][kp][jj] += dt * Cf[i][j][k][ii] ;
					
				}
			}
		}
	}

	cal_rho(Rho,f2);
	cal_u(u,f2);
	cal_sigma(Q0);
	cal_feqf_new(f_eq,f2,sigma);
	cal_p(p,f2,f_eq);

	for(k=0;k<Nz;k++){
		for(i=0;i<Nx;i++){
		    for(j=0;j<Ny;j++){
				for(ii=0;ii<15;ii++) {
					ip = i + e[ii][0];
					jp = j + e[ii][1];
					kp = k + e[ii][2];
					if ( ((kp>=0 && kp <Nz) || wall_on==0) && (particle_on==0 || particle_on !=0 && link_point2[i][j][k][ii]==0) ) {
						if (ip >= Nx) {
							ip -= Nx;
						} else if (ip<0) {
							ip += Nx;
						}
						if (jp >= Ny) {
							jp -= Ny;
						} else if (jp<0) {
							jp += Ny;
						}
						jj = ii;
					}
					else {
						ip = i;
						jp = j;
						kp = k;
						jj = bounce(ii);
					}
					Cf1 = Cf[i][j][k][ii];
					Cf2 = - itau_f * (f2[ip][jp][kp][jj] - f_eq[ip][jp][kp][jj]) + p[ip][jp][kp][jj];
					f1[i][j][k][ii] = f1[i][j][k][ii] + dt * 0.5 * (Cf1 + Cf2);
				}
			}
		}
	}


	streaming(f1,f2);
	if(particle_on!=0)p_bc(f1,f2);

	cal_rho(Rho,f2);
	cal_u(u, f2);
//	cal_W(u);
//	cal_sigma();
}
Пример #5
0
void filterer::run_EM(vector <scan*> &sec,const char* path, parameters & params, bool quiet)
{
	em_params = params;
	cout << "Performing EM optimization";
	double pavg = em_params.em_p_avg;
	double pstdev = em_params.em_p_std;
	double p = em_params.em_p_prior;

	double mavg = em_params.em_m_avg;
	double mstdev = em_params.em_m_std;
	double m = 1-p;

	vector <double> pavg_list;
	vector <double> pstdev_list;
	vector <double> mavg_list;
	vector <double> mstdev_list;
	vector <double> p_list;
	vector <double> lsqr_list;

	unsigned int iters = 0;
	bool negged = false;
	bool stab_neg = false;
	bool stab_pos = false;

	double minma[2];
	double maxma[2];
	while (iters < 500 && (!stab_neg &&!stab_pos)){
		minma[0]=10;
		minma[1]=10;
		maxma[0]=0;
		maxma[1]=0;
		iters++;
		//lsqr_list.push_back(least_sqr(p,pavg,pstdev,mavg,mstdev));
		pavg_list.push_back(pavg);
		pstdev_list.push_back(pstdev);
		mavg_list.push_back(mavg);
		mstdev_list.push_back(mstdev);
		p_list.push_back(p);
		for (unsigned int i = 0; i < sec.size(); ++i){
			sec.at(i)->Fp = cal_Fp(sec.at(i)->discrim,pavg,pstdev);
			sec.at(i)->Fm = cal_Fp(sec.at(i)->discrim,mavg,mstdev);
			sec.at(i)->pF = cal_pF(sec.at(i)->Fp,sec.at(i)->Fm,p,m);
			sec.at(i)->mF = 1-sec.at(i)->pF;
 	 //		if (sec.at(i)->discrim > 5){
  	//				sec.at(i)->pF = 1;
  	//				sec.at(i)->mF = 0;
 	//		}
			if (sec.at(i)->pF < minma[0]){
				minma[0]=sec.at(i)->pF;
				minma[1]=sec.at(i)->discrim;
			}
			if (sec.at(i)->pF > maxma[0]){
				maxma[0]=sec.at(i)->pF;
				maxma[1]=sec.at(i)->discrim;
			}
		}
		for (unsigned int i = 0; i < sec.size(); ++i){
			if (sec.at(i)->discrim < minma[1] && sec.at(i)->pF > minma[0]){
				sec.at(i)->pF = minma[0];
				sec.at(i)->mF = 1-minma[0];
			}
			if (sec.at(i)->discrim > maxma[1] && sec.at(i)->pF < maxma[0]){
				sec.at(i)->pF = maxma[0];
				sec.at(i)->mF = 1-maxma[0];
			}
			if (sec.at(i)->discrim < -12){
				sec.at(i)->pF = 0.0001;
				sec.at(i)->mF = 0.9999;
			}
		}
		if (!negged){
			p = cal_p(sec);
			pavg = cal_pavg(p,sec);
			pstdev = cal_pstdev(p,pavg,sec);
		}
		if (!stab_neg){
			m = 1-p;
			mavg = cal_mavg(m,sec);
			mstdev = cal_mstdev(m,mavg,sec);
		}
		if (pavg < em_params.em_p_avg_llimit && iters > 1){
			negged = true;
			double maxp = 0;
			int mpos = 0;
			for (unsigned int i = 1; i < pavg_list.size();++i){
				if (pavg_list.at(i) > maxp){

					maxp = pavg_list.at(i);
					mpos = i;
				}
			}
			p = p_list.back();
			pavg = pavg_list.back();
			pstdev = pstdev_list.back();
			m = 1-p;
			mavg = mavg_list.at(mpos);
			mstdev = mstdev_list.at(mpos);
		}
		if (mavg > em_params.em_m_avg_ulimit && iters > 4){
			m = 1-p;
			mavg = mavg_list.back();
			mstdev = mstdev_list.back();
		}		
		if (iters > 2 && fabs(mavg-mavg_list.back())< 0.0001)
			stab_neg = true;
		if (iters > 2 && (!negged||stab_neg) && fabs(pavg-pavg_list.back())< 0.0001)
			stab_pos = true;
	}
	//lsqr_list.push_back(least_sqr(p,pavg,pstdev,mavg,mstdev));
	pavg_list.push_back(pavg);
	pstdev_list.push_back(pstdev);
	mavg_list.push_back(mavg);
	mstdev_list.push_back(mstdev);
	p_list.push_back(p);
	cout << "\nConverged in "<<iters << " iterations" << endl;
	if (!quiet){
		ofstream out;
		out.open(path,ios::in|ios::trunc);
		out << "p(+),Average+,Stdev+,p(-),Average-,Stdev-"<<endl;
		for (unsigned int i = 0; i < iters+1; ++i){
			out << p_list.at(i)<<","<<pavg_list.at(i)<<","<<pstdev_list.at(i)<<","<<1-p_list.at(i)<<","<<mavg_list.at(i)<<","<<mstdev_list.at(i)<<endl;
		}
	}
//	for (unsigned int i = 0; i < sec.size(); ++i){
//		if (sec.at(i)->pF > cutoff)
//			sec.at(i)->good = true;
//		else
//			sec.at(i)->good = false;
//		evalCharge(sec.at(i));
//	}
	final_p_avg = pavg;
	final_p_std = pstdev;
}