Chúng tôi đã xây dựng được chương trình mô phỏng mô hình XY – mô hình spin có định hướng liên tục trong mặt phẳng xy của lưới mạng với thuật toán Heat
bath (buồng nhiệt) trong trường hợp 2 chiều (Xem phụ lục A2: Chương trình XY
2D). Trong phần này kết quả mô phỏng sơ khảo với lưới 8x8 chỉ cho 1100 bước
nâng cấp cấu hình. Các đại lượng Vật lý được khảo sát là năng lượng và độ từ hóa.
0 200 400 600 800 1 000 1 200 0 1 0.2 0.4 0.6 0.8 0.1 0.3 0.5 0.7 0.9 Update sweeps M a g n e ti z a ti o n D e n s it y Beta = 0.5 Beta = 0.8 Beta = 1.0 Beta = 1.1 Beta = 1.2 Beta = 10.0
Hình 3.8. Sự phụ thuộc của mật độ độ từ hóa theo các bước nâng cấp cấu hình
Kết quả trong hình 3.8 và hình 3.9 cho thấy có vùng xung quanh giá trị Beta bằng 1.1 có sự chuyển pha. Các nghiên cứu trước đây cho thấy chuyển pha này không phải là chuyển pha loại một với sự thay đổi đột ngột của độ từ hóa mà là
chuyển pha BKT (Berezinskii-Kosterlitz-Thouless phase transition) với sự thay đổi
liên tục của độ từ hóa và năng lượng. Chuyển pha BKT là chuyển pha từ vùng nhiệt độ thấp với các domain có spin định hướng cùng chiều và sự xuất hiện các cặp xoáy (vortex-antivortex pairs) sang vùng nhiệt độ cao có spin định hướng hỗn loạn. Tại nhiệt độ tới hạn có phá vỡ các cặp xoáy toàn cục và hình thành các xoáy độc lập địa phương.
28 0 200 400 600 800 1 000 1 200 0 1 0.2 0.4 0.6 0.8 1.2 1.4 1.6 Update sweeps E n e rg y D e n s it y Beta = 0.5 Beta = 0.8 Beta = 1.0 Beta = 1.1 Beta = 1.2 Beta = 10.0
Hình 3.9. Sự phụ thuộc của mật độ năng lượng theo các bước nâng cấp cấu hình
Cắt bỏ 100 bước nâng cấp đầu tiên, tiến hành xử lý số liệu thô sơ với 100 cấu hình được ghi lại của 1000 bước nâng cấp tiếp theo (1 cấu hình/ 10 bước nâng cấp), chúng tôi thu được kết quả sự phụ thuộc của mật độ năng lượng và độ từ hóa như
29 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 0 1 0.2 0.4 0.6 0.8 0.1 0.3 0.5 0.7 0.9 1/Beta M a g n e ti z a ti o n D e n s it y
Hình 3.10. Sự phụ thuộc của độ từ hóa theo nhiệt độ
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 0 1 0.2 0.4 0.6 0.8 1.2 1.4 1/Beta E n e rg y D e n s it y
Hình 3.11. Sự phụ thuộc của mật độ năng lượng theo nhiệt độ
Hình 3.10 và 3.11 cho thấy rõ ràng sự chuyển pha là liên tục với năng lượng và độ từ hóa. Những kết quả trình bày trong phần mô hình XY này là những kết quả
30
sơ khảo. Những kết quả này phù hợp với các nghiên cứu đã được thực hiện[9].
Hướng nghiên cứu tiếp theo của chúng tôi với mô hình XY sẽ tập trung vào các đại lượng/ tham số tới hạn đặc trưng cho chuyển pha BKT, hiện tượng chuyển pha xuất hiện trong nhiều hệ 2 chiều trong Vật lý chất rắn như mảng Josepson junction, màng mỏng siêu dẫn mất trật tự,... Các hệ này đều có thể được mô hình hóa bằng XY model vì thế nghiên cứu mô phỏng sẽ góp phần quan trọng trong việc thúc đẩy các nghiên cứu lý thuyết và thực nghiệm.
31
KẾT LUẬN
Trong luận văn này chúng tôi đã thu được những kết quả như sau:
Đã xây dựng thành công các chương trình mô phỏng Ising 2D sử dụng ngôn
ngữ Scilab với thuật toán Heat bath và Metropolis.
Kết quả tính toán điểm chuyển pha trật tự-hỗn loạn phù hợp với tính toán lý
thuyết của Lars Onsager vớic ln1 20.88137.
Kết quả tính toán sự cố hữu – xác suất để một spin không đổi dấu của nó
sau khoảng thời gian t sau khi hệ spin nguội từ nhiệt độ cao – là
t ~ t P
với θ = 0.2106(2), phù hợp tốt với kết quả thực nghiệm θthực nghiệm = 0.19(3).
Đã xây dựng được chương trình mô phỏng mô hình XY phục vụ các nghiên
32
TÀI LIỆU THAM KHẢO
Tiếng việt
1. Nguyễn Quang Báu, Bùi Đằng Đoàn, Nguyễn Văn Hùng, (2004), Vật lý
thống kê, Nhà xuất bản Đại học Quốc Gia Hà Nội.
2. Nguyễn Xuân Hãn, (1998), Cơ học lượng tử, Nhà xuất bản Đại học Quốc
Gia Hà Nội.
3. Lê Văn Trực, Nguyễn Văn Thỏa, (2005), Phương pháp toán cho vật lý, Nhà
xuất bản Đại học Quốc Gia Hà Nội.
Tiếng anh
4. B. Yurke et. al, Experimental measurement of the persistence exponent of the
planar Ising model, Physical Eeview E 56(1) R40 –R42, 1997
5. Barry M. McCoy and Tai Tsun Wu, The Two-Dimensional Ising Model,
Harvard University Press 1973
6. Kerson_Huang, Statistical_Mechanics (2nd Edition ), John Wiley & Sons
1987
7. Kurt Binder, Dieter W. Heermann, Monte Carlo Simulation in Statistical
Physics: An Introduction (Fifth Edition), Springer 2010
8. Lars Onsager, Crystal Statistics. I. A Two-Dimensional Model with an
Order-Disorder Transition, Phys. Rev. 65, 117 (1944)
9. Newman, Barkema, Monte Carlo methods in Statistical Physics, Oxford
University Press 1999
10. Peter Olsson, Monte Carlo analysis of the two-dimensional XY model. II
Comparison with the Kosterlitz renormalization-group equations, Phys. Rev.
B 52, 4526 - 4535 (1995)
11. R. J. Baxter, Exactly Solved Models in Statistical Mechanics, Academic
33
PHỤ LỤC
Phụ lục A. Các chương trình chính sử dụng trong luận văn
A1. Chương trình Ising 2D
function Ising2D() gstacksize("max") global s NX=64 NY=64 N_MEASURE=10
printf(" Beta (value 0: beta_c = log(1+sqrt(2))) : "); Beta = mscanf("%lg");
if (Beta == [])
Beta = log(1+sqrt(2.0)); end
printf(" Number of update sweeps : "); n_loops = mscanf("%d");
printf(" Random number seed : "); seed = mscanf("%ld");
if (seed == [])
seed = getdate("s"); end
grand("setsd",seed)
printf(" Name output file : "); fname = mscanf("%s"); fd=mopen(fname,'w')
grand(2013,2013,"def");
34
printf(" Heat bath update, %d updates/measurement, %d updates\n", N_MEASURE, n_loops);
printf(" Random seed %ld\n", seed );
for (i=1:NX) j = i-1; xup(i) = mod((j+1),NX) + 1; xdn(i) = mod((j-1+NX),NX) + 1; end for (i=1:NY) j = i-1; yup(i) = mod((j+1),NY) + 1; ydn(i) = mod((j-1+NY),NY) + 1; end for (x=1:NX) for (y=1:NY) s(x,y) = 1; end end for (i=1:n_loops) update();
if (mod(i,N_MEASURE) == 0) measure(i); end end mclose(fd) endfunction function update() global s for (x=1:NX) for (y=1:NY)
35
Sum = s(xup(x),y) + s(xdn(x),y) + s(x,yup(y)) + s(x,ydn(y));
p_plus = exp( (Beta/2.0) * Sum ); p_minus = 1.0/p_plus; p_plus = p_plus/(p_plus + p_minus);
if (grand(1,1,"def") < p_plus) then s(x,y) = 1; else s(x,y) = -1; end end end endfunction function measure(iter) global s e = 0; m = 0; for (x=1:NX) for (y=1:NY)
e = e + 2 - s(x,y) * ( s(xup(x),y) + s(x,yup(y)) ); m = m + s(x,y); end end mfprintf(fd,"%d %d %d\n", iter, e, m); endfunction function f=mod(a, b) f = a-b.*floor(a./b) endfunction A2. Chương trình XY 2D
36
function XY2D() gstacksize("min") global alpha Beta NX=8
NY=8
N_MEASURE=10
printf(" Beta : "); Beta = mscanf("%lg");
printf(" Number of update sweeps : "); n_loops = mscanf("%d");
printf(" Random number seed : "); seed = mscanf("%ld");
if (seed == [])
seed = getdate("s"); end
grand("setsd",seed)
printf(" Name output file : "); fname = mscanf("%s"); fd=mopen(fname,'w')
grand(2013,2013,"def");
printf(" XY model, %d x %d lattice, Beta %g ...\n",NX,NY,Beta);
printf(" Heat bath update, %d updates/measurement, %d updates\n", N_MEASURE, n_loops);
printf(" Random seed %ld\n", seed );
for (i=1:NX) j = i-1;
xup(i) = mod((j+1),NX) + 1; xdn(i) = mod((j-1+NX),NX) + 1; end
37 for (i=1:NY) j = i-1; yup(i) = mod((j+1),NY) + 1; ydn(i) = mod((j-1+NY),NY) + 1; end for (x=1:NX) for (y=1:NY) // alpha(x,y) = grand(1,1,"unf",-%pi,%pi); alpha(x,y) = %pi/2.0; end end measure(0) for (i=1:n_loops) update();
if (mod(i,N_MEASURE) == 0) measure(i); end end
mclose(fd) endfunction
function update() global alpha Beta TMP = []; for (x=1:NX) for (y=1:NY)
NS = [alpha(xup(x),y), alpha(xdn(x),y), alpha(x,yup(y)), alpha(x,ydn(y))]; AS = atan( sum(sin(NS)), sum(cos(NS)) ); // Angle of the sum vector S = Beta*sqrt( sum(sin(NS))^2 + sum(cos(NS))^2 );
yr = grand(1,1,"def");
38
a = AS - acos(xr);
alpha(x,y) = a*bool2s(a>=-%pi & a<%pi) + (a+2*%pi)*bool2s(a<-%pi) + (a- 2*%pi)*bool2s(a>%pi);
end end endfunction
function measure(iter) global alpha Beta e = 0; mx = 0; my = 0; for (x=1:NX)
for (y=1:NY)
NS = [alpha(xup(x),y), alpha(xdn(x),y), alpha(x,yup(y)), alpha(x,ydn(y))]; e = e + 2 - sum( sin(alpha(x,y))*sin(NS) + cos(alpha(x,y))*cos(NS) )/2; mx = mx + cos(alpha(x,y)); my = my + sin(alpha(x,y)); end end m = sqrt(mx^2 + my^2)/(NX*NY); e = e/(NX*NY); mfprintf(fd,"%d %f %f\n", iter, e, m); endfunction function f=mod(a, b) f = a-b.*floor(a./b) endfunction
39
Phụ lục B. Phần mềm Scilab
I.Giới thiệu về Scilab
1.1. Giới thiệu chung về Scilab
Scilab được sử dụng đơn giản trên bàn phím, nó được sử dụng như ngôn ngữ lập trình để kiểm tra các thuật toán hoặc thực hiện các tính toán số. Nó có khoảng 2000 lệnh khác nhau, tuy nhiên cú pháp lệnh đơn giản. Ngôn ngữ biểu diễn chủ yếu dưới dạng ma trận là dữ liệu chính và được biểu diễn nhiều dạng từ đơn giản đến phức tạp. Chương trình Scilab được biết đến tương đương với C, C++, Java, ngôn ngữ của nó tương tự Matlab với các điểm cơ bản như sau:
- Ngôn ngữ lập trình kết hợp các phép toán số học trên nhiều lĩnh vực khoa học.
- Scilab thuộc loại ngôn ngữ thông dịch.
- Có khả nằng xử lí các lớp bài toán : Số học tuyến tính,ma trận thưa ; Các hàm đa thức, hữu tỉ ; Xử lí đồ thị 2D,3D ; Giải các pt vi phân ,đại số … - Phương thức tương tác với Scilab : Console , Editor , Sử dụng hàm exec, Xử lí theo lô: Apropos logarithm
- Các loại biến trong Scilab : biến thực , biến phức , biến xâu , biến Boolean , ma trận . Với mỗi kiểu biến có một số toán tử tương ứng .Tên biến độ dài tùy ý nhưng chỉ xét 24 kí tự đầu . Mã ASCII : a-z ,A-Z,0-9, % _ # ? ! $ .. có phân biệt chữ hoa và thường
- Một số hàm toán học cơ bản : sin(x) , asin(x) , cos(x) , acos(x) , tan(x) … 1.2. Download và cài đặt
Truy cập vào trang chủ: http://www.scilab.org/, click vào Download Scilab
bạn sẽ download được file scilab-5.x.x.exe, cài đặt như các phần mềm khác.
Sau khi cài đặt, Shoutcut để chạy phần mềm sẽ xuất hiện trên Desktop, bạn click để chạy phần mềm. Cửa sổ lệnh của phần mềm sẽ như hình dưới, tại dấu nhắc “-->” bạn có thể gõ câu lệnh và nhấn Enter để yêu cầu phần mềm thực hiện câu lệnh. Bạn có thể click vào dấu “ ? “ trên menu để vào Scilab Help. Trong đó sẽ liệt kê các chủ đề của Scilab và hướng dẫn của từng chủ đề. Bạn có thể click vào biểu tượng hình kính lúp để tìm kiếm vấn đề cụ thể mình quan tâm (bằng tiếng Anh), ví dụ: matrix.
40
1.3. Làm quen với scilab
Không gian làm việc hữu dụng trong Scilab bao gồm các cửa sổ sau: - Giao diện điều khiển để thực hiện các phép tính
-Trình soạn thảo để lập trình -Các cửa sổ đồ họa để hiển thị -Trợ giúp tích hợp
Môi trường chung và giao diện điều khiển
Sau khi nhấp đúp chuột vào biểu tượng để khởi động Scilab, môi trường Scilab mặc định sẽ bao gồm các cửa sổ kiểu thanh dock như sau – giao diện điều khiển, các trình duyệt file và biến số, lịch sử đặt lệnh
II. Sử dụng Scilab
2.1. Các vòng lặp đơn giản Gia lượng
Toán tử “:” cho phép xác định các vecto của các chữ số có tọa độ theo thứ tự số học. Ta đưa ra: << beginning value: step: ending value>>. Giá trị cuối “ending value” có thể sẽ không đạt được. Nếu bước trên không được đề cập, thì giá trị mặc định sẽ là 1.
Ví dụ, để xác định một vecto hàng của các số nguyên tăng theo cấp 1 từ 3 đến 10: -->3:1 0
41
3. 4. 5. 6. 7. 8. 9. 10.
Hoặc tăng theo cấp 2 từ 1 đến 10: -->1 :2:1 0
ans =
1 . 3. 5. 7. 9. For
Cấu trúc vòng lặp dễ nhất đối với một chữ số lặp đi lặp lại cố định được soạn bằng for … end.
Ví dụ: Tính 20 số hạng của một chuỗi được xác định bằng phép truy toán
Soạn thảo u(1 )=4; for n=1 :20 u(n+1 )= u(n)+2*n+3; disp([n,u(n)]) end Kết quả 1. 4. 2. 9 ……. While
Để dừng một vòng lặp khi đã đạt được mục tiêu để ra, ta sử dụng while … end Vào năm 2005 tôi dự tính trồng một cây thông Noel cao 1 ,20m. Mỗi năm cây thông này lại cao thêm được 30cm. Tôi quyết định sẽ chặt cây khi cây cao hơn 7m. Vậy tôi sẽ chặt cây vào năm nào?
h=1 .2; y=2005; while h<7
42
h=h+0.3; y=y+1 ; end
disp( I will cut the.. tree in “+string(y))
2.2. Tính toán trên trường số thực
Các phép toán trên trường số thực là: cộng (+), trừ (-), nhân (*), chia (/), lũy thừa (^)
Các hàm thông dụng: (%pi biểu diễn số pi ; %e biểu diễn số e) VD: -->7/3.5↵ (ghi số thập phân: 3.5 )
VD: Tính a = (4^5 – 1/6)( )
-->a=(4^5-1/6)*(%e^(1/3)+%pi); ↵
Ghi chú: Nếu thêm dấu “ ; “ vào cuối câu lệnh thì sẽ không hiển thị kết quả ra màn hình.
VD: Tính
-->log(4)/log(3) (log = ln, ở đây ta đã dùng công thức đổi cơ số) VD: Tính arcsin của 1/2
-->asin(1/2)
Ghi chú: đơn vị là rad; nếu cần phải tính sin(27o) ta đổi độ sang radian
VD: Cho f(x) = (sin(x) + x2)/(ex + 1), tính f(x ) -->(sin(%pi/6)+(%pi/6)^2)/(exp(%pi/6)+1)
Người dùng có thể quay lại bất kỳ lúc nào bằng các phím mũi tên trên bàn phím ← ↑ → ↓ hoặc bằng chuột. Các phím trái và phải được sử dụng để thay đổi phần chỉ lệnh còn các phím lên và xuống được sử dụng để quay về một dòng lệnh được thực hiện trước đó.
Có thể dùng phím tab →│ trên bàn phím để hoàn tất tên của một hàm hay một biến số bằng cách nhập một số chữ cái đầu tiên.
Ví dụ, sau khi nhập vào giao diện điều khiển lệnh: -->fact
43
Và nhấn phím tab, một cửa sổ hiển thị tất cả các tên hàm và biến số bắt đầu bằng fact, chẳnghạn như factorial và factor sẽ hiện ra. Chỉ cần nhấp đúp chuột vào hàm cần dùng hoặc chọnhàm đó bằng chuột hoặc bằng các phím ↑ ↓ và nhấn Enter (Windows và Linux) hoặc Return (Mac OS X) để chèn hàm vào dòng lệnh.
Hàm disp để hiển thị một chuỗi (thường là một mệnh đề), đặt chuỗi đó trong dấu ngoặc:
Disp (2)
2.3. Ma trận và định thức 1. Khai báo biến ma trận
VD: Khai báo ma trận cỡ 1x3 (vec tơ dòng): -->a=[1,2,4]↵
VD: Khai báo ma trận cỡ 3x3: -->b=[11,4,3;4,9,6;20,8,9]; ↵
Ghi chú: Mỗi dòng của ma trận cách nhau bởi dấu ”;” mỗi phần tử của dòng cách nhau bởi dấu “,”
2. Các phép toán trên ma trận
Phần mềm đang nhớ các biến a và b được khai báo ở 2 câu lệnh trên, ta khai báo thêm biến c:
-->c=[0,-2,3.5;4,5,8;17,8,-9.2] ↵
Ta có thể thực hiện các phép toán cộng (+), trừ (-), nhân (*), lũy thừa (^) VD: Cộng
-->b+c ↵ hoặc -->d=b+c ↵
(ở đây ta đã tạo thêm biến d = b+c ) VD: -->b*c; -->b^2; -->5*b
3. Ma trận chuyển vị VD: -->b’↵
VD: -->[1,2,3;3,5,5]’↵
(thêm dấu “ ‘ “ ở cuối ma trận) 4. Tìm hạng của ma trận VD: -->rank(b)
44
5. Tìm ma trận nghịch đảo VD: -->inv(b) ↵
6. Tính định thức (của ma trận vuông) VD: -->det(b) ↵
2.4. Giải hệ phương trình tuyến tính
Scilab giải hệ phương trình tuyến tính dạng: A*x+b=0 (nên ta phải biến đổi hệ về dạng này).
2.5. Vẽ đồ thị
2.5.1. Hàm 1 biến (2D)
VD: Vẽ đồ thị hàm số: y = x^2 + 1 trên đoạn [-10; 10]
Cách 1. Thực hiện như sau: -->x=[-10:10] ↵
-->plot(x^2+1) ↵ hoặc -->plot2d(x^2+1) ↵
Phần mềm sẽ xuất ra đồ thị (trên 1 cửa sổ khác – Graphic window) như hình dưới (bạn có thể vào File -> Copy to clipboard và paste vào word)
Ghi chú: Số 0.1 là bước nhảy của biến x, bạn thử vẽ cho 2 trường hợp x=[-1:1] và x=[-1:0.1:1] để hiểu ý nghĩa của tham số này (trường hợp không có bước nhảy, bước nhảy ngầm định là 1).
45
-->deff('[y]=ham(x)',['y=x^2+1']); -->x=(-10:0.1:10);
-->fplot2d(x,ham)
Ghi chú: Các câu lệnh trong cách 2 phức tạp hơn cách 1 nhưng cho phép vẽ được cả dạng hàm kiểu: x^x.
(Tham khảo 2.2 khi cần vẽ các hàm phức tạp).
2.5.2. Hàm 2 biến (3D) VD: Vẽ đồ thị hàm z=sin(x)*y với x ∈ [0; 2π], y ∈ [0; 5] -->x=[0:%pi/16:2*%pi]'↵ (có dấu “ ‘ “ để chuyển vị x thành cột) -->y=[0:0.5:5]; ↵ -->z=sin(x)*y;↵ -->plot3d(x, y, z) ↵
Ghi chú: Trong cửa sổ Graphic, bạn vào Edit ---> Axes properties để ghi chú cho hình.
2.5.3. Biểu đồ dạng cột
46 x=[1 :1 0]; n=[8,6,1, 3,1,0,6,4,1 6]; clf; bar(x,n) Đồ thị có dạng 2.6. Tích phân 2.6.1. Tích phân hàm 1 biến (1 lớp) VD: Tính tích phân một lớp y=x.ex -->function y=f(x),y=x*(%e^x),endfunction↵ -->I=intg(9,10,f) ↵
(dòng trên là khai báo hàm số f(x), dòng dưới tính tích phân với cận từ 9 -> 10) Ghi chú: Tham khảo Chủ đề 1 khi phải làm việc với các hàm phức tạp.
2.6.2. Tích phân mặt (2 lớp)
VD: Tính tích phân 2 lớp của hàm z = cos(x+y) trên miền [0 1]x[0 1] -->X=[0,0;1,1;1,0]; -->Y=[0,0;0,1;1,1]; -->deff('z=f(x,y)','z=cos(x+y)') -->[I,err]=int2d(X,Y,f) err = 3.569D-11
47
I =
0.4967514
Ghi chú: Miền lấy tích phân ñược chia thành 2 tam giác. Biến X lưu hoành độ các đỉnh của 2 tam giác (tam giác thứ nhất là: 0; 1 ; 1 – tô đậm) ; biến Y lưu tung độ của 2 tam giác. Như vậy, để tính tích phân mặt, bạn phải chia miền lấy tích phân thành các tam giác.
err là sai số: err = 3.569D-11 ~ 3.569*10-11~ 0. 2.7. Đạo hàm
2.7.1. Đạo hàm của hàm (giá trị thực) 1 biến số
VD: Tính đạo hàm của hàm số y = x^3 + 1 tại x = 2