Elektronu sistēmas stabilizācija

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