Professional Documents
Culture Documents
Panel
Tag:
NumDim
String: 1
2
3
FontSize: 10
Tag:
NmbrFois
9) Baøi toaùn: Moâ phoûng String:
chuyeån ñoäng nhieät vaø FontSize: 10
phaân boá Bolzmann. Tag: sim
String:
Tham soá: soá chieàu
Simulate
chuyeån ñoäng, soá laàn
moâ phoûng.
Output leân ñoà thò: Trình
baøy ñoà thò keát quaû moâ
phoûng.
Trinh coù thaáy String
cuûa NumDim coù 3
haøng khoâng? Ñeå
taïo moät String
nhieàu haøng thì taïi
thuoäc tính String
cuûa NumDim, thay vì
nhaäp thaúng chöõ
vaøo oâ keá beân,
Trinh haõy baám vaøo
nuùt keá beân vaø
nhaäp giaù trò thaønh
nhieàu doøng:
Ñoái vôùi caùc Static Text khaùc trong GUI, neáu muoán phaân thaønh nhieàu
doøng, Trinh cuõng laøm nhö vaäy.
2. Laäp trình
Nhaéc laïi giaûi thuaät moâ phoûng chuyeån ñoäng nhieät ñaõ giôùi thieäu
trong taøi lieäu MonteCarlo (maø mình ñaõ ñöa cho Trinh):
i) Cho moãi phaân töû moät vaän toác ban ñaàu baát kyø;
ii) Taïi moãi böôùc laëp choïn moät phaân töû khí xaùc ñònh, cho vaän toác cuûa
noù thay ñoåi ngaãu nhieân moät löôïng nhoû;
iii) Tính ñoä bieán thieân ñoäng naêng cuûa heä thoáng do thay ñoåi ngaãu
e
nhieân vöøa roài;
Neáu thì traïng thaùi môùi noùi treân ñöôïc giöõ laïi laøm traïng thaùi ban
e 0
ñaàu cuûa böôùc laëp keá tieáp;
Neáu thì traïng thaùi môùi chæ ñöôïc chaáp thuaän vôùi xaùc suaát laø
e 0
. Ñeå thöïc hieän ñieàu naøy treân maùy tính ta choïn moät soá ngaãu
e
e kT
nhieân r trong khoaûng ]0,1[, neáu thì traïng thaùi môùi ñöôïc giöõ laïi,
e
re kT
neáu khoâng thì traïng thaùi cuõ seõ ñöôïc duøng ñeå thöïc hieän böôùc laëp keá
tieáp.
Sau nhieàu böôùc laëp nhö treân, heä seõ tieán daàn ñeán phaân boá Maxwell.
Sau khi löu GUI, Trinh haõy tìm ñeán haøm sim_Callback trong M-file.
Nhôù laïi trong worksheet Maple, ngöôøi ta coù söû duïng pheùp tính
modulo (chia laáy phaàn dö)
k:=(k+1) mod NMol;
nhöng trong Matlab laïi khoâng coù toaùn töû thöïc hieän pheùp tính naøy
neân ta seõ vieát theâm moät function cho noù.
Trinh haõy cheøn ñoaïn maõ sau vaøo ngay tröôùc haøm sim_Callback:
1 (nhö phaàn ñaàu taøi lieäu MonteCarlo ñaõ noùi) neân chæ coøn
.
1
e
2
vi2
Vieát laïi haøm naøy beân Matlab laø (ñoaïn maõ naøy cuõng ñöôïc cheøn
vaøo phía tröôùc haøm sim_Callback trong M-file):
cho neân sum(W(:)) tính toång caùc phaàn töû cuûa ma traän W. Chuù yù
raèng sum(W) chæ traû veà moät ma traän haøng maø phaàn töû thöù i laø
toång caùc phaàn töû treân coät thöù i cuûa ma traän W.
Vaäy laø ñaõ xong nhöõng “haøm ngoaøi leà”, giôø ta ñi vaøo haøm chính,
haøm sim_Callback.
Ñaàu tieân laø böôùc chuaån bò cho tính toaùn:
% --- Executes on button press in sim.
function sim_Callback(hObject, eventdata, handles)
% hObject handle to sim (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
clc
NMol = 10;
T = 1;
Theo
kB worksheet Maple, mình cuõng cho T = kB = m = 1 ñeå tính toaùn ñôn
= 1;
giaûn (maø vaãn khoâng aûnh höôûng ñeán quy luaät phaân boá Boltzmann
m = 1;
cuûa chyeån ñoäng nhieät). Cho soá haït laø Nmol = 10.
Doøng NmbrFois = str2double(get(handles.NmbrFois, 'String')); chaéc
cuõng quen thuoäc vôùi Trinh roài, phaûi khoâng? Noù laáy soá laàn moâ
phoûng maø ngöôøi duøng nhaäp vaøo oâ input text NmbrFois treân GUI roài
gaùn cho ma traän NmbrFois.
Coøn doøng NumDim = get(handles.NumDim, 'Value'); laáy soá chieàu
chuyeån ñoäng töø popup menu NumDim. Popup menu naøy coù 3 löïa choïn,
cöù moãi caùi ñöôïc choïn thì Value seõ ñöôïc gaùn giaù trò laø soá thöù töï
cuûa löïa choïn ñoù. Ví duï neáu popup menu coù caùc löïa choïn ‘heo’, ‘boø’,
‘gaø’ thì Value = 2 khi ‘boø’ ñöôïc choïn.
Theo yù cuûa giaûi thuaät ôû treân, ta seõ duøng ma traän V0 ñeå moâ taû
(baèng vaän toác) traïng thaùi ban ñaàu vaø V1 moâ taû traïng thaùi ñaït
ñöôïc sau khi thay ñoåi ngaãu nhieân vaän toác cuûa 1 haït naøo ñoù. Tuøy
theo ta muoán moâ phoûng vôùi bao nhieâu chieàu chuyeån ñoäng maø V0,
V1 seõ coù baáy nhieâu coät (thaønh phaàn x, y, z cuûa vaän toác).
zeros(NMol, NumDim) taïo ra ma traän NMol haøng, NumDim coät chöùa
toaøn soá 0.
Cöù moãi laàn ñaït ñeán traïng thaùi môùi, traïng thaùi ñoù chæ ñöôïc
chaáp nhaän neáu noù thoûa ñk ôû muïc iii) neâu trong giaûi thuaät, ta seõ
duøng bieán j ñeå ñeám soá traïng thaùi chaáp nhaän ñc trong suoát quaù
trình moâ phoûng.
Theo muïc ii) cuûa giaûi thuaät thì ta seõ choïn 1 haït, nhöng laøm vaäy thì
sôï (Nmol – 1) haït coøn laïi ghen tò, thoâi thì cöù cho haït naøo cuõng ñöôïc
choïn ñeå coâng baèng. Nhö vaäy, laàn moâ phoûng thöù nhaát ta choïn haït
1, laàn 2 choïn haït 2, laàn 3 laø haït 3 vaø cöù theá ñeán heát roài quay
voøng. Ñieàu naøy gôïi cho ta söû duïng pheùp chia laáy dö (modulo) ñeå
dieãn taû böôùc ñi vöøa roài. Ñieàu naøy lyù giaûi söï coù maët cuûa bieán k
vaø haøm modulo() maø ta ñaõ xaây döïng (thaày Chieán noùi roài, caùi gì
noùi laïi ôû ñaây nöõa ). ÖØ thì maáy baøi khaùc coù theå boû qua ñöôïc
böôùc kieåm tra naøy, nhöng vôùi baøi taäp naøy cuûa Trinh thì khaùc, neáu
cöù ñeå caùi NaN “nhôûn nhô ngoaøi voøng phaùp luaät” thì noù seõ laøm
voøng laëp beân döôùi chaïy maõi chaïy maõi khoâng döøng ñöôïc, keát quaû
laø Crash!
Doøng k = modulo(k, NMol) + 1; keát hôïp vôùi voøng laëp for i =
1:NmbrFois; seõ laøm cho k chaïy töø tuaàn hoaøn 1 NMol, töùc laø ñi töø
haït 1 ñeán haït thöù NMol.
Doøng V1(k, :) = V0(k, :) + randn(1, NumDim); dieãn taû: Töø traïng
thaùi ban ñaàu V0, cho caùc thaønh phaàn vaän toác cuûa haït thöù k thay
ñoåi ngaãu nhieân ñöôïc traïng thaùi môùi V1. [ : ] nghóa laø laáy moïi phaàn
töû trong daõy. V(k, :) coù nghóa: laáy moïi coät treân haøng thöù k.
Haøm randn(m, n) taïo ma traän m x n chöùa caùc soá ñöôïc phaùt sinh
ngaãu nhieân trong khoaûng (-1; 1), khaùc vôùi haøm rand(m, n) laáy soá
ngaãu nhieân trong khoaûng (0; 1).
Ñk de < 0 || aRan < exp(-de/(kB*T)) laø ñieàu kieän ñöôïc noùi trong
muïc iii) cuûa giaûi thuaät.
e(j) = e1; löu laïi naêng löôïng e1 cuûa traïng thaùi môùi naøy ñeå tí nöõa
veõ ñoà thò keát quaû moâ phoûng. Nhaéc laïi: j duøng ñeå ñeám soá traïng
thaùi ñöôïc chaáp nhaän.
Vaäy laø xong phaàn moâ phoûng – tính toaùn roài ñoù. Baây giôø ta seõ
xuaát keát quaû moâ phoûng leân ñoà
thò.
Ta seõ veõ bieåu ñoà coät phaân boá
naêng löôïng vaø chöùng minh vaän toác
trung bình moãi haït khi heä tieán daàn
ñeán phaân boá Boltzmann laø
NumDim*kBT/2.
Ta chia truïc hoaønh (E ~ kBT) thaønh
nhöõng khoaûng naêng löôïng (E, E+dE)
vaø tính soá haït coù naêng löôïng naèm
trong vuøng ñoù.
e1
e
e0
C
B
A
D nints = 20; Haøm fill(X, Y,Ñeám soá haït
‘colour’) ñeå
coù naêng löôïng
de = kB*T/nints; veõ ña giaùc
naèm trong
for i = 1:3*nints Vôùi X = [xA xB xCkhoaûng
xD] (e,
n(i, 1) = 0; Y = [yA yB yC yD]
E(i, 1) = (i - 1)*de;
colour: maøu n(i)/j: Soá haït moãi
traïng thaùi (~
E(i, 2) = E(i, 1) + de;
r : red (ñoû), b : blue,
dieängtích
: green
coät i).
for k = 1 : j n(i)/j/de: Chieàu cao
coät.
t = e(k)/NMol;
if t >= E(i, 1) && t < E(i, 2)
n(i, 1) = n(i) + 1;
Cöù moãi voøng laëp laø veõ moät ñoà thò, bình thöôøng thì ñoà thò môùi
seõ thay theá ñoà thò cuõ. Ñeå giöõ laïi ñoà thò, ta duøng leänh hold on.
Tieáp theo, ta ñaët teân cho truïc hoaønh vaø truïc tung.
Ngoaøi ra, ta vieát theâm thoâng baùo loãi neáu ngöôøi duøng nhaäp soá
laàn moâ phoûng khoâng hôïp leä:
xlabel('E')
ylabel('f(E)')
else
errordlg('Oops, you''ve entered wrong value!')
errordlg nghóa laø “error dialogue”. Trong caâu thoâng baùo “Oops, you've
entered wrong value!”, ta coù duøng daáu nhaùy maø daáu naøy laïi ñöôïc
Matlab duøng ñeå bao 2 ñaàu chuoãi kyù töï neân ñeå traùnh Matlab nhaàm
töôûng chuoãi cuûa mình keát thuùc taïi “you”, ta haõy theâm 1 daáu nhaùy
nöõa laøm kyù töï
thoaùt (töông töï
daáu “\” trong C).
Luùc naøy '' töông
ñöông vôùi '
thoâng thöôøng.
Vaäy laø chöông
trình cuûa mình
ñaõ xong roài ñoù. Soá chieàu chuyeån ñoäng :
1 => ñoäng naêng trung
Cho Trinh xem
bình: kT/2
tröôùc keát quaû
moâ phoûng vôùi
NmbrFoise = 5000:
Cuøng xem laïi phaàn laäp trình ta ñaõ laøm treân M-file:
(ÔØ, taïi sao laïi ngaïi cô chöù? Ngöôøi ta coù aên thòt ñaâu… )