Professional Documents
Culture Documents
Geant4 Lecture2
Geant4 Lecture2
LECTURE 2
1. Lập trình C++
2. Các bài tập về Monte-Carlo
1
1. Lập trình C++
http://www.cplusplus.com/doc/tutorial/
Viết chương trình và biên dịch trong hệ điều hành Ubuntu
Viết chương trình: chao.cc //baitap0.cc
return 0;
}
2. Các bài tập về Monte-Carlo
6
Bài tập 1: Xây dựng phương trình y(x) = x2 trong khoảng x=[-2;2]
bằng phương pháp Monte-Carlo.
- Viết chương trình c++ và vẽ phổ.
- Kiểm tra kết quả bằng cách fit hàm bậc 2 và đánh giá.
Bài tập 2:
Xây dựng phân bố gaussian chuẩn (standard Gaussian distribution)
sử dụng phương pháp Monte Carlo.
- Viết chương trình C++ và vẽ phổ.
- Kiểm tra kết quả bằng cách fit hàm Gaussian và đánh giá.
Bài tập 3: Tạo phổ gamma dựa vào phổ thực nghiệm bằng Monte-
Carlo. Hệ đo gamma 1024 kênh (MCA-10 bits).
- Viết chương trình C++ và vẽ phổ.
- Khảo sát dạng phổ ở những số đếm khác nhau.
7
Bài tập 1: Xây dựng phương trình y(x) = x2 trong khoảng
x=[-2;2].
- Kiểm tra kết quả bằng cách fit hàm bậc 2 và đánh giá.
8
Phương pháp:
Chọn
đúng x, Y được
Gieo số ngẫu chọn
Tính y(x)=x2 So sánh
nhiên uniform
Y<y?
(x,y)
sai
x=[-2;2] Loại
Y=[0;4]
Loại
Lặp lại
Max Y(x) = 4
Loại
-2 Chọn 2 9
x
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
using namespace std;
int main ()
{
float ran1,ran2;
float x,Y,y;
int i;
ofstream luufile;
luufile.open ("C:/Users/Administrator/Desktop/data.txt");
i=0;
while (i<Nevent)
{
//Gieo so ngau nhien 0 -> 1
ran1=(float)rand()/RAND_MAX; //random 0 -> 1
ran2=(float)rand()/RAND_MAX; //random 0 -> 1
// Gieo x va Y
x=ran1*4-2; //random -2 -> 2
Y=ran2*4; //random 0 -> 4
//tinh y(x) theo x
y=x*x;
if (Y < y ) {
cout<<x<<"\t"<<Y<<"\t"<<y<<endl; // Xuat ra man hinh
luufile<<x<<endl; //Luu vao file data
i=i+1;
}
}
luufile.close();
return 0; 10
}
Bài tập 2:
Xây dựng phân bố gaussian chuẩn (standard Gaussian
distribution) sử dụng phương pháp Monte Carlo.
11
Phương pháp:
Ly thuyet:
Normal (or Gaussian) distribution:
Phuong phap: Monte Carlo
Tính
Gieo số ngẫu nhiên Tính
x1 = sqrt(-2.0*ln(r1))
uniform (r1, r2) gauss = x1* x2
x2 =sin (2.0*Pi*r2)
r1=[0;1]
r2=[0;1]
Lặp lại
12
gauss.cc
#include <iostream>
#include <cmath>
#include <cstdlib> Du lieu xuat ra
#include <ctime>
#include <fstream>
using namespace std;
float r1,r2,x1,x2,gauss;
float Pi=3.141592;
int main ()
{
Vẽ phổ
ofstream luufile;
luufile.open ("data.txt");
counts
srand (time(NULL));
r1=0.;r2=0.;x1=0.;x2=0.;gauss=0.; gauss
}
luufile.close();
return 0;
}
13
Bài tập 3: Tạo phổ gamma dựa vào phổ thực nghiệm bằng Monte-Carlo.
Hệ đo gamma 1024 kênh (MCA-10 bits).
14000
(400;13305) Thời gian đo: 10 phút
12000 Tổng số đếm: 843906
y (Số đếm/kênh)
10000
8000
6000
4000
2000
0
0 200 400 600 800 1000
x (Số kênh)
14
Phương pháp:
- Xác định số đếm có giá trị lớn nhất và vị trí kênh (x, Max_y) – (400;13305).
- Chuẩn giá trị ymax về 1. Các y(x) chuẩn theo ymax (chuẩn về 1). Cụ thể: y(x)/13305.
Chọn
đúng x, Y được
Gieo số ngẫu chọn
So sánh
nhiên uniform
Y<y?
(x,y)
Loại
x=[0;1024] Loại
Y=[0;1]
Lặp lại
15
// Xay dung pho thuc nghiem gamma su dung phuong phap Monte - Carlo /* initialize random seed: */
// Lecturer: V.H.Hai srand (time(NULL));
#include <iostream> ////////////////////////////
#include <cmath>
#include <cstdlib> i=0;
#include <ctime> while (i<Nevent)
#include <fstream> {
using namespace std; //Gieo so ngau nhien 0 -> 1
#define Nevent 843906 ran1=(float)rand()/RAND_MAX; //random
#define y_max 13305 0 -> 1
int main () ran2=(float)rand()/RAND_MAX; //random
{ 0 -> 1
float ran1,ran2, Y; // Gieo x va Y
int x; x=int(ran1*1023); //random 0 ->1024
float y[1024];
int i; Y=ran2; //random 0 -> 1
16
y (Số đếm/kênh)
y (Số đếm/kênh)
Monte-Carlo
Kết quả mô phỏng
Monte-Carlo
Số đếm: 84396
Thời gian: 1 phút
y (Số đếm/kênh)