コード例 #1
0
mp_real Regtheo(mp_real x_, mp_real a_)
{
  mp_real Sqrtpi = sqrt(mppic);
  mp_real a2 = a_ * a_ + mp_real(0.25); // a^2 + g^2
  mp_real a  = mp_real(2.0) * sqrt(a2);
  mp_real b_ = 1/a;
  
  mp_real y_ = b_/Sqrtpi * exp(- b_ * b_ * x_ * x_);
  return y_ ;
}
コード例 #2
0
mp_real mpe2gausstheo(mp_real x0_)
{ 
  static mp_real SQRTpi = sqrt(mppic) ;
  double gd = 1.0;  /* gd = 1/2 gamma !!!; hier gamma = 0.5 */
  double x0d = dble(x0_);
  mp_real g = mp_real(gd);
  mp_real fac = g/SQRTpi;
  double h = 1E-03;
  int n = 10000;
  double yd_ = trapez(kerngauss,x0d,gd,x0d,h,n); 
  mp_real y_ = fac * mp_real(yd_);
  return y_;
}
コード例 #3
0
mp_real mpe2gauss(mp_real x0_)
{ 
  static mp_real SQRTpi = sqrt(mppic) ;
  double gd = 1.0;  /* gd = 1/2 gamma !!!; hier gamma = 0.5 */
  double x0d = dble(x0_);
//  double xi = Xi4(x0d); /*Rauschen*/
  double xi = 0.0; /*Rauschen*/
  mp_real g = mp_real(gd);
  mp_real fac = g/SQRTpi;
  double h = 1E-03;
  int n = 10000;
  double yd_ = trapez(kerngauss,x0d,gd,x0d,h,n); 
  mp_real y_ = fac * mp_real(yd_);
  //y_ = y_ * (mp_real(1.0) + mp_real(0.0) * xi);
  return y_;
}
コード例 #4
0
mp_real mpe2(mp_real x_)
{
  mp_real p;
  mp_real q;
  p =  exp(- x_) ;
  q = mp_real(1.0) + exp(- 2.0 * x_);
  mp_real y_ = p/q;
  return y_;
}
コード例 #5
0
ファイル: mp_datae2.C プロジェクト: mfrosenberg68/WorkRegOld
int main()
{
  cout  << setiosflags(ios::uppercase);
  ofstream fout("Data.out");
  fout  << setiosflags(ios::uppercase);
  
  mp_init();
  
  double x1_in, x2_in;
  int m;
  
  mp_real b, x0, step, x1, x2;

  cin >> x1_in >> x2_in >> m;

  x1 = mp_real(x1_in);
  x2 = mp_real(x2_in);

  step = (x2 - x1)/m;
 
  cout << "+++ Precision = " << mpipl << " +++" << endl;
  cout << "x1 = " << x1;
  cout << "x2 = " << x2;
  cout << "m  = " << m << endl;
  

  for(int j = 0; j <= m; j++)
    {
      x0 = x1 + j * step;
      mp_real datamp = mpe2(x0);
      mp_real fexaktmp = mpe2exakt(x0);
      mp_real Errormp = datamp - fexaktmp;
      mp_real Errorrelmp = 100.0 * (abs(Errormp)/abs(fexaktmp));
      double data = dble(datamp);
      double fexakt = dble(fexaktmp);
      double Error = dble(Errormp);
      double Errorrel = dble(Errorrelmp);
      double xd0 = dble(x0);
      
(ostream&) fout << xd0 << '\t' << fexakt << '\t' << data << '\t' << Error << '\t' << Errorrel << endl;
    }

  return 0;
}
コード例 #6
0
int main()
{
  cout  << setiosflags(ios::uppercase);
  
  ofstream out1("Daten_Gauss.out");
  out1 << setiosflags(ios::uppercase);
  
  ofstream out("LIP.out");
  out << setiosflags(ios::uppercase);

  ofstream outs("Y2D.out");
  outs  << setiosflags(ios::uppercase);
  
  ofstream rout("REGLIP_Gauss.out");
  rout  << setiosflags(ios::uppercase);
  
  cout << "*** Imaginaerteilgleichung ***" << endl;
  cout << "*** Filter: Gauss ***" << endl;

  mp_init();
  cout << "*** Precision = " << mpipl << " ***" << endl;
  

  int M, N, MD;
  double xa, xb, x1, x2, xr1, xr2, h, step, step2, b1, dfactor, dpi;
  mp_real b, mpx1, mpx2, mpstep, mpx;

  dpi = 4.0 * atan(1.0);

  mp_real pi = mppic; // pi aus der Bibliothek !!!
  mp_real pi2 = pi * pi;
  static mp_real factor;


  cin >> b1;
  cin >> xa >> xb >> MD;
  cin >> x1 >> x2 >> M;  
  cin >> xr1 >> xr2 >> N ;
  
  cout << '\v';

  /* KERNELARRY ANFANG */

  mp_real* const mpregKern = new mp_real [M+1];
  b = mp_real(b1);
  mpx1 = mp_real(x1);
  mpx2 = mp_real(x2);

  mpstep = (mpx2 - mpx1)/mp_real(M);  
  
  /* Vorfaktor */
  factor = mp_real(2.0)*b/power(pi,mp_real(1.5));
  factor *= exp(mp_real(0.25) * pi2 * b * b);
  
  dfactor = 2.0 * (b1/pow(dpi,1.5)) * exp(b1*b1*dpi*dpi*.25);

  cout << "*** Begin: Init. Kernel *** " << endl;
    
  cout << "b1  = " << b1  << endl;
  cout << "b  = " <<  b ;
  cout << "x1  = " << x1 << endl;  /* Anfangs-/Endpunkt der Regularisierung */
  cout << "x2  = " << x2 << endl;
  cout << "M   = " << M  << endl; 
  cout << "h   = " << mpstep;
  cout << "factor = " << factor ;
  cout << "dfactor = " << dfactor << endl;

  for(int i = 0; i <= M; i++) 
    {
      mpx = mpx1 + i * mpstep;
      mpregKern[i] = mpregkerne2(mpx, b);
    }

  cout << "*** End: Init. Kernel *** " << endl;

  /* KERNELARRY ENDE */

  double x0, datlinpol, Error_splint, DataError, e2core;

  /* Index der Vektoren beginnt mit 1 und *nicht* mit 0 */
  
  double* y2d = dvector(1,MD);  /* 2.Ableitung der SPL-Funktion */
  double* data = dvector(1,MD); /* Datenvektor */
  double* x = dvector(1,MD);    /* x-Vektor */
  
  /* Datenarrays fuellen */

  h = (xb - xa)/(MD - 1);
  double rho = MD/(xb -xa);

  cout << '\v';
  cout << "*** Begin: Init. Data-Array ***" << endl;
  cout << "xa  = " << xa << endl;   /* Anfangs-/Endpunkte der Daten */
  cout << "xb  = " << xb << endl;
  cout << "MD  = " << MD  << endl;  /* Zahl der Datenpunkte */
  cout << "h   = " << h  << endl;
  cout << "rho = " << rho  << endl;
  x[1] = xa;
  data[1] = e2data(xa);

  for(int i = 2; i <= MD ; i++)
    {
      x[i] = xa + (i-1) * h;
      data[i] = e2data(x[i]);
    }

  x[MD] = xb;
  data[MD] = e2data(xb);
  
  cout << "*** End: Init. Data-Array ***" << endl;
  cout << '\v' ;

  /* Kontrollausgabe, Datenausgabe */
  for(int i = 1; i <= MD; i++)
    {
      DataError = fabs(data[i] - e2(x[i]))/fabs(e2(x[i]));
      DataError *= 100.0;
      out1 << i << '\t' << x[i] << '\t' << data[i] << '\t' << e2(x[i]) << '\t' << DataError << endl;
    }

  cout << "*** Begin: Interpol. *** " << endl;

  intlinear(x,data,MD,y2d);

  for(int i = 1; i <= MD; i++) outs << i << '\t'  << y2d[i] << endl;

  cout << "*** End:   Interpol. *** " << endl; 
  cout << '\v';

  
  
  for(int j = 0; j <= M; j++)
    {
      step = dble(mpstep);
      x0 = x1 + j * step;
      
      datlinpol = linint(x,data,y2d,MD,x0);
      e2core  = e2(x0);
      Error_splint = fabs(datlinpol - e2core)/fabs(e2core);
      Error_splint *= 100.0;
      
      out << x0 << '\t' <<  datlinpol << '\t' << e2core << '\t' << Error_splint << endl;
      
    }

  /* REGULARISIERUNG */
 
  double xi;

  mp_real mp_regsum, mpdata, mpError, mpreg;
  double regsum, Error, Reg;

  step2 = (xr2 - xr1)/N;

  cout <<"*** Begin: Regularisation ***" << endl;
  cout << "b1  = " << b1  << endl;
  cout << "b  = " <<  b ;
  cout << "x1 = " << xr1 << endl;
  cout << "x2 = " << xr2 << endl;
  cout << "N  = " << N  << endl;
  cout << "h  = " << step2 << endl;
  cout << '\v' ;

  for(int jj = 0; jj <= N; jj++)
  {
    mp_regsum = mp_real(0.0);
    x0 = xr1 + jj * step2;
    
    for(int j = 0; j <= M; j++)
      {
	xi = x1 + j * step;
	xi = x0 - xi;
	datlinpol = linint(x,data,y2d,MD,xi);
	mpdata = mp_real(datlinpol);
	mp_regsum += mpregKern[j] * mpdata;
	
      }
    mp_regsum *= mpstep;
    mp_regsum *= factor;

    mpreg = mpRegexakt(mp_real(x0),b);
    mpError = abs(mp_regsum - mpreg)/abs(mpreg);
    mpError *= mp_real(100.0);

    regsum = dble(mp_regsum);
    Error  = dble(mpError);
    Reg    = dble(mpreg);

    cout << x0 << endl;
    cout << mpreg << mp_regsum << mpError << endl;
    
    rout << x0 << '\t' << Reg << '\t' << regsum << '\t' << Error << '\t' << b1 << endl;
    
  }
  cout <<"*** End: Regularisation ***" << endl;
  
  free_dvector(y2d,1,MD);
  free_dvector(data,1,MD);
  free_dvector(x,1,MD);
  delete [] mpregKern;

  return 0;
}
コード例 #7
0
ファイル: mp_Regcomp.C プロジェクト: mfrosenberg68/WorkRegOld
int main()
{
  mp_init();

  //  const mp_complex I = mp_complex(0.0,1.0);

  static mp_real pi  = mppic;
  static mp_real pi2 = mppic * mppic;

  static mp_real Sqrtpi = sqrt(mppic);
  
  cout  << setiosflags(ios::uppercase);

  ofstream out("REGSOLC.out");
  out << setiosflags(ios::uppercase);

  ofstream kout("KERNELCMP.out");
  kout << setiosflags(ios::uppercase);
  
  ofstream dout("DATACMP.out");
  dout << setiosflags(ios::uppercase);
  
  int M, N;
  double bd;
  double x1d, x2d, xad, xbd;
  
  cin >> bd;
  cin >> xad >> xbd >> N;
  cin >> x1d >> x2d >> M;

  cout << "*** Precision = " << mpipl << " ***" << endl;
  cout << "b  = " << bd << endl;
  cout << "xa = " << xad << endl;
  cout << "xb = " << xbd << endl;
  cout << "x1 = " << x1d << endl;
  cout << "x2 = " << x2d << endl;
  cout << "N  = " << N << endl;
  cout << "M  = " << M << endl;

  mp_real xa   = mp_real(xad);
  mp_real xb   = mp_real(xbd);
  mp_real x1   = mp_real(x1d);
  mp_real x2   = mp_real(x2d);
  mp_real  b   = mp_real(bd);

  mp_real factor;
  factor = b/power(pi,mp_real(1.5))*exp(mp_real(1.25)*pi2*b*b);


  mp_real h    = (xb - xa)/mp_real(N);
  cout << "h  = " << h ;

  mp_real step = (x2 - x1)/mp_real(M);
  cout << "h2 = " << step;

  cout << "Faktor = " << factor << endl;


  mp_real mpx0; 
  //  mp_real mpx, mpx0; 
  //  mp_complex regkern, data;
  //  double Realregkern, Imaregkern;
  //  double RealData, ImaData;
  /*
  cout << " *** write Kernel and Data *** " << endl;
  
  for(int i = 0; i <= N; i++)
    {
      mpx0 = mp_real(0.0);
      mpx = xa + i * h;
      regkern = mpregkernc(mpx,mpx0,b);
      //      cout << mpx << regkern << endl;

      Realregkern = dble(MP_REAL(regkern));
      Imaregkern  = dble(aimag(regkern));

      //      data = E_data(mpx);
      //      cout << mpx << data << endl;

      //      RealData = dble(MP_REAL(data));
      //      ImaData  = dble(aimag(data));

      kout << dble(mpx) << '\t' << Realregkern << '\t' << Imaregkern << '\t' << bd<< endl;

      //      dout << dble(mpx) << '\t' << RealData << '\t' << ImaData << endl;
    }
    */
  mp_complex mpregsum;
  mp_real mpReg, RelError;
  double RealReg, ImaReg, Error;

  cout << " *** Begin: Regularisation *** " << endl;

  for(int j = 0; j <= M; j++)
    {
      mpx0 = x1 + j * step;

      mpregsum = mptrapez(RegIntegrand,mpx0,b,mpx0,.5*h,N);
      mpregsum *=factor;

      mpReg = Regtheo(mpx0,b);
      RelError = abs(mpregsum - mpReg)/abs(mpReg);
      RelError *= mp_real(100.0);

      cout << mpx0 << mpregsum  << endl;
      cout << mpReg << RelError << endl;
      
      RealReg = dble(MP_REAL(mpregsum));
      ImaReg  = dble(aimag(mpregsum));
      Error   = dble(RelError);

      out << dble(mpx0) << '\t' << dble(mpReg) << '\t' << RealReg << '\t' << ImaReg << '\t' << Error << '\t' << bd << endl;
    }
  cout << " *** End: Regularisation *** " << endl;
  
  return 0;
}
コード例 #8
0
int main()
{
  cout  << setiosflags(ios::uppercase);
  ofstream out("GAUSS.out");
  out   << setiosflags(ios::uppercase);
  ofstream dout("GAUSSMOD.out");
  dout  << setiosflags(ios::uppercase);

  mp_init();
  double s_in, h_in , b_in, dfactor, dpi, x1_in, x2_in;
  int N, m, Control;

  dpi = 4.0 * atan(1.0);
  
  mp_real pi = mppic; // pi aus der Bibliothek !!!
  mp_real pi2 = pi * pi;
  static mp_real factor;
  
  mp_real a, b, x0, s, h, x1, x2;

  /* Parameter als doubles einlesen */
  cin >> b_in >> Control;
  cin >> s_in >> h_in >> N;
  cin >> x1_in >> x2_in >> m;

  /* Konversion: double -> mp_real */
  b  = mp_real(b_in);
  s  = mp_real(s_in);
  h  = mp_real(h_in);
  x1 = mp_real(x1_in);
  x2 = mp_real(x2_in);
  a  = 1/(mp_real(2.0)*b);

  /* Vorfaktor */
  factor = mp_real(2.0)*b/power(pi,mp_real(1.5));
  factor *= exp(mp_real(0.25) * pi2 * b * b);
  
  dfactor = 2.0 * (b_in/pow(dpi,1.5)) * exp(b_in*b_in*dpi*dpi*.25);

  cout << "+++ Precision = " << mpipl << " +++" << endl;
  cout << "b  = " << b ;
  cout << "a  = " << a;
  cout << "h  = " << h;
  cout << "N  = " << N << endl;
  cout << '\v' ;
  cout << "x1 = " << x1;
  cout << "x2 = " << x2;
  cout << "m  = " << m << endl;
  
  cout << "xmax = " << h * N << endl;
  
  cout << "dfaktor = " <<dfactor << endl;
  cout << "Faktor = " <<factor << endl;
  
  mp_real mp_E2_Gauss, mp_E2_Gausstheo, mp_Reg, mp_Regtheo, mp_ModGauss, step;
  mp_real mp_diffrel, mp_diffrelreg;
  double E2, E2_Gauss, E2_Gausstheo, Reg, Reg_theod, ModGauss, diffrel, x0d;
  double diffrelreg;
  
  step = (x2 -x1)/mp_real(m);


  if(Control == 1)
    {
	cout << "*** Begin: Read Data ***" << endl; 
      for(int j = 0; j <= m; j++)
	{
	  x0 = x1 + j * step; 
	  mp_E2_Gauss = mpe2gauss(x0);
	  mp_E2_Gausstheo = mpe2gausstheo(x0);
	  mp_real mpdeltarel = abs(mp_E2_Gauss - mp_E2_Gausstheo)/abs(mp_E2_Gausstheo);
	  mpdeltarel *= mp_real(100.0);
	  
	  x0d = dble(x0);
	  E2 = e2(x0d);
	  E2_Gauss        = dble(mp_E2_Gauss);
	  E2_Gausstheo    = dble(mp_E2_Gausstheo);
	  double deltarel = dble(mpdeltarel);
	  cout << x0 << mp_E2_Gausstheo << mp_E2_Gauss << mpdeltarel << endl;;

	  (ostream&) dout << x0d << '\t' << E2 << '\t' << E2_Gausstheo <<'\t' << E2_Gauss << '\t' << deltarel << endl;
      	}
      cout << "*** End: Read Data ***" << endl; 
    }

  cout << "*** Begin: Regularisation ***" << endl;
  for(int jj = 0; jj <= m; jj++)
    {
      x0 = x1 + jj * step;
      s = x0;
      mp_Reg = mptrapez(mpkern,x0,b,s,h,N);
      mp_Reg *= factor;
  
      mp_Regtheo  = Regtheo(x0, a); //reine Regularisierte
      mp_ModGauss = GaussDichte(x0); //Gaussdichte als Modell
      
      
      mp_diffrel = abs(mp_Reg - mp_Regtheo)/abs(mp_Regtheo);
      mp_diffrel *= mp_real(100.0);
      
      mp_diffrelreg  = abs(mp_Reg - mp_ModGauss)/abs(mp_ModGauss);
      mp_diffrelreg *= mp_real(100.0);

      Reg_theod  = dble(mp_Regtheo);
      Reg        = dble(mp_Reg);
      ModGauss   = dble(mp_ModGauss);
      diffrel    = dble(mp_diffrel);
      diffrelreg = dble(mp_diffrelreg);
      x0d        = dble(x0);

      cout << mp_Reg << mp_Regtheo << mp_ModGauss << mp_diffrel << mp_diffrelreg<< endl;
      
      (ostream&) out << b_in << '\t' << x0d << '\t' << ModGauss << '\t' << Reg << '\t' << Reg_theod<< '\t' << diffrel <<'\t' << diffrelreg << endl;
      
    }
  cout << "*** End: Regularisation ***" << endl;
  return 0;
}
コード例 #9
0
ファイル: GaussLIP.C プロジェクト: mfrosenberg68/WorkRegOld
int main()
{
  cout  << setiosflags(ios::uppercase);
  
  ofstream out("LIPGauss.out");
  out  << setiosflags(ios::uppercase);

  ofstream out1("DATENGaussLip.out");
  out1 << setiosflags(ios::uppercase);

  ofstream outs("Y2D.out");
  outs  << setiosflags(ios::uppercase);

  
  ofstream rout("RegGaussLIP.out");
  rout << setiosflags(ios::uppercase);
  
  cout << "*** Filter: Gauss *** " << endl;
  cout << "*** Imaginaerteil *** " << endl;
  mp_init(); 
  cout << "*** Precision = " << mpipl << " ***" << endl;
  
  // pi aus der Bibliothek !!!
  mp_real pi = mppic; 
  mp_real pi2 = pi * pi;
  static mp_real factor;


  static double  dpi = 4.0 * atan(1.0);
  static double dfactor;

  int M, MD, N;
  double b1, xa, xb, h, x1, x2, hreg;
  mp_real b;

  /* Parameter einlesen */

  cin >> b1;
  cin >> xa >> xb >> MD;
  cin >> hreg >> N;
  cin >> x1 >> x2 >> M;

  b = mp_real(b1);
  
  /* Vorfaktor */
  factor = mp_real(2.0)*b/power(pi,mp_real(1.5));
  factor *= exp(mp_real(0.25) * pi2 * b * b);
  
  dfactor = 2.0 * (b1/pow(dpi,1.5)) * exp(b1*b1*dpi*dpi*.25);
  

  /* DATEN UND SPLINE-ROUTINE */
  /* 1. Ableitung der Funktion an den Eckpunkten */
  double yp1, ypn; 

  double x0, dataspl, Error_splint, DataError, e2core;

  /* Index der Vektoren beginnt mit 1 und *nicht* mit 0 */
  
  double* y2d = dvector(1,MD);  /* 2.Ableitung der SPL-Funktion */
  double* data = dvector(1,MD); /* Datenvektor */
  double* x = dvector(1,MD);    /* x-Vektor */
  

  /* Nebenbedingung natuerliche Splinefunktion setzen */
  yp1 = ypn = 1E30;
  //  yp1 = ypn = 0.0 ;
  
  /* Datenarrays fuellen */

  h = (xb - xa)/(MD - 1);
  double rho = MD/(xb - xa);
  
  cout << '\v';
  cout << "*** Begin: Init. Data-Array ***" << endl;
  cout << "xa  = " << xa << endl;   /* Anfangs-/Endpunkte der Daten */
  cout << "xb  = " << xb << endl;
  cout << "MD  = " << MD  << endl;  /* Zahl der Datenpunkte */
  cout << "h   = " << h  << endl;
  cout << "rho = " << rho  << endl;

  x[1] = xa;
  data[1] = e2data(xa);

  for(int i = 2; i <= MD ; i++)
    {
      x[i] = xa + (i-1) * h;
      data[i] = e2data(x[i]);
//cout << i << '\t' << x[i] << '\t' << data[i] << '\t' << e2data(x[i]) << endl; 
    }

  x[MD] = xb;
  data[MD] = e2data(xb);
  
  cout << "*** End: Init. Data-Array ***" << endl;
  cout << '\v' ;
  
  /* Kontrollausgabe, Datenausgabe */
  for(int i = 1; i <= MD; i++)
    {
      DataError = fabs(data[i] - e2(x[i]))/fabs(e2(x[i]));
      DataError *= 100.0;
      out1 << i << '\t' << x[i] << '\t' << data[i] << '\t' << e2(x[i]) << '\t' << DataError << endl;
    }

  cout << "*** Begin: LinInt. *** " << endl;

  intlinear(x,data,MD,y2d);

  for(int i = 1; i <= MD; i++) outs << i << '\t'  << y2d[i] << endl;

  cout << "*** End:   LinInt *** " << endl; 
  cout << '\v';


  //  static double step = (xb - xa)/MD;
  double xmax = N * hreg ;

  for(int j = 0; j <= (2 * N); j++)
    {
      x0 = j * hreg - xmax ;
      
      dataspl = linint(x,data,y2d,MD,x0);
      e2core  = e2(x0);
      Error_splint = fabs(dataspl - e2core)/fabs(e2core);
      Error_splint *= 100.0;
      
      // cout << x0 << '\t' << dataspl << '\t' << e2core << '\t' << Error_splint << endl;
      out << x0 << '\t' <<  dataspl << '\t' << e2core << '\t' << Error_splint << endl;
      
    }



  /* REGULARISATION */

  mp_real mp_regsum, mpdataup, mpdatadown , fu, fd, mpx0, zu, zd;
  mp_real mpx1, mpx2;
  mp_real mp_theoreg, mp_Error;
  double theoreg, Errorel;

  static mp_real mph = mp_real(hreg);
  static mp_real mprstep;

  double dregsum, x0d, dzu, dzd;
  mpx1 = mp_real(x1);
  mpx2 = mp_real(x2);
  mprstep = (mpx2 - mpx1)/mp_real(M);
  
  cout <<"*** Begin: Regularisation ***" << endl;
  cout << "b    = " <<  b1 << endl;
  cout << "N    = " << N << endl;
  cout << "h    = " << hreg << endl;
  cout << "xmax = " << N * hreg << endl;
  cout << "hreg = " << mph << endl;

  cout << "x1 = " << x1 << endl;
  cout << "x2 = " << x2 << endl;
  cout << "h  = " << mprstep << endl;

  cout << "dFaktor = " << dfactor << endl;
  cout << "Faktor  = " << factor << endl;


  for(int jj = 0; jj <= M; jj++)
    { 
      mpx0 = mpx1 + jj * mprstep;
      
      x0d = dble(mpx0);

      mpdataup = mp_real(linint(x,data,y2d,MD,x0d));
      
      mp_regsum = mpregkerne2(mpx0, mpx0 , b) * mpdataup;
  
      for(int j = 1; j <= N; j++)
	{
	  zu  = mpx0 + j * mph;
	  dzu = dble(zu);
	  
	  zd  = mpx0 - j * mph;
	  dzd = dble(zd);

	  mpdataup = mp_real(linint(x,data,y2d,MD,dzu));
	  fu = mpregkerne2(zu,mpx0,b) * mpdataup;
	  
	  mpdatadown = mp_real(linint(x,data,y2d,MD,dzd));
	  fd = mpregkerne2(zd,mpx0,b) * mpdatadown;
	  
	  mp_regsum += (fu + fd) ;
	}
      mp_regsum *= mph;
      mp_regsum *= factor;
      
      mp_theoreg = mpRegexakt(mpx0, b);
      
      mp_Error = abs(mp_regsum - mp_theoreg)/abs(mp_theoreg);
      mp_Error *= mp_real(100.0);
      
      dregsum  = dble(mp_regsum);
      theoreg  = dble(mp_theoreg);
      Errorel  = dble(mp_Error);
      
      cout << mpx0 << mp_theoreg << mp_regsum << mp_Error << endl;
      rout << x0d << '\t' << theoreg << '\t' << dregsum << '\t' << Errorel << '\t' << b1 << endl;
      
    }
  cout <<"*** End: Regularisation ***" << endl; 

  return 0;

}
コード例 #10
0
ファイル: mp_rege2.C プロジェクト: mfrosenberg68/WorkRegOld
int main()
{
  cout << setiosflags(ios::uppercase);

  //ofstream dout("RegE2_MP.out");
  //dout  << setiosflags(ios::uppercase);

  mp_init();
  
  double s_in, h_in, b1_in, b2_in, db, dfactor, dpi, x1_in, x2_in, dxi;
  int N, m, Nb;

  dpi = 4.0 * atan(1.0);
  
  mp_real pi = mppic; // pi aus der Bibliothek !!!
  mp_real pi2 = pi * pi;
  static mp_real factor;
  
  mp_real b, b1, b2, bstep, x0, s, h, x1, x2, xi;

  /* Parameter als doubles einlesen */
  cin >> b1_in >> b2_in >> Nb;
  cin >> s_in >> h_in >> N;
  cin >> x1_in >> x2_in >> m >> dxi;

  /* Konversion: double -> mp_real */
  b1  = mp_real(b1_in);
  b2  = mp_real(b2_in);
  s  = mp_real(s_in);
  h  = mp_real(h_in);
  x1 = mp_real(x1_in);
  x2 = mp_real(x2_in);
  xi = mp_real(dxi);

  mp_real step = (x2 - x1)/m;
  bstep = (b2 -b1)/mp_real(Nb);


  cout << "+++ Precision = " << mpipl << " +++" << endl;
  cout << "b1  = " << b1 ;
  cout << "b2  = " << b2 ;
  cout << "hb  = " << bstep;
  cout << "s   = " << s;
  cout << "h   = " << h;
  cout << "N   = " << N << endl;
  cout << '\v' ;
  cout << "x1  = " << x1;
  cout << "x2  = " << x2;
  cout << "m   = " << m << endl;
  cout << "xi  = " << dxi << endl;
  cout << "xh  = " << step;
  cout << "xmax = " << h * N << endl;
  
  //cout << "dfaktor = " <<dfactor << endl;
  //cout << "Faktor = " <<factor << endl;
  
  String data = "Data-N" ;
  data = data + strdup(fix3(N)) + "-xb" +strdup(fix3(h_in*N))  + ".out"; 
  ofstream fout(data());
      

  cout << "*** Begin: Write Data ***" << endl;
  for(int j = 0; j <= m; j++)
    {
       
      x0 = (j * h) - (h*N);
      mp_real datamp = mpe2(x0,xi);
      mp_real fexaktmp = mpe2exakt(x0);
      mp_real Errormp = datamp - fexaktmp;
      mp_real Errorrelmp = 100.0 * (abs(Errormp)/abs(fexaktmp));
      double data = dble(datamp);
      double fexakt = dble(fexaktmp);
      double Error = dble(Errormp);
      double Errorrel = dble(Errorrelmp);
      double xd0 = dble(x0);
      
      (ostream&) fout << xd0 << '\t' << fexakt << '\t' << data << '\t' << Error << '\t' << Errorrel << endl;
    }




  cout << "*** End  : Write Data ***" << endl;

  mp_real Regtheo_mp;
  mp_real RegSol_mp, RelError_mp;

  
  double xod, RegSol, Regtheo, RelError;

  /*
  if(Control == 1) 
    {
      cout << " *** Beginn Testrechnung *** " << endl;
      x0 = x1;
      s  = x0; 
      Regpure_mp  = mptrapez(mpkernpurereg,x0,b,s,h,N);
      Regpure_mp *= factor;
      
      Regtheo_mp  = mpRegexakt(x0,b);

      RelNumerror_mp = abs(Regpure_mp - Regtheo_mp)/abs(Regtheo_mp);
      RelNumerror_mp *= 100.0;
      
      cout << "x0 = " << x0;
      cout << Regpure_mp << Regtheo_mp << RelNumerror_mp;
      
      x0 = mp_real(0.0);
      s  = x0; 
      Regpure_mp  = mptrapez(mpkernpurereg,x0,b,s,h,N);
      Regpure_mp *= factor;
      
      Regtheo_mp  = mpRegexakt(x0,b);

      RelNumerror_mp = abs(Regpure_mp - Regtheo_mp)/abs(Regtheo_mp);
      RelNumerror_mp *= 100.0;
      
      cout << "x0 = " << x0;
      cout << Regpure_mp << Regtheo_mp << RelNumerror_mp;

      x0 = x2;
      s  = x0; 
      Regpure_mp  = mptrapez(mpkernpurereg,x0,b,s,h,N);
      Regpure_mp *= factor;
      
      Regtheo_mp  = mpRegexakt(x0,b);

      RelNumerror_mp = abs(Regpure_mp - Regtheo_mp)/abs(Regtheo_mp);
      RelNumerror_mp *= 100.0;
      
      cout << "x0 = " << x0;
      cout << Regpure_mp << Regtheo_mp << RelNumerror_mp;

      cout << " *** End Testrechnung *** " << endl;

    }
  */
  cout << '\v' ;

  cout << " *** Beginn PureRegularisation *** " << endl;
  
  for(int jj=0; jj <=Nb; jj++)
  {
      b = b1 + jj * bstep;
      db = dble(b);
      
      String reg = "RegGaussE2_MP-N" ;
      reg = reg + strdup(fix3(N)) + "-xb" + strdup(fix3(x2_in)) + "-b" + strdup(fix3(db)) + ".out"; 
      ofstream out(reg());
      
      /* Vorfaktor */
      factor = mp_real(2.0)*b/power(pi,mp_real(1.5));
      factor *= exp(mp_real(0.25) * pi2 * b * b);
      dfactor = 2.0 * (db/pow(dpi,1.5)) * exp(db*db*dpi*dpi*.25);
      
      cout << " +++ b = " << db << " ;  j = " << jj << " +++" << endl;
      cout << '\v' ;
      
  for(int j = 0; j <= m; j++)
    {
      x0 = x1 + j * step;
      s = x0;
      
      RegSol_mp   = mptrapezxi(mpkern,x0,b,xi,s,h,N);
      RegSol_mp  *= factor;

      Regtheo_mp  = mpRegexakt(x0,b);
      
      RelError_mp = abs(RegSol_mp - Regtheo_mp)/abs(Regtheo_mp);
      RelError_mp *= 100.0;

      /* Konversion mp_real -> double */
      xod      = dble(x0);
      RegSol   = dble(RegSol_mp);
      Regtheo  = dble(Regtheo_mp);
      RelError = dble(RelError_mp);
      
      cout <<  x0 << Regtheo_mp << RegSol_mp << RelError_mp << endl;
(ostream&) out << xod << '\t' << Regtheo << '\t' << RegSol << '\t' << RelError << endl;
    }

  }

  return 0;
}
コード例 #11
0
ファイル: calculator.cpp プロジェクト: flesniak/pi
void calculator::run()
{
abort = false;
if( (mprec == 0) | (mpar == 0) )
    return;
qDebug() << "Parameter" << mpar << "Precision" << mprec << "Mode" << mmode;

mp::mp_init(mprec+2);
mp::mpsetprec(mprec);
mp::mpsetoutputprec(mprec);

time.start();

switch( mmode ) {
    case montecarlo : {
                      mpar = pow(10, mpar);
                      quint64 walk = mpar/1000;
                      quint64 hits = 0;
                      double x,y;
                      if( walk == 0 ) walk = 1;
                      for(quint64 current=1;current<=mpar;current++) {
                          x=genrand_real3();
                          y=genrand_real3();
                          if( x*x+y*y <= 1 )
                              hits++;
                          if( current % walk == 0 )
                              emit update(1000*current/mpar);
                          if( abort )
                              break;
                      }
                      mp_real pi = mp_real(hits)/mp_real(mpar)*4;
                      mresult = QString::fromStdString(pi.to_string());
                      break;
                      }
    case montemin1 : {
                      mpar = pow(10, mpar)-1;
                      quint64 walk = mpar/1000;
                      quint64 hits = 0;
                      double x,y;
                      if( walk == 0 ) walk = 1;
                      for(quint64 current=1;current<=mpar;current++) {
                          x=genrand_real3();
                          y=genrand_real3();
                          if( x*x+y*y <= 1 )
                              hits++;
                          if( current % walk == 0 )
                              emit update(1000*current/mpar);
                          if( abort )
                              break;
                      }
                      mp_real pi = mp_real(hits)/mp_real(mpar)*4;
                      mresult = QString::fromStdString(pi.to_string());
                      break;
                      }
    case subdivide : {
                     mp_real x, a;
                     mpar = pow(10, mpar);
                     quint64 walk = mpar/1000;
                     quint64 current = 0;
                     a=0;
                     mp_real real_par(mpar);
                     x=1/(real_par*0.5);
                     while( x < 1 ) {
                         current++;
                         a+=1*sqrt(1-(x*x))/real_par;
                         x+=(1/real_par);
                         if( current % walk == 0)
                             emit update(current/walk);
                         if( abort )
                             break;
                         }
                     mp_real pi = a*4;
                     mresult = QString::fromStdString(pi.to_string());
                     break;
                     }
    case grid : {
                quint64 res = pow(10, mpar);
                quint32 walk = res/1000+1;
                quint64 hits = 0;
                quint64 x = 0, y = res;
                while( y > 0 )
                {
                    while( x*x+y*y <= res )
                        x++;
                    hits += x;
                    if( y % walk == 0 ) emit update((res-y)/(walk+1));
                    y--;
                    if( abort )
                        break;
                }
                mp_real pi = mp_real(hits)/mp_real(res)*4;
                mresult = QString::fromStdString(pi.to_string());
                break;
                }
    case bbp : {
                mp_real pi;
                for(quint32 step=0;step<=mpar;step++) {
                    pi += ((mp_real(4)/mp_real(8*step+1))-(mp_real(2)/mp_real(8*step+4))-(mp_real(1)/mp_real(8*step+5))-(mp_real(1)/mp_real(8*step+6)))/(pow(mp_real(16),(int)step));
                    emit update(1000*step/mpar);
                    if( abort )
                        break;
                    }
                mresult = QString::fromStdString(pi.to_string());
                break;
                }
    case chudnovsky : {
                mp_real temp;
                for(quint32 step=0;step<=mpar;step++) {
                    mp_real upper = fak(6*step)*(13591409+545140134*mp_real(step))*pow(-1,step);
                    mp_real lower = pow(640320,mp_real(3*step)+1.5)*(fak(3*step)*pow(fak(step),3)+0.0);
                    temp += upper/lower;
                    emit update(1000*step/mpar);
                    if( abort )
                        break;
                    }
                mp_real pi = mp_real(1)/(temp*12);
                mresult = QString::fromStdString(pi.to_string());
                break;
                }
    case polygon : {
                mp_real pi_min = mp_real(mpar)/2*sin(2*mp_real::_pi/mp_real(mpar));
                mp_real pi_max = mp_real(mpar)*tan(mp_real::_pi/mp_real(mpar));
                mp_real pi_mid = (pi_min+pi_max)/2;
                mresult = QString::fromStdString(pi_min.to_string())+" < Pi < "+QString::fromStdString(pi_max.to_string()) +"\nPi = "+QString::fromStdString(pi_mid.to_string());
                break;
                }
}

duration = time.elapsed();



mp::mp_finalize();
}
コード例 #12
0
int main(int argc, char **argv)
{
	unsigned digits;
	double start, end;
	extern char *optarg;
	extern int optind;
	int arg;
	WhichAlg alg = AlgSeries;
	const char *method = "Series";
	bool needConsts = false;
	
	if (argc < 2) {
		usage(argv);
	}
	while ((arg = getopt(argc, argv, "lrh")) != -1) {
		switch (arg) {
			case 'l':
				alg = AlgLimit;
				method = "Limit";
				needConsts = 1;		// need to precalculate pi, etc.
				break;
			case 'r':
				alg = AlgNewton;
				method = "Newton-Raphson";
				needConsts = 1;		// need to precalculate pi, etc.
				break;
			default:
				usage(argv);
		}
	}
	if (optind != (argc - 1)) {
		usage(argv);
	}
	
	digits = atoi(argv[optind]);
	if (digits == 0) {
		usage(argv);
	}
	
	printf("Calculating e to %d digits using %s...", digits, method);
	fflush(stdout);
	
	start = currentTime();
	
	// Note the series algorithm does not need consts like pi precalculated
	mp::mp_init(digits + 2, needConsts);
	mp::mpsetoutputprec(digits);
	
	mp_real e;
    mp_real eps = pow(mp_real(10.0), -((int)digits));
	
	switch(alg) {
		case AlgLimit:
			eViaLimit(eps, e);
			break;
		case AlgSeries:
			eViaSeries(eps, e);
			break;
		case AlgNewton:
			eViaNewtonRaphson(eps, e);
			break;
	}
	
	end = currentTime();
	
	std::cout << "\ne = " << e << "\n";
	std::cout << "Algorithm          : " << method << "\n";
	std::cout << "total elapsed time : " << (end - start) << " seconds\n";
	return 0;
}
コード例 #13
0
int main()
{
   
  cout  << setiosflags(ios::uppercase);
  /*
  ofstream out("GAUSS.out");
  out   << setiosflags(ios::uppercase);
  ofstream dout("GAUSSMOD.out");
  dout  << setiosflags(ios::uppercase);
  */

  mp_init();
  cout << "+++ Precision = " << mpipl << " +++" << endl;
 

  double s_in, h_in , b1_in, b2_in, db, g_in, dpi, x1_in, x2_in;
  int N, Nb, m, Control;

  dpi = 4.0 * atan(1.0);
  
  mp_real pi = mppic; // pi aus der Bibliothek !!!
  mp_real pi2 = pi * pi;
  static mp_real factor;
  
  mp_real b, b1, b2, bstep, g, x0, s, h, x1, x2;

  /* Parameter als doubles einlesen */
  cin >> b1_in >> b2_in >> Nb;
  cin >> g_in >> Control;
  cin >> s_in >> h_in >> N;
  cin >> x1_in >> x2_in >> m;

  /* Konversion: double -> mp_real */
  b1  = mp_real(b1_in);
  b2  = mp_real(b2_in);
  g  = mp_real(g_in);
  s  = mp_real(s_in);
  h  = mp_real(h_in);
  x1 = mp_real(x1_in);
  x2 = mp_real(x2_in);
//  a  = 1/(mp_real(2.0)*b1);

  bstep = (b2 - b1)/mp_real(Nb);


  /* Vorfaktor */
//  factor = mp_real(2.0)*b/power(pi,mp_real(1.5));
//  factor *= exp(mp_real(0.25) * pi2 * b * b);
  
  //dfactor = 2.0 * (b_in/pow(dpi,1.5)) * exp(b_in*b_in*dpi*dpi*.25);

  cout << "*** Parameter ***" << endl; 
  cout << "b1     = " << b1 ;
  cout << "b2     = " << b2 ;
  cout << "bstep  = " << bstep ;
  //cout << "a      = " << a;
  cout << "g      = " << g;
  cout << "h      = " << h;
  cout << "N      = " << N << endl;
  cout << '\v' ;
  cout << "x1     = " << x1;
  cout << "x2     = " << x2;
  cout << "m      = " << m << endl;
  
  cout << "xmax   = " << h * N << endl;
  
//  cout << "dfaktor = " <<dfactor << endl;
//  cout << "Faktor = " <<factor << endl;


  /* Datendatei */

  String data = "GAUSSMOD-N" ;
  data = data + N + "-xb" + x2_in + "-beta" + strdup(fix3(g_in)) + ".out"; 
  ofstream dout(data());
  
  
  
  mp_real mp_E2_Gauss, mp_E2_Gausstheo, mp_Reg, mp_Regtheo, mp_ModGauss, step;
  mp_real mp_diffrel, mp_diffrelreg;
  double E2, E2_Gauss, E2_Gausstheo, Reg, Reg_theod, ModGauss, diffrel, x0d;
  double diffrelreg;
  
  step = (x2 -x1)/mp_real(m);


  if(Control == 1)
    {
	cout << "*** Begin: Read Data ***" << endl; 
      for(int j = 0; j <= m; j++)
	{
	  x0 = x1 + j * step; 
	  mp_E2_Gauss = mpe2gauss(x0,g);
	  mp_E2_Gausstheo = mpe2gausstheo(x0,g);
	  mp_real mpdeltarel = abs(mp_E2_Gauss - mp_E2_Gausstheo)/abs(mp_E2_Gausstheo);
	  mpdeltarel *= mp_real(100.0);
	  
	  x0d = dble(x0);
	  E2 = e2(x0d);
	  E2_Gauss        = dble(mp_E2_Gauss);
	  E2_Gausstheo    = dble(mp_E2_Gausstheo);
	  double deltarel = dble(mpdeltarel);
	  cout << x0 << mp_E2_Gausstheo << mp_E2_Gauss << mpdeltarel << endl;;

	  (ostream&) dout << x0d << '\t' << E2 << '\t' << E2_Gausstheo <<'\t' << E2_Gauss << '\t' << deltarel << endl;
      	}
      cout << "*** End: Read Data ***" << endl; 
    }



  cout << "*** Begin: Regularisation Scan ***" << endl;
  for(int i = 0; i <= Nb; i++)
  {
      b = b1 + i * bstep;
      db = dble(b);
      factor = mp_real(2.0)*b/power(pi,mp_real(1.5));
      factor *= exp(mp_real(0.25) * pi2 * b * b);

      /* RegDatei */
      String reg = "GAUSSREG-N" ;
      reg = reg + N + "-xb" + x2_in + "-beta" + strdup(fix3(g_in)) + "-b" + strdup(fix3(db)) + ".out"; 
      ofstream out(reg());
      
      cout << " +++ i = " << i << ",  " << " b = " << db << " +++ " << endl;
      cout << '\v' ;
      
  for(int jj = 0; jj <= m; jj++)
    {
      x0 = x1 + jj * step;
      s = x0;
      mp_Reg = mptrapez(mpkern,x0,b,g,s,h,N);
      mp_Reg *= factor;
  
      mp_Regtheo  = Regtheo(x0,b,g); //reine Regularisierte
      mp_ModGauss = GaussDichte(x0,g); //Gaussdichte als Modell
      
      
      mp_diffrel = abs(mp_Reg - mp_Regtheo)/abs(mp_Regtheo);
      mp_diffrel *= mp_real(100.0);
      
      mp_diffrelreg  = abs(mp_Reg - mp_ModGauss)/abs(mp_ModGauss);
      mp_diffrelreg *= mp_real(100.0);

      Reg_theod  = dble(mp_Regtheo);
      Reg        = dble(mp_Reg);
      ModGauss   = dble(mp_ModGauss);
      diffrel    = dble(mp_diffrel);
      diffrelreg = dble(mp_diffrelreg);
      x0d        = dble(x0);

      cout << x0 << mp_Reg << mp_Regtheo << mp_ModGauss << mp_diffrel << mp_diffrelreg<< endl;


      (ostream&) out << x0d << '\t' << ModGauss << '\t' << Reg << '\t' << Reg_theod<< '\t' << diffrel <<'\t' << diffrelreg << endl;
      
    }
  }
  cout << "*** End: Regularisation Scan ***" << endl;
  return 0;
}