-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathGaussian_Metropolis.c
43 lines (38 loc) · 996 Bytes
/
Gaussian_Metropolis.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main(void){
int niter=100;
double step_size=0.5e0;
srand((unsigned)time(NULL));
/*********************************/
/* Set the initial configuration */
/*********************************/
double x=0e0;
int naccept=0;
/*************/
/* Main loop */
/*************/
for(int iter=1;iter<niter+1;iter++){
double backup_x=x;
double action_init=0.5e0*x*x;
double dx = (double)rand()/RAND_MAX;
dx=(dx-0.5e0)*step_size*2e0;
x=x+dx;
double action_fin=0.5e0*x*x;
/*******************/
/* Metropolis test */
/*******************/
double metropolis = (double)rand()/RAND_MAX;
if(exp(action_init-action_fin) > metropolis)
/* accept */
naccept=naccept+1;
else
/* reject */
x=backup_x;
/***************/
/* data output */
/***************/
printf("%.10f %f\n",x,(double)naccept/iter);}
}