Monte Carlo sampling
Metropolis algorithm
with
$\hspace{10ex} \displaystyle f(x,y)\ =\ \left\{ \begin{array}{ccl} 1 && \mbox{inside}\\ 0 && \mbox{outside} \end{array} \right. $
/** Evaluating \pi with simple Monte Carlo evaluation.
*/
public class MonteCarlo {
static final double x0 = 0.0, x1 = 1.0; // x-bounds
static final double y0 = 0.0, y1 = 1.0; // y-bounds
public static void main(String[] args) {
int N = 1000000; // number of draws
int deltaN = N/10; // printout intervals
double x, y, sum = 0;
// --- loop over all random evaluations
for (int i=0; i<N; i++)
{
x = Math.random(); // random draws
y = Math.random();
sum += MonteCarlo.myFunction(x,y);
if ((i+1)%deltaN==0)
System.out.printf("%8d %8.4f\n",i+1,4.0*sum/(i+1.0));
} // end of loop over all Monte Carlo draws
} // end of MonteCarlo.main()
/** The function to be evaluated.
* Here the circle.
*/
public static double myFunction(double x, double y) {
if ( (x<MonteCarlo.x0)||(x>MonteCarlo.x1)||
(y<MonteCarlo.y0)||(y>MonteCarlo.y1) )
{
System.out.println("x or y value out of range");
return 0.0;
}
if (y*y<=1.0-x*x) // x*x+y*y=1 is the circle equation
return 1.0;
else
return 0.0;
} // end of MonteCarlo.myFunction()
} // end of class MonteCarlo
statistics
data binning
law of large numbers
/** Evaluating \pi with simple Monte Carlo evaluation,
* calculating variance and standard deviation (error).
* On input: number of measurements N.
*/
public class MonteCarloVariance {
static final double x0 = 0.0, x1 = 1.0; // x-bounds
static final double y0 = 0.0, y1 = 1.0; // y-bounds
public static void main(String[] args) {
// --- determine the number of draws from input
int N = 0;
if (args.length==1)
N = Integer.parseInt(args[0]);
else
{
System.out.println("Wrong number of input parameters");
return;
}
// --- other parameters and variables
int K = 20; // number of bins
int nK = N/K; // number of data per bin
double[] data = new double[N]; // storing all measurements
double[] meanBin = new double[K]; // means of bins
double mean = 0.0, sigma = 0.0; // result: mean and error
double x, y; // variables
// --- loop over all random evaluations
for (int i=0; i<N; i++)
{
x = Math.random(); // random draws
y = Math.random();
data[i] = MonteCarloVariance.myFunction(x,y); // storing measurement
} // end of loop over all Monte Carlo draws
// --- evaluate the overall mean and the mean of the bins
for (int i=0; i<N; i++)
mean += data[i];
mean = mean/N;
for (int k=0; k<K; k++)
{
meanBin[k] = 0.0;
for (int n=0; n<nK; n++) // nK data points in each bin
meanBin[k] += data[k*nK+n];
meanBin[k] = meanBin[k]/nK;
} // end of loop over all bins
// --- evaluate the error: variance of means of bins
for (int k=0; k<K; k++)
sigma += (meanBin[k]-mean)*(meanBin[k]-mean);
sigma = Math.sqrt(sigma/K);
// --- printout of result
System.out.printf(" number of measurements : %d\n",N);
System.out.printf(" number of bins : %d\n",K);
System.out.printf(" data points per bin : %d\n",nK);
System.out.printf(" estimate for pi : %8.4f\n",4.0*mean);
System.out.printf(" estimate for accuracy : %8.4f\n",4.0*sigma);
} // end of MonteCarloVariance.main()
/** The function to be evaluated.
* Here the circle.
*/
public static double myFunction(double x, double y) {
if ( (x<MonteCarloVariance.x0)||(x>MonteCarloVariance.x1)||
(y<MonteCarloVariance.y0)||(y>MonteCarloVariance.y1) )
{
System.out.println("x or y value out of range");
return 0.0;
}
if (y*y<=1.0-x*x)
return 1.0;
else
return 0.0;
} // end of MonteCarloVariance.myFunction()
} // end of class MonteCarloVariance
importance sampling
transition rules
detailed balance
/** Evaluating y_{n+1}/y_n, with y_n = \int_0^1 x^n/(a+x) dx
* with Monte Carlo (Metropolis) algorithm.
* On input: number of Monte Carlo steps N.
*/
public class Metropolis {
static final double aPar = 10.0; // parameter
static final double nPow = 3.0; // power
public static void main(String[] args) {
// --- determine the number of draws from input
int N = 0;
if (args.length==1)
N = Integer.parseInt(args[0]);
else
{
System.out.println("Wrong number of input parameters");
return;
}
// --- other parameters and variables
int K = 20; // number of bins
int nK = N/K; // number of data per bin
double[] data = new double[N]; // storing all measurements
double[] meanBin = new double[nK]; // means of bins
double mean = 0.0, sigma = 0.0; // result: mean and error
double x = Math.random(); // random starting value
double y, ratio; // variables
data[0] = x; // first measurment
// --- loop over all Monte Carlo steps
for (int i=1; i<N; i++)
{
y = Math.random(); // random candiate
ratio = Metropolis.myDensity(y)/Metropolis.myDensity(x);
if (ratio>Math.random())
x = y; // accept candidate
data[i] = x; // storing measurement
} // end of loop over all Monte Carlo draws
// --- evaluate the overall mean and the mean of the bins
for (int i=0; i<N; i++)
mean += data[i];
mean = mean/N;
for (int k=0; k<K; k++)
{
meanBin[k] = 0.0;
for (int n=0; n<nK; n++) // nK data points in each bin
meanBin[k] += data[k*nK+n];
meanBin[k] = meanBin[k]/nK;
} // end of loop over all bins
// --- evaluate the error: variance of means of bins
for (int k=0; k<K; k++)
sigma += (meanBin[k]-mean)*(meanBin[k]-mean);
sigma = Math.sqrt(sigma/K);
// --- printout of result
System.out.printf(" a in y^n/(x+a) : %8.4f\n",aPar);
System.out.printf(" n in y^n/(x+a) : %8.4f\n",nPow);
System.out.printf(" number of measurements : %d\n",N);
System.out.printf(" number of bins : %d\n",K);
System.out.printf(" data points per bin : %d\n",nK);
System.out.printf(" y_{n+1}/y_n estimate : %8.4f\n",mean);
System.out.printf(" estimate for accuracy : %8.4f\n",sigma);
System.out.printf("\n");
System.out.printf(" ratio y_4/y_3 (exact) : %8.4f\n",0.797490089);
} // end of Metropolis.main()
/** The proability density.
*/
public static double myDensity(double x) {
return Math.pow(x,nPow)/(x+aPar);
} // end of Metropolis.myDensity()
} // end of class Metropolis