RĪGAS TEHNISKĀ UNIVERSITĀTE
Datorzinātnes un informācijas tehnoloģijas fakultāte
Praktiskais darbs
“Elektronu sistēmas stabilizācija”
1.
Saturs
1.Saturs................................................................................................................................................. 2
2.Uzdevums......................................................................................................................................... 3
3.Algoritms........................................................................................................................................... 3
4.Procedūras......................................................................................................................................... 4
5.Mainīgie............................................................................................................................................. 4
6.Blokshēma......................................................................................................................................... 6
7.Source................................................................................................................................................ 7
8.Rezultāti ......................................................................................................................................... 17
2. Uzdevums
Tika veikts eksperiments ar
elektronu sistēmas stabilizāciju. Uzdevums ir atrast un nomodelēt elektronu
iespējamo stāvokli sistēmas stabilizācijai. Stabilizācijas stāvoklis tiek
meklēts ar iterāciju metodi. Apkārtēja vide netiek ņemta vēra.
Uzdevuma risināšanai tika izmantots
Borland Pascal.
3.
Algoritms
Tā kā vide netiek ņemta vēra tiek
aprēķināta tika pašu elektronu mijiedarbība. Spēks no katra elektrona tiek
rēķināts ar formulu 1/r^2. Elektronu koordinātes, kā arī spēks kas iedarbojas
uz katru elektronu tiek glabātas masīva el[i,j]. Pirmā vērtība ir elektrona
koordināte, otra vērtība – summārais spēks kas iedarbojas uz elektronu.
Algoritms aprēķina vektorus līdz katram elektronam un pieskaita spēka rezultātu
pie elektrona 2 masīva vērtības. Ja elektrons atrodas no kreisas puses – spēks
tiek pieskaitīts ar – zīmi, ja elektrons atrodas no labās pusēs – vērtība tiek
pieskaitīta ar + zīmi.
Pēc elektronu spēka aprēķināšanas
tiek izvēlēts elektrons ar vislielāko summāro spēku. Šāda elektrona numurs tiek
saglabāts mainīgā iel.
Pēc elektrona izvēles – tiek
aprēķināts iterācijas solis. Tā aprēķināšanai tiek izmantoti attālumi pa labi
un pa kreisi no izvēlēta elektrona – algoritms izvēlās mazāku attālumu un ņem
pusi no tās. Vērtība tiek saglabāta mainīgajā solis.
Izvēlēta elektrona spēks tiek
saglabāts mainīgajā V3, pēc tām elektrona koordināte tiek izmainīta ar +solis,
pēc tam tiek parēķināts spēks un rezultāts tiek saglabāts mainīgā V2, pēc tam
izvēlēta elektrona koordināte tiek izmainīta ar -solis un spēks tiek parēķināts
vēlreiz un tiek saglabāts vērtība V1. Saildzinot V1 un V2 algoritms izvēlas
virzienu kurā summārais spēks ir mazāks. Elektrons tiek nobīdīts tajā virzienā.
Pēc elektrona iterācijas notiek summāra spēka pārrēķins un jā tas ir mazāks
nekā V3, tad iterācija atkārtojas no jauna, bet šoreiz solis tiek dalīts ar 2.
Pēc katras iterācijas notiek
pārbauda – vai elektronu summārais spēks nav samazinājies līdz vajadzīgai
precizitātei. Ja tasi ir noticis, tad tiek izvadīts paziņojums ar iterāciju
skaitu un elektronu parametriem.
Programmai ir daudz konfigurējamo
parametru kas ir viegli saprotami un kurus ir iespējams izsaukt caur izvēlni.
4.
Procedūras
Tā
kā lielāka daļa koda ir izdalīta atsevišķās procedūras, zemāk tik aprakstīts
katras procedūras uzdevums, lai kods būtu vieglāk saprotams.
1. Testapar
– ievad testa koordinātes.
2. Spekaapr
-aprēķina spēku kas iedarbojas uz katru elektronu
3. Parizvads
– izvada elektronu parametrus: koordinātes un summāro spēku.
4. Izvelnesizv
– izvada izvēlni.
5. Kordievads
– ievadīt elektronus koordinātes rokas režīmā.
6. Randompar
– ievada elektronu koordinātes randomā.
7. Elizvele
– izvēlās elektronu uz kuru iedarbojās maksimālais summārais spēks.
8. Solaapr
– aprēķin optimālo soli.
9. Solis1
– veikt vienu iterāciju.
10. Robiev – ieslēgt un ievadīt nogriežņa robežas.
5.
Mainīgie
1. i,j,k,l,m
– skaitītāji
2. solsk
– iterāciju skaits
3. elsk
– elektronu skaits
4. menu
– mainīgais kas nosaka izvēlnes izvēli.
5. Iel
– elektrona numurs uz kuru iedarbojās vislielākais summārais spēks.
6. Elskrob
– elektronu skaits kopā ar ierobežojošiem elektroniem.
7. Solis
– aprēķināts solis
8. rob1
– robeža no kreisas puses.
9. Rob2
– robeža no labās puses.
10. v1,v2,v3
– vērtības soļu aprēķinam
11. el
[1..100,1..2] – masīvs, kur tiek glabātas koordinātes un spēks;
12. robežas
– boolean, kas nosaka vai ir ieslēgti ierobežojošie elektroni;
6. Blokshēma
Zemāk ir
pāradīta vienkāršota algoritma shēma:
7. Source
program elektroni;
uses crt;
label s1;
label b1;
label s4;
label b2;
label precizitate;
label izvelne;
label iekor;
label rand;
label test;
label izkor;
label skaits;
label rob;
label par;
label sol;
label nsol;
label lidz;
label att;
label del;
var
i,j,k,l,tuk,solsk,elsk,menu,iel:integer;
solis,vapr,rob1,rob2,v1,v2,v3,r1,r2,r3,prec:real;
el:array [1..30,1..2] of
real;
procedure testapar;
begin
el[1,1]:=3;
el[2,1]:=4;
el[3,1]:=6;
el[4,1]:=9;
el[5,1]:=11;
end;
procedure spekaapr;
label b3;
begin
for i:=1 to elsk do
begin
el[i,2]:=0;
end;
for i:= 1 to elsk do
begin
for j:= 1 to elsk do
begin
if i=j then goto b3;
if el[i,1] < el[j,1] then
begin
el[i,2]:=el[i,2]+(1/(sqr(el[j,1]-el[i,1])));
end;
if el[i,1] > el[j,1] then
begin
el[i,2]:=el[i,2]-(1/(sqr(el[i,1]-el[j,1])));
end;
b3:
begin
end;
end;
end;
end;
procedure parizvads;
begin
for i:=1 to elsk do
begin
writeln (' ');
write ('El.Nr.');
write (i);
write (' ');
for j:= 1 to 2 do
begin
write (' ');
write (el[i,j]:4:4);
end;
end;
writeln(' ');
writeln('ievadiet jebkuru
vertibu lai turpinat... ');
end;
procedure izvelnesizv;
begin
randomize;
menu:=0;
clrscr;
writeln('1. Ievadit
elektronu kordinates');
writeln('2. Randomi
aizpildit kordinates');
writeln('3. Izmantot testa
koordinates');
writeln('4. Izvadit
elektronu parametrus');
writeln('5. Aprekinat speku
un soli');
writeln('6. Veikt 1 soli');
writeln('7. Veikt N
solus');
writeln('8. Aprekinat
sistemas lidzsvara stavokli');
writeln('9. Attelot
elektronu stavokli');
writeln('10. Attirit
elektronu parametrus');
writeln('11. Ievadit
elektronu skaitu');
writeln('12. Ieslegt ierobezojos
elektronus');
writeln('13. Ievadit velamo
precizitati');
writeln('00. Iziet');
end;
procedure kordievads;
begin
for i:= 1 to elsk do
begin
read(el[i,1]);
end;
end;
procedure randompar;
label s1,b2;
begin
s1:
for i:=1 to elsk do
begin
el[i,1]:=random(50)+1;
end;
for i:=1 to elsk do
begin
for j:=1 to elsk do
begin
if i=j then goto b2;
if el[i,1]=el[j,1] then goto s1;
b2:
begin
end;
end;
end;
end;
procedure dellall;
begin
for i:= 1 to elsk do
begin
for j:=1 to elsk do
begin
el[i,j]:=0;
end;
end;
end;
procedure elizvele;
begin
vapr:=abs(el[1,2]);
iel:=1;
for i:= 1 to elsk do
begin
if abs(el[i,2]) > vapr then
begin
vapr:=abs(el[i,2]);
iel:=i;
end;
end;
writeln(' ');
write('visvairaks speks
iedarbojas uz el. nr.');
writeln(iel);
end;
procedure solaapr;
var
k:real;
label b1;
begin
solis:=10;
for i:= 1 to elsk do
begin
for j:= 1 to elsk do
begin
if i=j then goto b1;
if el[i,1] < el[j,1] then
begin
k:=el[j,1]-el[i,1];
if solis > k then
solis:=k;
end;
if el[i,1] > el[j,1] then
begin
k:=el[i,1]-el[j,1];
if solis > k then
solis:=k;
end;
b1:
begin
end;
end;
end;
solis:=solis/2;
writeln(' ');
write('bazes solis ir ');
writeln(solis:2:2);
end;
procedure solis1;
begin
spekaapr;
r3:=el[iel,2];
v3:=el[iel,1];
v1:=el[iel,1]+solis;
v2:=el[iel,1]-solis;
el[iel,1]:=v1;
spekaapr;
r1:=abs(el[iel,2]);
el[iel,1]:=v2;
spekaapr;
r2:=abs(el[iel,2]);
if r1 < r2 then
begin
el[iel,1]:=v1;
end
else
begin
el[iel,1]:=v2;
end;
spekaapr;
{writeln('v1,v2,r1,r2');
writeln(v1:2:2);
writeln(v2:2:2);
writeln(r1:2:2);
writeln(r2:2:2);}
end;
{programmas sakums}
begin
elsk:=5; {elektronu skaits
defaulta}
prec:=0.00005;
{precizitate}
izvelne:
izvelnesizv;
read(menu);
if menu=1 then goto iekor;
if menu=2 then goto rand;
if menu=3 then goto test;
if menu=4 then goto izkor;
if menu=5 then goto par;
if menu=6 then goto sol;
if menu=7 then goto nsol;
if menu=8 then goto lidz;
if menu=9 then goto att;
if menu=10 then goto del;
If menu=11 then goto
skaits;
if menu=12 then goto rob;
if menu=13 then goto
precizitate;
if menu=00 then halt
else goto izvelne;
iekor:
kordievads;
goto izvelne;
izkor:
parizvads;
read(tuk);
goto izvelne;
rand:
dellall;
randompar;
goto izvelne;
att:
begin
end;
test:
testapar;
goto izvelne;
par:
spekaapr;
elizvele;
solaapr;
write('Precizitate: ');
writeln(prec:5:5);
read(tuk);
goto izvelne;
del:
dellall;
goto izvelne;
sol:
begin
spekaapr;
elizvele;
solaapr;
solis1;
read(tuk);
goto izvelne;
end;
nsol:
begin
writeln('ievadiet velamo
solu skaitu');
read(k);
for l:= 1 to k do
begin
spekaapr;
elizvele;
solaapr;
solis1;
end;
goto izvelne;
end;
lidz:
begin
solsk:=0;
spekaapr;
s4:
k:=0;
for i:= 1 to elsk do
begin
if abs(el[i,2]) < prec then k:=k+1;
end;
if k = elsk then
begin
clrscr;
writeln('sistemas izlidzinasana ir
pabeigta.');
write('Solu skaits - ');
writeln(solsk);
writeln('elektronu parametri:');
parizvads;
read(tuk);
goto izvelne;
end
else
begin
spekaapr;
elizvele;
solaapr;
solis1;
solsk:=solsk+1;
goto s4;
end;
end;
skaits:
writeln('Ievadiet elektronu
skaitu: ');
read(elsk);
goto izvelne;
rob:
writeln('ievadiet 1. un 2. robezu:
');
read(rob1);
read(rob2);
writeln('Robezas ir ');
writeln(rob1:2:2);
writeln(rob2:2:2);
read(tuk);
goto izvelne;
precizitate:
writeln('Ievadiet velamo
precizitati: ');
read(prec);
goto izvelne;
end.
8.
Rezultāti
Tika izstrādāts
risinājums, kas ar iterāciju metodi pietiekoši ātri spēj stabilizēt sistēmu kas
sastāvā ir līdz 100 elektroniem slēgtā nogrieznī. Uz pieliktā CD atrodas
programmatūras source kods, kā arī nokompilēta programma. Augstāk minētie
skaidrojumi palīdzēs labāk saprast izstrādāto kodu un pielāgot programmu
konkrēta risinājuma izpildei.
Nav komentāru:
Ierakstīt komentāru