Documente Academic
Documente Profesional
Documente Cultură
Informatica Pentru Prelucrarea Datelor Fizice PDF
Informatica Pentru Prelucrarea Datelor Fizice PDF
Investeşte în oameni!
INFORMATICĂ PENTRU
PRELUCRAREA DATELOR FIZICE
Anişoara CONSTANTINESCU Adrian DAFINEI
Specializarea FIZICĂ
Forma de învăţământ ID - semestrul I
2010
FIZICĂ
Anişoara Adrian
CONSTANTINESCU DAFINEI
2010
© 2010 Acest manual a fost elaborat în cadrul "Proiectului pentru Învăţământul
Rural", proiect co-finanţat de către Banca Mondială, Guvernul României
şi comunităţile locale.
ISBN 973-0-04084-2
Cuprins
Cuprins
1. ALGORITMI 1
1.1. Obiectivele Unităţii de învăţare 1 - Algoritmi 2
1.2. Algoritmi 2
1.3. Caracteristicile algoritmilor 3
1.4. Exemple de algoritmi 3
1.4.1. Calculul mediei aritmetice a n valori numerice x i , i ∈ 1, n r 3
1.4.2. Extragerea termenului cu valoarea cea mai mare x max , dintr-un şir x i dat. 4
1.4.3. Evaluarea valorii unui polinom pentru o valoare dată a variabilei x 5
1.4.4. Ordonarea crescătoare a unui şir 6
1.4.5. Algoritmul lui Euclid 8
1.5. Test de autoevaluare 1 8
1.6. Răspunsuri la testul de autoevaluare 1 9
1.7. Termeni şi expresii cheie. Formule cheie 10
1.8. Lucrare de verificare 11
1.9. Bibliografie 12
2. SCHEME LOGICE 13
2.1. Obiectivele Unităţii de învăţare 2 - Scheme logice 14
2.2. Elementele grafice ale unei scheme logice 14
2.3. Ciclu de instrucţiuni 15
2.3.1. Ciclu cu număr cunoscut de paşi 15
2.3.2. Ciclu cu ieşirea determinată de realizarea unei condiţii 16
2.4. Exemple de scheme logice 17
2.4.1. Schemă logică pentru algoritmul de calcul al mediei
aritmetice a n valori numerice date 17
2.4.2. Schema logică pentru algoritmul de calcul al valorii unui polinom 18
2.4.3. Schemă logică pentru algoritmul de ordonare 19
2.5. Test de autoevaluare 1 20
2.6. Răspunsuri la testul de autoevaluare 1 21
2.7. Termeni şi expresii cheie. 21
2.8. Lucrare de verificare 22
2.9. Bibliografie 22
7. ALGORITMI COMPLECŞI 99
7.1. Obiectivele Unităţii de învăţare 7 - Algoritmi complecşi 100
7.2. Sisteme de numeraţie 100
7.2.1. Conversia zecimal - binară 101
7.2.2. Conversia binar-zecimală 103
7.2.3. Conversia octal-binară 104
7.2.4. Conversia binar-octală 104
7.2.5. Conversia binar-hexazecimală şi invers 104
7.3. Test de autoevaluare 1 105
7.4. Rezolvarea ecuaţiilor algebrice 106
7.4.1. Metoda înjumătăţirii intervalului 107
7.4.2. Metoda Newton-Raphson 108
7.4.3. Metoda Birge-Vieta 109
7.5. Rezolvarea sistemelor de ecuaţii algebrice liniare 111
7.5.1. Metoda Gauss-Seidel 112
7.5.2. Metoda Gauss-Jordan 114
7.6. Integrarea numerică 115
7.6.1. Metoda trapezelor 116
7.6.2. Metoda Simpson 116
7.7. Integrarea numerică a ecuaţiilor diferenţiale de ordin 1 118
7.7.1. Metoda Runge-Kutta de ordin 4 119
7.8. Metoda Monte Carlo 121
7.8.1. Numere aleatoare 124
7.8.2. Principiul fundamental al metodei Monte Carlo 124
7.9. Test de autoevaluare 2 129
7.10. Răspunsuri la testele de autoevaluare 129
7.11. Termeni şi expresii cheie. Formule cheie 130
7.12. Lucrare de verificare 131
7.13. Bibliografie 132
Bibliografie 179
Introducere
Este foarte important ca fiecare din lucrurile de mai sus să-ţi fie foarte
clare.
anisoara@olimp.fiz.infim.ro asdafinei@yahoo.com
Anişoara CONSTANTINESCU
Adrian DAFINEI
Unitatea de învăţare 1
ALGORITMI
Cuprins Pagina
ALGORITMI 1
1.1. Obiectivele Unităţii de învăţare 1 - Algoritmi 2
1.2. Algoritmi 2
1.3. Caracteristicile algoritmilor 3
1.4. Exemple de algoritmi 3
1.4.1. Calculul mediei aritmetice a n valori numerice x i , i ∈ 1, n 3
1.4.2. Extragerea termenului cu valoarea cea mai mare x max , dintr-un şir x i dat 4
1.4.3. Evaluarea valorii unui polinom pentru o valoare dată a variabilei x 5
1.4.4. Ordonarea crescătoare a unui şir 6
1.4.5. Algoritmul lui Euclid 8
1.5. Test de autoevaluare 1 8
1.6. Răspunsuri la testul de autoevaluare 1 9
1.7. Termeni şi expresii cheie. Formule cheie 10
1.8. Lucrare de verificare 11
1.9. Bibliografie 12
1
Algoritmi
1.2 Algoritmi
Iniţial calculatoarele au fost folosite pentru a efectua calcule matematice.
S-a constatat că majoritatea problemelor de calcul ce trebuiesc rezolvate
se pot descompune în paşi elementari foarte simpli. Rezolvarea problemei
complicate revine la efectuarea paşilor mici, elementari. Pentru a pute să
aplici ideea de mai sus trebuie ca mai întâi:
Definiţie
Algoritmul reprezintă un set finit de reguli care indică operaţiile
necesare pentru a ajunge de la datele iniţiale ale unei probleme
(input) la rezultat (output).
Altfel spus un algoritm trebuie să descrie fără ambiguităţi calea de
rezolvare a unei probleme.
2
Algoritmi
3
Algoritmi
Algoritm:
1. se citeşte n
2. se citesc valorile x i
3. se iniţializează cu zero variabila s în care se face
suma;
s=0
4. se iniţializează indicele i la 1, i = 1
5. se adună în s valoarea lui x i şi se scrie rezultatul în s,
s = s + xi
6. se creşte valoarea lui i cu 1,
i = i +1
7. se compară i cu n şi cât timp
i ≤n
se repetă operaţiile începând de la pasul 5; dacă
i >n
atunci se trece la pasul următor
8. La sfârşitul execuţiei vei avea în s suma elementelor
a căror medie o calculezi
n
s = ∑ xi
i =1
şi poţi calcula valoarea mediei:
s
9. x=
n
4
Algoritmi
Algoritm:
1. se citeşte n
2. se citesc valorile x i
3. se atribuie lui x max valoarea x 1
x max = x1
4. se ia i = 2
5. se compară x max cu x i ; dacă
x max < x i
atunci se atribuie lui x max valoarea x i
x max = x i
şi se trece la pasul următor; dacă
x max > x i
atunci se trece la pasul următor adică
6. se creşte valoarea lui i cu o unitate,
i = i +1
7. se compară i cu n ; cât timp
i ≤n
se repetă de la pasul 5; dacă
i >n
atunci putem scrie că valoarea celui mai mare
element din şir este dată de x max
Enunţ
Consideră un polinom dat prin gradul său m şi coeficienţii săi a i cu i luând
valori de la m la 0, . Determină valoarea polinomului pentru o valoare dată
x0 a variabilei x.
Algoritmul se bazează pe schema lui Horner care scrie polinomul
P (x ) = am ⋅ x m + am −1 ⋅ x m −1 + a1 ⋅ x + a0 (1.2)
în forma
P ( x ) = (( ((am ⋅ x + am −1 ) ⋅ x + am −2 ) ⋅ x + ) ⋅ x + a1 ) ⋅ x + a0 (1.3)
Input: gradul polinomului m, coeficienţii a i şi valoarea lui x0.
5
Algoritmi
Algoritm:
1.se citeşte m
2.se citesc coeficienţii ai pentru i mergând de la m la 0 cu
pasul -1
3.se citeşte valoarea lui x0
4.se atribuie valoarea am variabilei p, în care se calculează
valoarea polinomului, adică :
p = am
5.se ia i=m-1
6.se calculează
p = p⋅x0 + ai
(adică la p înmulţit cu x0 s-a adunat coeficientul ai unde acum
i = m-1
şi rezultatul s-a scris în variabila p)
7. din i se scade 1,
i=i-1
8. se compară i cu 0 şi cât timp
i≥0
se repetă de la pasul 6.
9. pentru i < 0 procesul de calcul s-a încheiat şi rezultatul dorit
este valoarea actuală a lui p
6
Algoritmi
Algoritm A:
1. se citeşte n
2. se citesc cele n valori xi
3. se ia j=n-1
4. se ia i=1
5. se compară xi cu xi+1 ; dacă xi > xi+1 atunci se trece pe
locul cu indice mai mare termenul cu valoarea mai mare,
prin folosirea unei variabile ajutătoare aux ;
aux = xi , xi = xi+1, xi+1 = aux
6. se creşte i cu 1, i=i+1
7. pentru i ≤ j se repetă de la pasul 5; pentru i > j pe locul j+1
se află cea mai mare valoare din şirul de dimensiune j+1
8. se scade valoarea lui j cu 1
9. se compară j cu 1; cât timp j ≥ 1 se repetă de la pasul 4
10. pentru j=0 şirul este ordonat
Algoritm B:
1. se citeşte n
2. se citesc cele n valori xi
3. se ia o variabilă, să zicem k, egală cu zero, k=0; ea îşi va
schimba valoarea ori de câte ori vom schimba între ele
valori xi
4. se ia i=1
5. se compară xi cu xi+1 ; dacă xi > xi+1 atunci aux = xi xi = xi+1 ,
xi+1 = aux şi k=k+1; se trece la pasul 7
6. dacă xi ≤ xi+1 se trece la pasul următor
7. se ia i=i+1
8. se compară i cu n-1; cât timp i ≤ n − 1 se repetă procesul
începând de la pasul 5; când i = n se verifică valoarea lui
k; dacă este zero şirul este ordonat; dacă nu este zero
înseamnă că am făcut o schimbare de valori xi deci şirul
poate să nu fie încă ordonat; se repetă procesul începând
de la pasul 3
7
Algoritmi
Algoritm:
1. se citesc m şi n.
2. te asiguri că m ≥ n; dacă nu este aşa atunci le schimbi
între ele cu ajutorul unei variabile ajutătoare ( aux=m,
m=n, n=aux ).
3. se determină restul împărţirii lui m la n ( acest rest se
scrie în variabila r , unde 0 ≤ r < n ).
4. se atribuie lui m valoarea lui n şi lui n valoarea lui r.
5. dacă n=0 algoritmul se încheie, răspunsul este
valoarea curentă a lui m.
6. dacă n ≠0 se repetă procesul începând cu pasul 3.
8
Algoritmi
9
Algoritmi
Formule cheie
1 n
Formula de calcul a mediei aritmetice x = ∑ xi
n i =1
Formula de calcul a valorii unui polinom pentru o
valoare dată a variabilei
P ( x ) = (( ((am ⋅ x + am −1 ) ⋅ x + am −2 ) ⋅ x + ) ⋅ x + a1 ) ⋅ x + a0
10
Algoritmi
11
Algoritmi
1.9. Bibliografie
12
Scheme logice
Unitatea de învăţare 2
SCHEME LOGICE
Cuprins Pagina
2. SCHEME LOGICE 13
2.1. Obiectivele Unităţii de învăţare 2 - Scheme logice 14
2.2. Elementele grafice ale unei scheme logice 14
2.3. Ciclu de instrucţiuni 15
2.3.1. Ciclu cu număr cunoscut de paşi 15
2.3.2. Ciclu cu ieşirea determinată de realizarea unei condiţii 16
2.4. Exemple de scheme logice 17
2.4.1. Schemă logică pentru algoritmul de calcul
al mediei aritmetice a n valori numerice date 17
2.4.2. Schema logică pentru algoritmul de calcul al valorii unui polinom 18
2.4.3. Schemă logică pentru algoritmul de ordonare 19
2.5. Test de autoevaluare 1 20
2.6. Răspunsuri la testul de autoevaluare 1 21
2.7. Termeni şi expresii cheie. 21
2.8. Lucrare de verificare 22
2.9. Bibliografie 22
13
Scheme logice
14
Scheme logice
Figura 2.1
15
Scheme logice
Figura 2.2
16
Scheme logice
Figura 2.3
17
Scheme logice
Figura 2.4
18
Scheme logice
Figura 2.5
19
Scheme logice
20
Scheme logice
21
Scheme logice
2.9. Bibliografie
22
Elemente de limbaj Turbo Pascal
Unitatea de învăţare 3
ELEMENTE DE LIMBAJ TURBO PASCAL
Cuprins Pagina
23
Elemente de limbaj Turbo Pascal
Limbajul PASCAL este un limbaj de programare de nivel înalt, proiectat de Niklaus Wirth
de la Universitatea Tehnică din Zurich în 1971 şi numit astfel în cinstea lui Blaise Pascal,
celebrul matematician şi filozof francez.
TURBO PASCAL conţine o serie de facilităţi faţă de limbajul PASCAL:
mediu integrat, ordonare liberă a secţiunilor în partea de declaraţie a programului, etc. O
descriere detaliată a limbajului Turbo Pascal o găseşti, de exemplu, în referinţele
bibliografice generale [4].
3.2. Editorul TP
24
Elemente de limbaj Turbo Pascal
25
Elemente de limbaj Turbo Pascal
26
Elemente de limbaj Turbo Pascal
Dacă ai de făcut o comunicare într-o limbă străină, concepi mai întâi un text cu
idei clare, ordonate şi înlănţuite logic în limba română (ai conceput algoritmul
comunicării ideilor); verifici apoi că toate cuvintele pe care le foloseşti sunt
clare şi toate virgulele sunt puse la locul lor (ai făcut compilarea). Traduci apoi
textul şi trimiţi scrisoarea (execuţi programul pe care ţi l-ai propus). Şi aştepţi
rezultatele!
Nu uita: Editare – Compilare - Execuţie
27
Elemente de limbaj Turbo Pascal
• tipul unei constante de tip întreg este predefinit tip întreg cu domeniul cel
mai mic care include valoarea constantei întregi.
• pentru un operator binar, ambii operanzi sunt convertiţi la tipul lor comun
înainte de operaţie. Tipul comun este predefinit ca tipul întreg cu cel mai
mic domeniu care include toate valorile posibile ale ambelor tipuri.
Operaţia este realizată folosind precizia tipului comun şi tipul rezultatului
este tipul comun.
• expresia din partea dreaptă a unei instrucţiuni de atribuire este evaluată
independent de domeniul şi tipul variabilei din stânga.
• dacă rezultatul operaţiei între valori întregi se situează în afara
domeniului reprezentând tipul întreg apare o eroare în faza de execuţie a
programului.
• operatorii binari pentru operanzi întregi sunt: +, -, *, DIV, MOD
• funcţii pentru operanzi întregi sunt: ABS, SQR
• operatorii relaţionali sunt: =, <>, >=, <=, >, <
• tipul întreg defineşte o succesiune ordonată de valori deci pentru fiecare
valoare (cu excepţia capetelor intervalului ) se pot defini un succesor şi un
predecesor cu funcţiile:
SUCC(x)=x+1
PRED(x)=x-1
28
Elemente de limbaj Turbo Pascal
• funcţiile standard sunt: ABS, SQR, LN, EXP, SQRT, SIN, COS, ARCTAN
• funcţiile de transfer sunt:
TRUNC pentru conversia în întreg cu trunchierea părţii fracţionare a
argumentului şi
ROUND pentru conversia în întreg cu rotunjirea părţii fracţionare a
argumentului
ROUND(x) = TRUNC(x+0.5) pentru x>=0
ROUND(x) = TRUNC(x-0.5) pentru x<0
• pe mulţimea valorilor reale nu este definită o relaţie de ordonare deci nu
pot fi folosite funcţiile SUCC şi PRED.
EX1.PAS
program caractere_ASCII;
label unu;
var i,j:integer; f:text;
begin
assign(f,’codASCII.out’); rewrite(f);
for i:=1 to 6 do write(f, i:2,’:’,char(i):2,’;’);
writeln(f); j:=0;
for i:=14 to 255 do
begin
write(f,i:3,’:’,char(i):2,’;’);j:=j+1;
if j<10 then goto unu
else
begin
j:=0; writeln(f);
end;
unu: end;
end.
Tipul BOOLEAN este un tip de date logice cu 2 elemente FALSE < TRUE
ceea ce-ţi permite să aplici asupra variabilelor de acest tip
• operatori logici: NOT, AND, OR
• operatori relaţionali: =, <>, <=, >=, <, >
• relaţii de ordine: ORD(FALSE) = 0; ORD(TRUE) = 1;
SUCC(FALSE) = TRUE; PRED(TRUE) = FALSE
Tipurile predefinite INTEGER, CHAR şi BOOLEAN definesc mulţimi finite
şi ordonate, motiv pentru care se mai numesc şi tipuri scalare sau
ordinale.
29
Elemente de limbaj Turbo Pascal
• Definiţia unui interval ( sau subdomeniu ) specifică valorile cea mai mică
şi cea mai mare în interval separate prin simbolul .. . Ambele constante
trebuie să fie de acelaşi tip ordinal.
Exemple:
0..99 subdomeniu al tipului de bază BYTE
-128..127 subdomeniu al tipului de bază SHORTINT
’C’..’R’ subdomeniu al tipului de bază CHAR
rosu..albastru subdomeniu al tipului de bază « enumerare »definit mai sus
Tipul ARRAY (tablou) este o structură omogenă formată dintr-un număr fix
de componente de acelaşi tip numit tip de bază.
Diagrama de sintaxă ce defineşte acest tip este prezentată în figura 3.3:
Figura 3.3
în care tip_indice este un tip ordinal iar tip_bază este orice tip.
Fiecare componentă a unui tablou este selectată printr-un indice care ia
valori într-o mulţime finită numită tipul indicelui. Tipuri indice valabile sunt
toate tipurile ordinale cu excepţia lui LONGINT; tip indice nu poate fi un tip
structurat.
30
Elemente de limbaj Turbo Pascal
Exemple:
TYPE vector=array[1..10] of real; {defineste tipul
structurat vector reprezentand multimea tablourilor ce
au 10 componente de tip real; observati definirea
domeniului in care ia valori indicele}
VAR u, v : vector;
[
Tipul de bază poate fi orice tip nestructurat sau structurat.
Accesarea unei componente a tabloului se face prin identificatorul tablo-
ului şi valoarea indicelui.
Pot exista şi tablouri cu mai multe dimensiuni. Astfel
ARRAY [BOOLEAN] OF ARRAY[1..10] OF ARRAY[1..2] OF REAL;
este interpretat de compilator ca
ARRAY[BOOLEAN, 1..10, 1..2] OF REAL;
Poţi accesa un element al tabloului multidimensional specificând valorile
indicilor din parantezele drepte. Astfel
VAR a:ARRAY[1..10] OF ARRAY[1..20] OF REAL;
defineşte o matrice cu 10 linii şi 20 coloane. Elementul din linia i şi coloana
j se identifică prin a[i][j] sau a[i, j].
Tipul string (şir de caractere) este specific limbajului Pascal. Valoarea unei
variabile de acest tip este formată dintr-un număr de caractere.
Tipurile string sunt tipuri structurate într-un mod asemănător cu tipul
ARRAY, cu diferenţa majoră că numărul de caractere într-un şir poate
varia dinamic între zero şi limita superioară specificată (între 1 şi 255).
Diagrama de sintaxă ce defineşte acest tip este prezentată în figura 3.4:
Figura 3.4
Întreg_fără_semn este o constantă întreagă în domeniul 1..255 şi dă
lungimea maximă a şirului de caractere. Dacă lungimea nu este explicit
specificată, valoarea implicită considerată este 255.
Exemple:
TYPE nume=STRING[14];
VAR s1, s2:nume;
sau direct
VAR s1, s2:STRING[14] {tip anonim }
31
Elemente de limbaj Turbo Pascal
Asignarea şirurilor:
age := ’optsprezece’;
Figura 3.5
Fişierele unde lista câmpurilor are diagrama de sintaxă:
constau
dintr-o
secvenţă de
componente
de acelaşi tip.
Numărul de
componente
într-un fişier Figura 3.6
(dimensiunea Referirea la o componentă a unei variabile de acest tip o vei face conform
fişierului) nu următoarei diagrame de sintaxă:
este
determinat
prin definirea
fişierului
Figura 3.7
32
Elemente de limbaj Turbo Pascal
Exemple de variabile de tip record pe care le vei folosi în grafică, sunt cele
prezentate mai jos.
TYPE viewporttype=RECORD
x1, y1, x2, y2 : integer;
clip : boolean;
END;
TYPE pointtype=RECORD
x, y : integer;
END;
Figura 3.8
Exemple:
TYPE f=file of byte;
g=file of real;
VAR a,b:f;
c:g;
33
Elemente de limbaj Turbo Pascal
Figura 3.9
Figura 3.10
34
Elemente de limbaj Turbo Pascal
Figura 3.11
• dacă operandul operatorului not este de un tip întreg, rezultatul este de
acelaşi tip întreg
• dacă ambii operanzi ai operatorilor and, or, xor sunt de câte un tip
întreg, tipul rezultatului este tipul comun al celor doi operanzi.
Figura 3.12
Figura 3.13
35
Elemente de limbaj Turbo Pascal
Figura 3.14
Reţine că:
• la compararea tipurilor simple e necesar ca tipurile să fie compatibile;
totuşi dacă un operand este de tip real, celălalt poate fi de un tip întreg
36
Elemente de limbaj Turbo Pascal
EX2.PAS.
program conversie; {acesta este antetul programului}
const pi=3.14159; {partea de declaratie a programului
cu definire constante si declaratii de variabile}
var gfr, mfr, radian : real;
grade, minute, secunde : integer;
begin {partea executabila a programului}
writeln(’ introdu unghiul in radiani’); readln(radian);
gfr:=radian*180.0/pi; grade:=trunc(gfr);
mfg:=(gfr-grade)*60.0; minute:=trunc(mfr);
secunde:=trunc((mfr-minute)*60.0);
writeln(radian:10:2,’ radiani = ’, grade, ’ grade ’,
minute,’ minute ’,secunde,’ secunde’);
readln;
end.
37
Elemente de limbaj Turbo Pascal
3.
Domeniu Memorie
shortint -129...127 8-bit cu semn
integer -32768...32767 16-bit cu semn
longint -2147483648...2147483647 32-bit cu semn
byte 0...255 8-bit fără semn
word 0..65535 16-bit fără semn
38
Elemente de limbaj Turbo Pascal
1.
(x + y )
z2 + y 2 z2 − y 2
2 . tg +
2 yz 2 yz
3.10. Bibliografie
1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul
de programare Turbo Pascal Editura Anima, paginile 5-24.
39
Instrucţiuni în Turbo Pascal
Unitatea de învăţare 4
INSTRUCŢIUNI ÎN TURBO PASCAL
Cuprins Pagina
40
Instrucţiuni în Turbo Pascal
Figura 4.1
41
Instrucţiuni în Turbo Pascal
Figura 4.2
Exemple:
radian := 1.5;
gfr := radian∗180.0/pi; grade := trunc(gfr);
{ai întâlnit aceste instrucţiuni de atribuire
în exemplul EX2.PAS }
Figura 4.3
42
Instrucţiuni în Turbo Pascal
Figura 4.4
Figura 4.5
43
Instrucţiuni în Turbo Pascal
Figura 4.6
Reţine că:
• delimitatorul ; nu trebuie pus înaintea lui ELSE deoarece ar duce la
terminarea deciziei implicate de IF fără a considera şi cea de a doua
alternativă.
44
Instrucţiuni în Turbo Pascal
Figura 4.7
45
Instrucţiuni în Turbo Pascal
Expresia selector, de tip ordinal, poate lua valori între -32768 şi 32767 şi
deci nu poate fi de tip LONGINT, WORD sau STRING. Instrucţiunea CASE
execută instrucţiunea prefixată de o constantă CASE egală cu valoarea
expresiei selector sau prefixată de un domeniu CASE ce conţine valoarea
expresiei selector. Dacă nu există o astfel de constantă CASE şi este
prezentă partea ELSE se execută instrucţiunea ce urmează pe ELSE.
Dacă nu există partea ELSE nu se execută nici-o instrucţiune.
Figura 4.8
46
Instrucţiuni în Turbo Pascal
Figura 4.9
Figura 4.10
47
Instrucţiuni în Turbo Pascal
Figura 4.11
Variabilele din listă pot aparţine doar tipurilor simple INTEGER, REAL,
CHAR. Prin execuţia operaţiei de intrare se preiau valori din fişierul
standard de intrare şi se atribuie variabilelor în ordinea dată de
lista_de_variabile.
Datele de intrare sunt considerate de program ca un flux continuu; o
operaţie de intrare preia o valoare de pe mediul de intrare din punctul
imediat următor ultimei valori preluate prin operaţia de intrare precedentă.
Reţine că o formă deosebită a operaţiei de intrare are sintaxa a cărei
schemă apare în figura 4.12
Figura 4.12
48
Instrucţiuni în Turbo Pascal
Figura 4.13
Figura 4.14
49
Instrucţiuni în Turbo Pascal
• când valoarea de ieşire este de tip REAL sunt necesari doi parametri:
lungimea totală a zonei şi lungimea fracţiei. Dacă sunt specificaţi ambii
parametri, valoarea reală este scrisă fără exponent, cu punct zecimal şi
semn în zona rezervată, aliniată la dreapta, având partea fracţionară
rotunjită la numărul de cifre precizat ca lungime a fracţiei.
Exemplu:
valoarea din memorie x=-15.864 va apare la scrierea cu WRITE(x:6:1)
ca -15.9
Dacă vei specifica doar lungimea zonei, valoarea de tip REAL va
fi afişată normalizat având mantisa rotunjită astfel încât să încapă în
lungimea totală a zonei minus 6.
Exemplu:
WRITE(x:8) afişează, pentru aceeaşi valoare x de mai sus, -1.6 E+01
(unde - este semnul numărului, 1.6 este mantisa iar 01 puterea lui 10 cu
care trebuie înmulţită mantisa pentru a avea valoarea din memorie; deci
−1.6 ∗ 101).
Diagrama de sintaxă a procesului este prezentată în figura 4.15.
Figura 4.15
EX3.PAS
program plimbare;
var ore, min, sec, tplimbare : word;
begin
write(’ dati ora plecarii de acasa in ore minute
secunde’);
readln( ore, min, sec );
writeln(’plecare la: ’, ore:2, ’/’,min:2,’/’,sec:2);
write(’dati in secunde cat timp vreti sa va plimbati’);
50
Instrucţiuni în Turbo Pascal
readln(tplimbare);
writeln(’durata plimbarii:’,tplimbare:6,’secunde’);
sec:=sec+tplimbare; min:=min+sec div 60; sec:=sec
mod 60;
ore:=ore+min div 60;min:=min mod 60;
{ afisare moment sosire }
writeln(’veti sosi la: ’,ore:2, ’/’, min:2, ’/’,
sec:2);
end.
Vei introduce datele, întregi, cerute de acest program, fie câte una pe un
rând (valori numerice pentru oră ENTER, minut ENTER, secundă ENTER)
fie toate valorile numerice separate cu blanc pe un singur rând.
Când vei avea multe date de intrare sau ieşire (ca în cazul lucrului cu
matrici sau tabele de date) este recomandabil să foloseşti fişiere de date –
în locul introducerii datelor de la consolă ( vezi tipul FILE ).
EX4.PAS
program testfile1;
TYPE f=FILE OF real; {aici e definit tipul FILE}
VAR a:f;{variabila a este de tipul f definit mai sus}
x:array[1..10,1..5] of real;
i,j:byte;
BEGIN
assign(a,’testfile.dat’); rewrite(a);
for i:= 1 to 10 do
for j:= 1 to 5 do
begin
x[i,j]:=1.*i*j; {1. transforma i*j intr-o valoare
reala}
write(a,x[i,j]);
end;
51
Instrucţiuni în Turbo Pascal
close(a);
END.
EX5.PAS
program testfile2;
TYPE f=FILE OF real;
VAR a:f;
x:array[1..10,1..5] of real;
i,j:byte;
BEGIN
assign(a,’testfile.dat’); reset(a);
{citeste datele din fisierul ’testfile.dat’}
for i:=1 to 10 do
for j:=1 to 5 do read(a, x[i, j]);
{scrie datele citite pe ecran, o linie a matricei
pe un rând}
for i := 1 to 10 do
begin
for j := 1 to 5 do write(x[i, j]:6:1);
writeln;
end;
close(a); readln;
END.
52
Instrucţiuni în Turbo Pascal
SEEK
Sintaxa: SEEK(FilVar, n)
SEEK mută pointerul de fişier la a n-a componentă a fişierului asignat lui
FilVar. n este o expresie de tip întreg. Prima componentă a fişierului are
n=0. Extinderea fişierului asignat lui FilVar se poate face tot cu
procedura SEEK, în care n are valoarea numărul de componente din fişier
plus unu sau cu
SEEK(FilVar, FileSize(FilVar))
CLOSE
Sintaxa: CLOSE(FilVar)
Folosind această instrucţiune fişierul asignat variabilei FilVar va fi închis.
Reţine că este întotdeauna necesară aplicarea instrucţiunii CLOSE ori de
câte ori se încheie lucrul cu un fişier – inclusiv asupra fişierelor deschise
pentru citire.
FilePos
Sintaxa: FilePos(FilVar)
Funcţia întoarce poziţia curentă a pointerului de fişier în interiorul lui
FilVar. Reţine că prima componentă are numărul zero.
FileSize
Sintaxa: FileSize(FilVar)
Funcţia întoarce numărul de înregistrări din fişier.
EX6.PAS
program testfile3;
var f : file of byte;
nume : string;
i, j : byte;
BEGIN
write(’introdu nume fisier: ’); {numele fişierului se
introduce in timpul execuţiei
programului}
53
Instrucţiuni în Turbo Pascal
Este important să reţii că fişierele descrise mai sus pot fi scrise sau citite
doar într-un program în Turbo Pascal - nu şi cu un editor DOS sau de alt
tip. În schimb, fişierele de tip TXT pot fi însă scrise sau citite şi în DOS sau
NotePad sau alte editoare de text.
Fişierele de tip TEXT sunt structurate în linii, fiecare linie se termină cu
End-Of-Line (EOL) iar fişierul se termină cu Enf-Of-File (EOF). Fişierele de
tip TEXT sunt fişiere secvenţiale. Operaţiile cu caractere se fac cu
procedurile READ şi WRITE. Liniile din fişier sunt procesate cu procedurile
READLN şi WRITELN. Sintaxa de declarare a unei variabile de tip fişier text
este:
VAR f:TEXT;
EX7.PAS
program testfile4;
const n=10;
var f : text; nume:string;
x, y, z, m : array [1..n] of real;
xcm, ycm, zcm, mtot, sxm, sym, szm, sm : real;
i : byte;
BEGIN
54
Instrucţiuni în Turbo Pascal
55
Instrucţiuni în Turbo Pascal
56
Instrucţiuni în Turbo Pascal
57
Instrucţiuni în Turbo Pascal
58
Instrucţiuni în Turbo Pascal
59
Instrucţiuni în Turbo Pascal
7. Ordonare B
EX12.PAS
program ordonareB;
label unu; var x:array[1..100] of integer;
i, k, n:byte; a:integer; f:text;
begin
assign(f,’date.in’); {fisierul ’date.in’ trebuie sa existe in
directorul curent}
reset(f); readln(f, n);
for i:=1 to n do read(f, x[i]);
unu: k := 0;
for i:=1 to n do
if x[i]> x[i+1} then
begin
a:=x[i]; x[i]:=x[i+1]; x[i+1];=a;
k:=k+1;
end;
if k > 0 then goto unu; writeln(’ sirul ordonat este:’);
for i:=1 to n do write(x[i]:5,’ ’);
readln;
end.
8. Algoritmul Euclid
EX13.PAS
program euclid; var m, m1, n, n1, r : integer;
BEGIN
writeln(’ introdu m si n ca numere intregi, pozitive’); read(m,n);
m1:=m; n1:=n;{in m1 si n1 pastram valorile m si n distruse de
algoritmul lui Euclid}
if m < n then
begin
r:=m; m:=n; n:=r;
end;
while n <> 0 do {impartiri repetate}
begin
r:=m mod n; m:=n; n:=r;
end;
if m > 1 then
writeln(m1:5,’ si ’,n1:5,’ au cel mai mare divizor comun:’, m) else
writeln(m1:5,’ si ’,n1:5,’ nu au un divizor comun > 1’);
end.
60
Instrucţiuni în Turbo Pascal
2.Foloseşte instrucţiunea CASE... pentru a afla ultima zi din lună, oricare ar fi anul şi
luna ca date input. (0,5p)
9.Scrie programul care citeşte dintr-un fişier tip text valorile numărului de termeni
dintr-un şir şi termenii şirului xi şi găseşte termenul cel mai mic din şir xmin şi poziţia
sa în şir. (1p)
∑a
k =1
i ,k ⋅ bk , j şi instrucţiunea ci,j = s .
61
Instrucţiuni în Turbo Pascal
4.9. Bibliografie
62
Funcţii şi proceduri în Turbo Pascal
Unitatea de învăţare 5
FUNCŢII ŞI PROCEDURI ÎN TURBO PASCAL
Cuprins Pagina
63
Funcţii şi proceduri în Turbo Pascal
5.2. Proceduri
O declaraţie de procedură asociază un identificator cu un bloc de
procedură. Diagrama de sintaxă pentru cazurile simple, pe care le vei
studia, este prezentată în figura următoare:
Figura 5.1
64
Funcţii şi proceduri în Turbo Pascal
65
Funcţii şi proceduri în Turbo Pascal
EX15.PAS
PROGRAM fractie2;
VAR a, b, c : integer; {variabile globale}
PROCEDURE cmmdc;
VAR x, y, z : integer; {variabile locale}
begin
Variabila x:=a; y:=b;
locală este if x < y then
o variabilă begin
de program z:=x; x:=y; y:=z;
al cărei end;
domeniu de while y <> 0 do
valabilitate begin
este z:= x mod y; x:=y; y:=z;
restricţionat end;
la un blocul c:=x; { cmmdc e transmis intr-o variabila globala}
de cod în end; {end cmmdc}
care a fost
definită BEGIN {programul principal}
write(’introdu numaratorul si numitorul ca numere
intregi pozitive’);
readln(a,b);
writeln(’fractie nesimplificata: ’,a,’/’,b);
cmmdc; {apelare procedura cmmdc}
if c>1 then {simplificare fractie}
begin
a:=a div c; b:=b div c;
writeln(’fractie simplificata: ’,a,’/’,b);
end {atentie nu puneti ; inainte de else}
else writeln(’fractia nu se poate simplifica’);
END.
66
Funcţii şi proceduri în Turbo Pascal
EX16.PAS
program test_var;
var x, y:real;
procedure citit_scris;
var x, u:real;
begin
write(’ introdu x si u, numere reale: ’); readln(x, u);
writeln(’ x=’,x:5:1; ’u=’,u:5:1);
end;
begin
write(’ introdu x si y, numere reale: ’);
readln(x, y);
citit_scris; writeln(’x=’,x:5:1, ’y=’,y:5:1);
end.
x= 10.5 u= 20.5
valorile citite şi scrise în procedura citit_scris
x=1.5 y=2.5
valorile citite înainte de apelarea procedurii şi
scrise după apelarea ei.
5.2.3. Parametri
Folosirea parametrilor formali îţi permite apelarea aceloraşi proceduri în
etape diferite ale programului, cu valori diferite ale variabilelor.
Un parametru formal reprezintă un obiect local al procedurii. Observă lista
parametrilor formali prezentată în diagrama de sintaxă în figura 5.2.
67
Funcţii şi proceduri în Turbo Pascal
Figura 5.2
68
Funcţii şi proceduri în Turbo Pascal
EX17.PAS
PROGRAM fractie3;
VAR a, b, c : integer;
PROCEDURE cmmdc(x, y:integer);
{x si y sunt parametrii valoare}
VAR z:integer;
begin
if x < y then
begin
z:=x; x:=y; y:=z;
end;
while y < > 0 do
begin
z:=x mod y; x:=y; y:=z;
end;
c:=x;
{ cmmdc e transmis intr-o variabila globala c}
end; { end cmmdc}
EX18.PAS
PROGRAM fractie4;
VAR a, b, c :integer;
PROCEDURE cmmdc(x, y :integer; VAR w:integer);
{x si y sunt parametri valoare, w este parametru
variabila}
VAR z:integer;
PROCEDURE swap;
begin
z:=x; x:=y; y:=z;
end; {end swap}
begin {begin cmmdc}
if x < y then swap; while y < > 0 do
begin
z:=x mod y; x:=y; y:=z;
end;
w:=x
end; {end cmmdc}
69
Funcţii şi proceduri în Turbo Pascal
5.3. Funcţii
Figura 5.3
Figura 5.4
70
Funcţii şi proceduri în Turbo Pascal
Exemplu:
Programul de mai jos determină cele 4 rădăcini reale ale ecuaţiei
x4 − 9x3 − 2x2 + 120x − 130 = 0. ( 5.1)
atunci când sunt date intervalele în care se află rădăcinile. Programul
conţine o funcţie care defineşte pe f (x ) din ecuaţia f ( x ) = 0 şi o
procedură care găseşte rădăcina ecuaţiei în intervalul dat de valorile
parametrilor actuali ce înlocuiesc pe a şi b la apelarea procedurii şi scrie
pe ecran această valoare. Pentru lămuriri suplimentare poţi consulta
referinţa bibliografică [5] .
EX19.PAS
PROGRAM rezec4;
LABEL zero;
VAR a, b : real; i:byte;
ai:array[1..4] of real;
{limita inferioara a intervalului in care se afla
o radacina}
bi:array[1..4] of real;
{ limita superioara a intervalului in care se
afla o radacina}
FUNCTION f(x:real):real;
begin
f:=sqr(x)*sqr(x) - 9*sqr(x)*x - 2*sqr(x) +
120.*x - 130.
end;
PROCEDURE solutie(a,b:real; i:byte);
label unu, doi;
CONST eps=1.E-05;
var c:real;
begin
unu: c:=(a+b)/2;
if f(c)=0 then
begin
writeln(’ x(’,i:2,’)=’,c); goto doi;
end;
if f(a)*f(c) < 0 then b:=c else a:=c;
if abs(b-a)<eps then
begin
writeln(’ x(’,i:2,’)=’,(a+b)/2); goto doi;
end
else goto unu;
doi: end;
BEGIN {main program}
writeln(’ introdu limitele a, b pentru cele ’);
writeln(’ 4 intervale in care se afla o radacina:’);
writeln(’ (-4., -3.), (1., 2.), (4., 5.), (7., 8.)
’);
for i:= 1 to 4 do
begin
zero: readln(a, b);
{ verifica corectitudinea intervalelor}
if f(a)*f(b) > 0 then
71
Funcţii şi proceduri în Turbo Pascal
begin
writeln(’intervaldat gresit,reintrodu a si b: ’);
goto zero;
end;
ai[i]:=a; bi[i]:=b;
end;
for i:=1 to 4 do solutie(ai[i], bi[i],i);
readln;
END.
O procedură sau funcţie poate apela o altă procedură sau funcţie dacă
aceasta din urmă a fost deja declarată.
Sunt însă situaţii în care numele şi efectul procedurii sau funcţiei apelate
nu îţi sunt cunoscute la scrierea procedurii sau funcţiei apelante ci doar în
momentul execuţiei programului. În aceste cazuri numele
procedurii/funcţiei apelate va fi transmis ca parametru.
De exemplu, funcţia ce calculează prin metoda Simpson integrala
b
∫ f ( x )dx
a
( 5.2)
va avea antetul:
FUNCTION simpson(a, b:real; n:integer; f:fct):real;
Tipul fct este definit în programul apelant astfel:
TYPE fct=function(x:real):real;
Parametrii formali funcţii şi procedură pot fi numai parametri de tip valoare.
Funcţiile şi procedurile standard nu pot fi transmise ca parametri actuali.
La apelarea unei funcţii/proceduri care are printre parametri formali o
funcţie sau procedură, parametrul actual corespunzător trebuie să fie un
identificator de funcţie sau procedură.
Reţine că folosirea parametrilor de tip procedură sau funcţie se face sub
controlul directivei de compilare {$F+} aşezată fie înainte de antetul
programului fie înaintea declarării funcţiei actuale şi, în acest ultim caz, se
foloseşte la sfârşitul declarării funcţiei directiva de compilare {$F-}.
Exemple
1. Calculează, folosind metoda Simpson [6], integrala
π/2
dφ
K (θ ) = ∫
0 1 − sin (θ ) ⋅ sin 2 (φ )
2
( 5.3)
pentru θ = 30 şi 60 grade.
Programul ce îţi este prezentat în continuare realizează calculul cerut.
EX20.PAS
Program calcul_int_simpson;
const pi=3.14159;
type fct=function(x:real):real;
var a, b, t1, t2, t, s1, s2:real;
{$F+} function k(x:real):real;
begin
k:=1/sqrt(1-sin(t)*sin(t)*sin(x)*sin(x))
72
Funcţii şi proceduri în Turbo Pascal
end;
{$F-}
function simpson(a,b:real;n:integer; f:fct):real;
var s, h:real; i:integer;
begin
h:=(b-a)/n/2; s:=f(a)+f(b); i:=1;
while i<2*n do
begin
if i mod 2 = 0 then s:=s + 2*f(a+i*h)
else s:=s + 4*f(a+i*h);
i:=i+1;
end;
simpson:=s*h/3;
end; {end simpson}
2. Calculează integrala
1
x7 1 − x 2
I= ∫ 13
dx ( 5.4)
−1 (2 − x )2
EX21.PAS
Program calcul_integrala;
type fct=function(x:real):real;
var a, b, s1:real;
function xp(x:real; p:integer):real;
var i:integer; px:real;
begin
px:=1; for i:=1 to p do px:=px*x; xp:=px;
end;
{$F+} function fs(x:real):real;
begin
fs:=xp(x,7)*sqrt(1-sqr(x))/sqrt(xp(2-x,13));
end;
{$F-}
73
Funcţii şi proceduri în Turbo Pascal
{$i simpson.inc}
BEGIN
s1:=simpson(-1.,1.,10,fs);
writeln(’ integrala este: ’,s1);
readln;
END.
5.5. Recursivitate
Exemple:
1
Pm (u ) = m [u (2 m − 1)Pm −1 (u ) − (m − 1)Pm −2 (u )]
P0 (u ) = 1 ( 5.6)
P (u ) = u
1
Apel recursiv înseamnă folosirea numelui procedurii (funcţiei) în cadrul
textului procedurii (funcţiei); apelul recursiv este permis în Turbo Pascal.
Puterea recursivă stă în posibilitatea de a defini o mulţime infinită de
obiecte printr-o declaraţie finită; un număr infinit de calcule poate fi descris
printr-un program recursiv finit chiar dacă programul nu conţine repetiţii
explicite. Pentru terminarea programului, apelarea recursivă a unei
proceduri trebuie condiţionată fie printr-o condiţie ce la un moment dat
devine falsă fie asociind procedurii un parametru n şi apelând-o recursiv
cu parametrul n-1.
Studiază cele două exemple de mai jos.
Fiind dat un număr întreg şi pozitiv scrie numărul obţinut prin citirea cifrelor
numărului dat de la dreapta la stânga (numărul răsturnat).
EX22.PAS
program nr_rasturnat;
var n : longint;
procedure invers(n : longint);
begin
write(n mod 10);
if n div 10<> 0 then invers(n div 10);
end; {end procedura invers}
74
Funcţii şi proceduri în Turbo Pascal
begin
write(’ introdu numarul intreg: ’); readln(n);
writeln(’numarul dat este: ’,n);
write(’numarul rasturnt este: ’); invers(n);
readln;
end.
2. Calculează
n!
C nk =
(n − k )! k !
folosind forma recursivă a funcţiei fact(n)
Cnk = fact(n)/fact(n-k)/fact(k)
EX23.PAS
program combnk;
var n,k : byte; c : real;
FUNCTION fact(n:byte):longint;
begin
if n=0 then fact:=1 else fact:=n*fact(n-1);
end; {end functia fact}
begin
write(’ introdu n si k pentru a calcula combinari de
n luate cate k’);
readln(n, k);
c:= fact(n)/ fact(n-k)/ fact(k);
writeln(’comb. de ’, n:3, ’ luate cate
’,k:3,’=’,c:10:2);
readln;
end.
P(n, m) = 1 dacã m = 1
sau n = 1
( 5.7)
P(n, m) = 1 + P(n, n - 1) dacã n ≤ m
P(n, m) = P(n, m - 1) + P(n - m, m) dacã n > m
75
Funcţii şi proceduri în Turbo Pascal
EX24.PAS
program partitii;
uses crt;
var L, k:integer;
function p(n, m:integer):longint;
begin
if (n=1) or (m=1) then p:=1
else
if n<=m then p:=1 + p(n, n-1)
else p:= p(n, m-1) + p(n-m, m); {observati acest
else legat de if imediat anterior}
end;{end function p}
begin {program principal}
clrscr;
write(’introdu n si m, intregi si pozitive, n>m ’);
readln(L, K);
writeln(’ numar de partitii p(’, L:3,’,’, K:3,’)=’,
p(L,K));
readln;
end.
Observă aici necesitatea de a scrie (n=1) şi (m=1) pentru că operatorul de
relaţie (=) are prioritate mai mică decât operatorul or (vezi tabelul de la
paragraful 3.5). Exemple cunoscute de apelare recursivă justificată sunt
programele ce rezolvă probleme ca turnurile din Hanoi şi aşezarea pe
tabla de şah a opt regine.
76
Funcţii şi proceduri în Turbo Pascal
4. Defineşte recursivitatea.
77
Funcţii şi proceduri în Turbo Pascal
R
Răăssppuunnssuurrii llaa tteessttuull ddee aauuttooeevvaalluuaarree --
C
Coonnttiinnuuaarree
5. PROGRAM permutari scrise
USES CRT
CONST lim=20;linii_in_pagina=22
VAR n,l:Integer;a:Array[1..lim] of 1 ..lim;
Procedure permutari(k:Integer);
Var I,x:integer;c:Char;
BEGIN
If k=1 then
Begin
If l> linii_in_pagina Then
Begin write (‘Apasa o tasta‘)
c:= readkey;clrscr;l:=0
end;
For i:=1 to n
Do write(a[i]:2,’’);writeln;l:=l+1
End
Else
For i:=1 to k do
Begin
x:=a[i]; a[i]:=a[k];a[k]:=x;
Permutari(k-1)
x:=a[i]; a[i]:=a[k];a[k]:=x;
End
End;
Begin {program principal}
Writeln(’ scrie permutarile d n elemente’)
Write ( ’n=’);readln(n)
For l:=1 to n Do
a[l]:=l;l:=2;
permutari(n)
End
78
Funcţii şi proceduri în Turbo Pascal
Formule cheie
n! = n * (n - 1)!
Proprietăţile recursive ale factorialului 0! = 1
n > 0
Recursivitatea Polinoamelor Legendre
1
Pm (u ) = m [u (2 m − 1)Pm −1 (u ) − (m − 1)Pm −2 (u )]
P0 (u ) = 1
P (u ) = u
1
5.9. Bibliografie
1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul
de programare Turbo Pascal Editura Anima, paginile 69-88.
79
Funcţii şi proceduri în Turbo Pascal
80
Grafică în Turbo Pascal
Unitatea de învăţare 6
Grafică în turbo pascal
Cuprins Pagina
81
Grafică în Turbo Pascal
82
Grafică în Turbo Pascal
4. reprezentarea punctelor
5. reprezentarea liniilor
8. scrierea grafică
83
Grafică în Turbo Pascal
Pixel:
Prescurtare de la picture PIX ELEment. Element de imagine.
Fiecare pixel este unul din punctele care formează reţeaua
bidimensională a unei imagini plane pe hârtie sau monitor. Fiecare
pixel este desenat individual pentru a compune imaginea totală de
pe hârtie sau ecran. Pixelul este elementul ultim pe care hardware-
ul sau software-ul de afişare sau tipărire îl pot manipula.
1.procedure grstart;
begin
gd:=detect; InitGraph(gd, gm, ’\TP\BGI’);
If graphresult <>grok then halt(1);
end;
84
Grafică în Turbo Pascal
function GraphResult:integer;
Câteva valori predefinite ale funcţiei sunt:
Const
grOK=0; {operaţie grafică reuşită, nici o eroare}
grNoInitGraph=-1; { grafica BGI neinstalată cu
InitGraph}
grNotDetected=-2; {grafica hardware nedetectată}
grFileNotFound=-3; {fişierul driver *.BGI nu a fost
găsit}
De notat că GraphResult e pus la zero după ce este apelat aşa că
rezultatul trebuie stocat într-o variabilă temporară pentru a fi testat.
85
Grafică în Turbo Pascal
• procedure ClearDevice;
şterge ecranul grafic actual şi poziţionează pointerul în poziţia (0, 0).
• procedure ClearViewPort
şterge fereastra grafică actuală. Culoarea ferestrei va fi culoarea de
fond; este apelată procedura rectangle pentru trasarea unui dreptunghi
corespunzător ferestrei şi pointerul este mutat în colţul stânga - sus al
ferestrei, punctul de coordonate relative (0, 0).
86
Grafică în Turbo Pascal
Constantele pentru LineStyle pot stabili că linia este plină, sau punctată
sau linie – punct, sau linie întreruptă , precum şi grosimea liniei. Astfel
CONST poate avea valorile date mai jos pentru fixarea stilului liniei
solidln=0;
dottedln=1;
centerln=2;
dshedln=3;
userbitln=4; {user-define line style}.
Pentru fixarea grosimii liniei ai la dispoziţie valorile :
CONST
normwidth=1;
thickwidth=3;
Variabila pattern este ignorată cât timp linestyle este diferit de 4. Când
linestyle = 4, ceea ce înseamnă că linia este trasată după un model
decis de utilizator, linia este trasată folosind un model 16-bit definit de
parametrul Pattern. De exemplu dacă pattern=$AAAA atunci modelul 16-
bit arată astfel:
1010101010101010 {pentru normwidth}
87
Grafică în Turbo Pascal
1010101010101010
1010101010101010
1010101010101010 {pentru thickwidth}
• LineTo(x, y:integer);
desenează o linie din poziţia curentă a pointerului până la un punct de
coordonate (x, y). Aceleaşi observaţii pentru culoare şi stil ca la procedura
Line.
• LineRel(Dx, Dy:integer);
desenează o linie din poziţia curentă a pointerului până la un punct definit
de distanţele Dx, Dy. Aceleaşi observaţii pentru culoare şi stil ca la
procedura Line.
• procedure Ellipse
(x,y:integer;ustart,ufinal:word;xraza,yraza:word);
îţi desenează un arc de elipsă pentru care (x, y) sunt coordonatele
centrului, ustart, ufinal sunt unghiurile de început şi sfârşit luate în sens
trigonometric, iar xraza, yraza sunt axele orizontală şi, respectiv, verticală
ale elipsei.
88
Grafică în Turbo Pascal
CONST
emptyfill=0; {umple in culoarea de fond}
solidfill=1; {umple cu culoare\}
linefill=2; {umple aria cu modelul- - -}
ltslashfill=3; {umple aria cu modelul /// }
slashfill=4; {umple aria cu modelul ///
mai groase }
bkslashfill=5; {umple aria cu modelul \\\ }
ltbkslashfill=6; {umple aria cu modelul \\\
dar mai subtiri}
hatchfill=7; {umple aria cu modelul ||| }
xhatchfill=8; {umple aria cu modelul xxx }
... ...
userfil=12; {modelul e dat de programator}
• procedure SetFillPattern
(pattern:FillPatternType;color:word);
umple figura grafică cu un model definit de programator în culoarea
definită de parametrul color.
89
Grafică în Turbo Pascal
• SetTextStyle(font:word; direction:word;
charsize:word);
În funcţie de valorile pe care le vei atribui constantelor pentru caracter,
direcţie şi dimensiune vei obţine rezultatele descrise în cele ce urmează.
CONST
HorizDir=0; VertDir=1;
90
Grafică în Turbo Pascal
EX25.PAS
program ex_viewport;
uses graph;
var gd,gm,centrux,centruy,i:integer;
xmax, ymax, maxcolor:integer;
inf:viewporttype;
cx1,cy1,cx2,cy2:string[5];
const cstil:array[1..3]of string=
(’dotted’,’centerln’,’dashedln’);
triunghi:array[1..4] of pointtype=
((x:10;y:50),(x:150;y:50),
91
Grafică în Turbo Pascal
(x:150;y:100),(x:10;y:50));
triunghi1:array[1..4] of pointtype=
((x:170;y:100),(x:270;y:100),
(x:270;y:200),(x:170;y:100));
begin
gd:=detect; initgraph(gd,gm,’\tp\bgi’);
centrux:=getmaxx div 2;
centruy:=getmaxy div 2;
setbkcolor(15); setcolor(1);
rectangle(10,10,centrux-10,centruy-10); {prima
fereastra}
setviewport(10,10,centrux-10,centruy-10,clipon);
getviewsettings(inf);
str(inf.x1,cx1); str(inf.y1,cy1);
str(inf.x2,cx2); str(inf.y2,cy2);
outtextxy(10,30,cx1);outtextxy(70,30,cy1);
outtextxy(10,50,cx2);outtextxy(70,50,cy2);
outtextxy(10,70,’clipon’);
outtextxy(10,100,’prima fereastra’);
xmax:=centrux-20;
ymax:=centruy-20;
maxcolor:=getmaxcolor;
randomize;
for i:=1 to 200 do
putpixel(random(xmax)+1,random(ymax)+1,randommaxcolor
)+1);
readln;
{revenirea la ecran}
setviewport(0,0,getmaxx,getmaxy,clipon);
rectangle(centrux+10,10,getmaxx-10,centruy-10);
{a doua fereastra}
setviewport(centrux+10,10,getmaxx-10,centruy-
10,clipon);
line(10,10,50,10);
outtextxy(60,10,’standard’);
setlinestyle(dottedln,0,normwidth);
line(10,50,50,50);outtextxy(60,50,’dottedline,
normwidth’); setlinestyle(dottedln,0,thickwidth);
line(10,90,50,90);outtextxy(60,90,’dottedline,
thickwidth’); setlinestyle(userbitln,$c3,thickwidth);
line(10,130,50,130);
outtextxy(60,130,’ userbitln, thickwidth’);
for i:=1 to 3 do
begin
setcolor(i+2);
setlinestyle(i,0,normwidth);line(10,130+20*i,60,20*i+13
0); outtextxy(140,20*i+130,cstil[i]);
setlinestyle(i,0,thickwidth);line80,20*i+130,130,20*i+1
30);
92
Grafică în Turbo Pascal
end;
readln;
setlinestyle(0,0,1);setcolor(1);
{revenirea la ecran}
setviewport(0,0,getmaxx,getmaxy,clipon);
{a reia fereastra}
rectangle(10,centruy+10,centrux-10,getmaxy-10);
setviewport(10,centruy+10,centrux-10,getmaxy-
10,clipon);
circle(60,60,50); setfillstyle(7,3);
fillellipse(160,120,60,40);
setfillstyle(4,5); pieslice(250,170,0,270,40); readln;
setcolor(1); {revenirea la ecran}
setviewport(0,0,getmaxx,getmaxy,clipon); { a patra
fereastra} rectangle(centrux+10,centruy+10,getmaxx-
10,getmaxy-10);
setviewport(centrux+10,centruy+10,getmaxx-10,getmaxy-
10,clipon); setfillstyle(2,4);
drawpoly(sizeof(triunghi) div sizeof(pointtype),
triunghi);
fillpoly(sizeof(triunghi) div sizeof(pointtype),
triunghi1);
readln;
closegraph; end.
Figura 6.2
93
Grafică în Turbo Pascal
EX26.PAS
program repr_fct;
uses graph;
const n=48; dx=0.25;
type vector=array[1..n]of real;
var i:byte;
xarg, yfv:vector;
xp, yp:array[1..n] of integer;
xpmax, ypmax, xpmin, ypmin, xscal, yscal, xf:real;
xreper:array[1..3] of integer;
94
Grafică în Turbo Pascal
BEGIN
xpmax:=-1E30; xpmin:=1E30; ypmax:=-1E30; ypmin:=1E30;
for i := 1 to n do
begin
xarg[i] := -4. + i*dx; xf:=xarg[i]; yfv[i]:=f(xf);
if xpmax < xarg[i] then xpmax := xarg[i];
if xpmin > xarg[i] then xpmin := xarg[i];
if ypmax < yfv[i] then ypmax := yfv[i];
if ypmin > yfv[i] then ypmin :=yfv[i];
end;
writeln(’xpmax=’, xpmax:10:2, ’ ypmax=’, ypmax:10:2);
writeln(’xpmin=’,xpmin:10:2, ’ ypmin=’, ypmin:10:2);
readln;
xscal := 400/(xpmax-xpmin); yscal := 300/(ypmax-ypmin);
writeln(’xscal=’,xscal:10:2, ’ yscal=’,yscal:10:2);
xreper[1] := 300 -trunc(4*xscal);
xreper[2] := 300 + trunc(4*xscal);
xreper[3] := 300 + trunc(8*xscal); readln;
for i := 1 to n do
begin
xp[i] := 300 + trunc(xarg[i]*xscal);
yp[i] := 225 - trunc(yfv[i]*yscal);
end;
gr_fct; {apelarea procedurii de grafica}
END.
Figura 6.3
95
Grafică în Turbo Pascal
96
Grafică în Turbo Pascal
97
Grafică în Turbo Pascal
6.8. Bibliografie
98
Algoritmi Complecşi
Unitatea de învăţare 7
ALGORITMI COMPLECŞI
Cuprins Pagina
ALGORITMI COMPLECŞI97 99
7.1. Obiectivele Unităţii de învăţare 7 - Algoritmi complecşi 100
7.2. Sisteme de numeraţie 100
7.2.1. Conversia zecimal - binară 101
7.2.2. Conversia binar-zecimală 103
7.2.3. Conversia octal-binară 104
7.2.4. Conversia binar-octală 104
7.2.5. Conversia binar-hexazecimală şi invers 104
7.3. Test de autoevaluare 1 105
7.4. Rezolvarea ecuaţiilor algebrice 106
7.4.1. Metoda înjumătăţirii intervalului 107
7.4.2. Metoda Newton-Raphson 108
7.4.3. Metoda Birge-Vieta 109
7.5. Rezolvarea sistemelor de ecuaţii algebrice liniare 111
7.5.1. Metoda Gauss-Seidel 112
7.5.2. Metoda Gauss-Jordan 114
7.6. Integrarea numerică 115
7.6.1. Metoda trapezelor 116
7.6.2. Metoda Simpson 116
7.7. Integrarea numerică a ecuaţiilor diferenţiale de ordin 1 118
7.7.1. Metoda Runge-Kutta de ordin 4 119
7.8. Metoda Monte Carlo 121
7.8.1. Numere aleatoare 124
7.8.2. Principiul fundamental al metodei Monte Carlo 124
7.9. Test de autoevaluare 2 129
7.10. Răspunsuri la testele de autoevaluare 129
7.11. Termeni şi expresii cheie. Formule cheie 130
7.12. Lucrare de verificare 131
7.13. Bibliografie 132
99
Algoritmi Complecşi
100
Algoritmi Complecşi
Baza Numele
sistemul de sistemului
numeraţie
2 binar
8 octal
10 zecimal
16 hexazecimal
Figura 7.1
101
Algoritmi Complecşi
Qi bi
53:2 cât 26 + rest 1
26:2 cât 13 + rest 0
13:2 cât 6 + rest 1
6:2 cât 3 + rest 0
3:2 cât 1 + rest 1
1:2 cât 0 + rest 1
Figura 7.2.
Fi b -i
0.3 * 2 = 0.6 → 0.6 0
0.6 * 2 = 1.2 → 0.2 1
0.2 * 2 = 0.4 → 0.4 0
0.4 * 2 = 0.8 → 0.8 0
0.8 * 2 = 1.6 → 0.6 1
0.6 * 2 = 1.2 → 0.2 1
... ......
Figura 7.3
102
Algoritmi Complecşi
Aşa dar reprezentarea binară lui 0.3 este 0.010011 Dacă se iau doar
primele 4 cifre (după punctul zecimal) ale reprezentării binare, numărul din
memorie este 0.25! Dacă se consideră 6 cifre binare (după punctul
zecimal) atunci reprezentarea lui 0.3 în memoria calculatorului este
0.296875, mai bună dar nu exactă. Cum unui număr real i se alocă în TP
6 octeţi adică 6*8=48 cifre binare, este clar că există o precizie limitată de
reprezentare a numerelor reale în memoria calculatorului.
103
Algoritmi Complecşi
Dat fiind că 8 = 23, conversia dintr-o bază în alta se face simplu. Cea mai
mare cifră octală, 7, se scrie ca o combinaţie de 3 biţi, adică sub forma
numărului binar 111 Pentru conversia unui număr din octal în binar se
înlocuieşte fiecare cifră octală cu o combinaţie de 3 cifre binare conform
tabelului din figura 7.4.:
cifră Reprezentare
octală binară
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
Figura 7.4
Exemplu: dacă scrii reprezentarea binară a numărului octal N 8 =346.25
conform cu regula stabilită mai sus, obţii evident
N 8 = 346.25 = 011100110.010101 = 11100110.010101 ( 7.17)
104
Algoritmi Complecşi
Exemple:
1. reprezentarea binară a numărului hexazecimal 1AB1.AB este
0001101010110001.10101011
sau renunţând la zerourile din faţă,
1101010110001.10101011
105
Algoritmi Complecşi
Fie ecuaţia
F (x ) = 0 ( 7.18)
în care F (x ) este o funcţie polinomială. Vei spune că x 0 este o rădăcină a
ecuaţiei dacă înlocuind x cu x 0 se obţine
F (x 0 ) = 0 ( 7.19)
Ne vom ocupa aici doar de ecuaţiile ce admit rădăcini reale. Pentru
ecuaţiile de gradul unu, doi sau trei există întotdeauna expresii exacte
pentru soluţii analitice. Pentru ecuaţii de grad mai mare ca 3 există mai
multe metode de găsire a unei ”rădăcini aproximative”. Metodele se pot
aplica şi pentru ecuaţiile de grad doi sau trei. Vei înţelege aici prin
rădăcină aproximativă o valoare x apropiată de x 0 în limita unei precizii ε
date.
Este bine ca mai înainte de a căuta rădăcinile unei ecuaţii să o tabelăm pe
un domeniu de valori x în care presupunem că s-ar afla aceste rădăcini şi
cu un pas, dx, care să ducă la cel mult o rădăcină într-un interval x, x+dx.
Iată un astfel de program pentru tabelarea funcţiei:
F ( x ) = x 4 − 9 ⋅ x 3 − 2 ⋅ x 2 + 120 ⋅ x − 130 ( 7.20)
106
Algoritmi Complecşi
EX27.PAS
program Tabel_functie;
var f:text;
x, dx:real;
nume:string[20];
function f(x:real):real;
begin
f:=sqr(x)*sqr(x)-9*sqr(x)*x-2*x*x+120*x-130;
end; {end function}
begin {program principal}
write(’introdu numele fisierului out’);
readln(nume); assign(f,nume);
rewrite(f);
x=-10.; dx:=1.;
while x <= 10 do
begin
writeln(f,x,f(x)); x:=x+dx;
end;
end.
În fişierul al cărui nume l-ai dat de la tastatură se vor afla, după execuţia
programului, valorile x şi valorile corespunzătoare ale lui F(x). Poţi afla
deci intervalele în care funcţia schimbă de semn adică intervalele în care
funcţia trece prin zero. De această informaţie ai nevoie în cele ce
urmează.
107
Algoritmi Complecşi
EX28.PAS
program rezec4_2; label 10, 20;
const eps=1.E-05; itermax=30;
type intx=array[1..4] of real;
const x1:intx=(-4, 1, 3, 7);
var x0,x:real;
i, iter:byte;
function f(x:real):real;
begin
f:=sqr(x)*sqr(x)-9*sqr(x)*x-2*x*x+120*x-130;
end;
function df(x:real):real;
begin
df:= 4*sqr(x)*x-27*sqr(x)-4*x+120;
end;
108
Algoritmi Complecşi
10:writeln(’la iteratia’,iter:2,’x[’,i:1,’]=’,x:10:2;
end;
readln;
END.
109
Algoritmi Complecşi
function b0(x:real):real;
var j:byte; {variabila locala}
begin
b[m]:=a[m];
for j:=m-1 downto 0 do b[j]:= b[j+1]*x +a[j];
b0:=b[0];
end;
function c1(x:real):real;
var k:byte; {variabile locale}
c:array[1..20] of real;
begin
c[m]:=b[m];
for k:=m-1 downto 1 do c[k]:=c[K+1]*x+b[k];
c1:=c[1];
end;
110
Algoritmi Complecşi
111
Algoritmi Complecşi
( ( ))
MAX ABS x i( k ) − x i( k −1 ) > ε ( 7.41)
unde
• ε reprezintă precizia cu care vrei să găseşti soluţia
• k este numărul iteraţiei curente şi k-1 este numărul iteraţiei anterioare
• i merge de la 1 la numărul de necunoscute ale sistemului
sau cât timp nu ai atins numărul maxim de iteraţii stabilit prin program,
itermax.
112
Algoritmi Complecşi
EX30.PAS
program gauss_seidel;
label unu, doi, trei;
type matrice=array[1..10,1..10] of real;
vector=array[1..10] of real;
const eps=1.E-04; itermax=50;
var n, i, j, iter:byte;
a:matrice;
b, x:vector;
f:text;
big, sum, temp:real;
begin assign(f,’gs.in’); reset(f); readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do read(f,a[i, j]);
readln(f,b[i]);
end;
for i:=1 to n do if a[i,i]=0 then goto unu;
writeln(’ sistemul de ecuatii este:’);
for i:=1 to n do
begin
forj:=1 to n do
write(a[i,j]:10:2);write(b[i]:10:2);
writeln;
end;
for i:=1 to n do x[i]:=0.;
for iter:=1 to itermax do
begin
big:=0.;
for i:=1 to n do
begin
sum:=0;for j:=1 to i-1 do
sum:=sum+a[i,j]*x[j];
for j:=i+1 to n do sum:=sum+a[i,j]*x[j];
temp:=(b[i]-sum)/a[i,i];
if abs(temp-x[i])> big then big:=abs(temp-x[i]);
x[i]:=temp;
end;
if big <= eps then goto trei;
end;
trei:Writeln(’la iteratia:’,iter:2,’solutia este:’);
for i:=1 to n do writeln(’x(’,i:2,’)=’,x[i]:10:2);
goto doi;
unu:writeln(’sistemul nu poate fi rezolvat prin
metoda Gauss Seidel’);
doi: readln;
end.
113
Algoritmi Complecşi
− x1 + 4 x 2 − x 3 − x 4 = 2
− x1 − x 2 + 4 x 3 − x 4 − x 5 = 6 ( 7.42)
− x2 − x3 + 4 x4 − x5 = 2
− x3 − x4 + 4 x5 = −1
fişierul gs.in va avea conţinutul:
5
4. -1. -1. 0. 0. -1.
-1. 4. -1. -1. 0. 2.
-1. -1. 4. -1. -1. 6.
0. -1. -1. 4. -1. 2.
0. 0. -1. -1. 4. -1.
Soluţia este x 1 = 1, x 2 = 2, x 3 = 3, x 4 = 2 şi x 5 = 1
114
Algoritmi Complecşi
115
Algoritmi Complecşi
h
I ≈ ITrapeze = (y 0 + 2 y 1 + 2 y 2 + + 2 y n −2 + y n −1 + y n )
2 ( 7.57)
y i = f (a + ih )
i ia valori între 0 şi n.
Metoda Simpson este una din cele mai folosite metode de integrare
numerică. Ca şi în metoda trapezelor intervalul [a, b] se împarte în n
intervale de lungime egală apărând astfel delimitările intervalelor de valori
ale lui x de forma x i = a + i ⋅ h dar aici se consideră suprafaţa de sub o
parabolă pentru a aproxima aria corespunzătoare la două intervale
adiacente. Situaţia este reprezentată în figura 7.6.
Figura 7.6
116
Algoritmi Complecşi
EX31.PAS
program integrare;
const a=0.; b=1.;
type fct=function(x:real):real;
var st1, st2, st3, st4, st5:real;
ss1, ss2, ss3, ss4, ss5:real;
function trapez(a,b:real; n:byte; f:fct):real;
var h, s:real; i:byte;
begin
h:=(b-a)/n;
s:=f(a)+f(b);
for i:=1 to n-1 do s:=s+2*f(a+i*h);
trapez:=s*h/2;
end;
function simpson(a, b:real; n:byte; f:fct):real;
var h, s:real; i:byte;
begin
h:=(b-a)/2/n;
s:=f(a)+f(b);
for i:=1 to 2*n-1 do
if i mod 2 = 0 then s:=s+2*f(a+i*h)
else s:=s+4*f(a+i*h);
simpson:=s*h/3;
end;
{$F+} function f1(x:real):real;
begin
f1:=1+x;
end;
function f2(x:real):real;
begin
f2:=1+x*x;
end;
function f3(x:real):real;
begin
f3:=1+sqr(x)*x;
end;
function f4(x:real):real;
begin
f4:=1+sqr(x)*sqr(x);
end;
function f5(x:real):real;
begin f5:=1+sqr(x)*sqr(x)*x;
end;
{$F-}
begin
st1:=trapez(a,b,10,f1);
ss1:=simpson(a,b,10,f1);
writeln(’ functia|val.int. analitica|val.int. trapez|
val.int. simpson’);
writeln(’ 1+x ’, 1.5:16:6, st1:18:6,ss1:18:6);
st2:=trapez(a,b,10,f2);
ss2:=simpson(a,b,10,f2);
117
Algoritmi Complecşi
writeln(’ 1+x^2’,1.333333:16:6,st2:18:6,ss2:18:6);
st3:=trapez(a,b,10,f3);
ss3:=simpson(a,b,10,f3);
writeln(’ 1+x^3’,1.25:16:6,st3:18:6,ss3:18:6);
st4:=trapez(a,b,10,f4);
ss4:=simpson(a,b,10,f4);
writeln(’ 1+x^4’,1.2:16:6,st4:18:6,ss4:18:6);
st5:=trapez(a,b,10,f5);
ss5:=simpson(a,b,10,f5);
writeln(’1+x^5’,1.166666:16:6,st5:18:6,ss5:18:6);
readln;
end.
Ecuaţia
dy
=y ( 7.59)
dx
are ca soluţie o funcţie de forma
y( x ) = a ⋅ e x ( 7.60)
unde a este o constantă arbitrară. Valori diferite ale constantei a conduc
la o familie de curbe care satisfac ecuaţia diferenţială (7.59). Constanta a
este unic determinată dacă pe lângă ecuaţia diferenţială se mai dă şi o
valoare a lui y pentru un x oarecare - o condiţie iniţială. De exemplu dacă
la x = 0, y = 1 ( y ( 0 ) = 1 ) atunci a = 1 şi y ( x ) = e x .
118
Algoritmi Complecşi
Pentru metoda Runge - Kutta de ordin 4, una din cele mai răspândite
metode de integrare a ecuaţiilor diferenţiale ordinare, formula de calcul
este:
h
y m +1 = y m + (k1 + 2 k 2 + 2 k 3 + k 4 ) ( 7.62)
6
unde
k1 = f (x m , y m )
k = f x + h , y + hk1
2 m m
2 2
( 7.63)
k = f x + h , y + hk 2
3
m
2
m
2
k 4 = f (x m + h, y m + hk 3 )
Eroarea de trunchiere este ε ≈ K ⋅ h 5 .
Se observă că în această metodă funcţia trebuie evaluată de 4 ori.
Estimarea erorii de trunchiere presupune că derivatele parţiale de ordinul
4 ale funcţiei f(x, y) sunt continue.
Să considerăm împreună exemplul unei ecuaţii diferenţiale simple cu o
condiţie iniţială dată
dy
=y
dx ( 7.64)
y (0 ) = 1
Folosind formulele de mai sus, se pot calcula valorile y ( h ) , h fiind pasul
cu care este parcurs domeniul valorilor variabilei x.
k1 = y m
k 2 = y m + hk1
2
k = y + h y + hk1 ( 7.65)
3 m
2
m
2
h hk1
k 4 = y m + h y m + 2 y m + 2
astfel că, în conformitate cu relaţia (7.62)
h2 h3 h4
y m +1 = y m ⋅ 1 + h + + + ( 7.66)
2 6 24
identică cu dezvoltarea în serie Taylor a funcţiei eh în vecinătatea
punctului h=0 până la termenul în h4.
Programul EX32.PAS care foloseşte subrutina RK4 pentru a integra
numeric ecuaţia dy / dx = y ; y ( 0 ) = 1 pentru x ∈ (0 ,1) cu pas 0.1 este
119
Algoritmi Complecşi
EX32.PAS
program ec_dif;
const h=0.1; n=10;
var x, y, k1, k2, k3, k4, x0, y0 : real;
i:byte;
function f(x, y : real) : real;
begin
f:=exp(x);
end;
begin
x0:=0; y0:=1; {valorile initiale}
writeln(’x| valoarea analitica|valoarea
calculata’);
for i:=1 to n do
begin
k1:=f(x0,y0); k2:=f(x0+h/2, y0+h*k1/2);
k3:=f(x0+h/2, y0+h*k2/2);
k4:=f(x0+h,y0+h*k3);
y:=y0+h/6*(k1+2*k2+2*k3+k4);
writeln(x0+h:5:2,exp(x0+h):20:6,y:20:6);
x0:=x0+h; y0:=y;
end;
readln;
end.
120
Algoritmi Complecşi
h6 := h/6.0;
xh := x+hh;
FOR i := 1 to n DO BEGIN
yt[i] := y[i]+hh*dydx[i]
END;
derivs(xh,yt,dyt);
FOR i := 1 to n DO BEGIN
yt[i] := y[i]+hh*dyt[i]
END;
derivs(xh,yt,dym);
FOR i := 1 to n DO BEGIN
yt[i] := y[i]+h*dym[i];
dym[i] := dyt[i]+dym[i]
END;
derivs(x+h,yt,dyt);
FOR i := 1 to n DO BEGIN
yout[i]:=y[i]+h6*(dydx[i]+dyt[i]+2.0*dym[i])
END
END;
Problema revine la calculul ariei de sub graficul funcţiei. Aşa cum se vede
şi în figura 7.4, graficul este încadrat în pătratul 0 ≤ x ≤ 1; 0 ≤ x ≤ 1
Problema revine la calculul ariei de sub graficul funcţiei. Aşa cum se vede
şi în figura 7.4, graficul este încadrat în pătratul 0 ≤ x ≤ 1; 0 ≤ x ≤ 1
Figura 7.7
121
Algoritmi Complecşi
( 7.70)
N (N − 1)p 2 + Np − N 2 p 2 = Np(1 − p ) = Npq
Abaterea standard este
[ ]
σ (N1 ) = ± E (N1 − Np )2 = ±(Npq )1 / 2 ( 7.71)
Deviaţia standard a estimării N1/N a ariei de sub curba y = x1/2 este
N var (N1 ) Npq pq
var 1 ≡ = 2 = ( 7.72)
N N2 N N
N1 pq
σ =± ( 7.73)
N N
Pentru cazul considerat la N=100 valoarea aşteptată pentru N1 este
2 2 1 10
aproximativ 100 ⋅ , N1 ≈ 0 ,67 iar σ ( N1 ) = 100 ⋅ ⋅ ≈ 2
3 3 3 3
N
şi σ 1 ≈
(2 / 3 )(1 / 3 ) = 2 ≈ 0.047 sau ε ≈ 0.047 ≈ 7%
N 100 30 2/3
122
Algoritmi Complecşi
N1 ∫a
f ( x )dx
≈ ( 7.76)
N ( b − a )c
de unde înţelegi că
b
N1
∫a f ( x )dx ≈
N
( b − a )c ( 7.77)
123
Algoritmi Complecşi
cazul discret
Gândeşte-te la E1, E2, ..., En evenimente independente care se exclud
reciproc şi care se produc cu probabilităţile p1, p2, ..., pn astfel încât
p1 + p2 + + pn = 1 ( 7.83)
Un număr aleator, r, uniform distribuit în intervalul [0, 1) care satisface
relaţia:
p1 + p2 + + pi −1 ≤ r ≤ p1 + p2 + + pi ( 7.84)
va determina evenimentul Ei . Acesta este principiul fundamental al
metodei Monte Carlo aşa cum se aplică la cazul discret al unui număr
finit de evenimente.
cazul continuu
În cazul unei variabile x care variază continuu pe un interval [a, b), care
are probabilitatea p(x)dx ca x să se găsească în intervalul x, x+ dx şi
pentru care
b
∫ p( x )dx = 1
a
( 7.85)
relaţia
x
r = ∫ p(ξ )dξ ( 7.86)
a
124
Algoritmi Complecşi
7.8.2.1. Exemplul 1
Fie x uniform distribuit pe intervalul [a, b]. Atunci probabilitatea ca x să ia
valori în intervalul x, x+dx este p(x)dx = dx / (b-a). Aplicând principiul
metodei MC pentru cazul continuu
r =∫
x
dξ
=
(x − a ) ( 7.87)
a
b − a (b − a )
de unde
x = a + r (b − a ) ( 7.88)
ne dă legătura între numărul aleator r uniform distribuit pe intervalul [0,1)
şi mărimea de interes, x. Relaţia este folosită la calculul integralei prin
metode MC pentru obţinerea lui x şi y pe intervalele [a,b] şi, respectiv
[0,c] unde c este o valoare egală sau mai mare decât cea mai mare
valoare a lui f(x) în intervalul [a,b], presupunând că f ( x ) ≥ 0 în acest
interval.
Dacă vei analiza următorul program vei vedea că acesta calculează
1
∫
0
x dx prin prima metodă Monte Carlo – aşa cum aceasta a fost expusă
EX33.PAS
program intmc; {integrala prin metoda Monte Carlo}
const n=1000; a=0; b=1;
{n=numar de numere aleatoare de generat
a, b=limitele inferioara si superioara ale
integralei}
var i, r, n1:word;
x, y, smc:real;
function f(x:real):real;
begin
f:=sqrt(x); {functia de integrat}
end;
begin
n1:=0; randomize;
for i:=1 to n do
begin
x:=random(100)/100.; y:=random(100)/100.;
if y<=f(x) then n1:=n1+1;
end;
smc:=1.*n1/n; writeln(’ int.mc. = ’,smc:10:4);
readln;
end.
125
Algoritmi Complecşi
EX34.PAS
Figura 7.8
O sursă radioactivă uniform depusă pe un inel de raze R0 şi R1
127
Algoritmi Complecşi
EX35. PAS
program sursarad; {sursa radioactiva distribuita
uniform pe un inel de raze R0,R1}
uses graph;
const n=10; r0=50.; r1=70; {sau n=1000 sau orice
alta valoare in domeniul WORD}
{n=numar de numere aleatoare de generat si razele
inelului}
pi=3.14159;
var i:word;
x, y :array[1..n] of integer;
r, raza, teta:real;
procedure grafica;
var i:word; gd, gm:integer;
xc,yc:word;
begin
gd:=detect; Initgraph(gd,gm,’c:\tp\bgi’);
xc:=300; yc:=200;
{coordonatele centrului sistemului de referinta}
setbkcolor(15); setcolor(1);
moveto(0,yc); lineto(600,yc); outtextxy(610,yc,’X’);
{axe X}
moveto(xc,0); lineto(xc,400); outtextxy(xc,10,’Y’);
{axa Y}
circle(xc,yc,50); circle(xc,yc,70);
{cele 2 cercuri ce definesc inelul}
for i:=1 to n do
putpixel(xc+x[i],yc+y[i],4);
end; {end procedura grafica}
begin
randomize;
for i:=1 to n do
begin
r:=random(100)/100.; {r intre 0 si 1}
raza:=sqrt(r0*r0 +r*(r1*r1-r0*r0));
r:=random(100)/100.; {alt r intre 0 si 1}
teta:=2*pi*r;
x[i]:=trunc(raza*cos(teta));
y[i]:=trunc(raza*sin(teta));
end;
{for i:=1 to n do writeln(x[i]:10,y[i]:10); readln;}
grafica;
readln;
end.
128
Algoritmi Complecşi
129
Algoritmi Complecşi
130
Algoritmi Complecşi
Formule cheie
Scrierea poziţională
N = d n −1 ⋅ r n −1 + d n − 2 ⋅ r n − 2 + + d1 ⋅ r 1 + d0 ⋅ r 0 + d −1 ⋅ r −1 + + d − m ⋅ r − m
Formula rădăcinii aproximative iterate în metoda Newton
F (x n −1 )
x n = x n −1 −
F' (x n −1 )
Integrarea numerică prin metoda trapezelor
h
I ≈ ITrapeze = (y 0 + 2 y 1 + 2 y 2 + + 2 y n −2 + y n −1 + y n )
2
y i = f (a + ih )
Integrare Runge Kutta de ordin 4
h
y m +1 = y m + (k1 + 2 k 2 + 2 k 3 + k 4 )
6
k1 = f (x m , y m )
k = f x + h , y + hk1
2 m m
2 2
k = f x + h , y + hk 2
3
m
2
m
2
k 4 = f (x m + h, y m + hk 3 )
131
Algoritmi Complecşi
7.13. Bibliografie
132
Prelucrarea statistică a datelor experimentale
Unitatea de învăţare 8
PRELUCRAREA STATISTICĂ A DATELOR EXPERIMENTALE
Cuprins Pagina
8. PRELUCRAREA STATISTICĂ A DATELOR RXPERIMENTALE 133
8.1. Obiectivele Unităţii de învăţare 8
Prelucrarea statistică a datelor experimentale 134
8.2. Valoare medie, varianţă, abatere standard 134
8.3. Propagarea erorilor 137
8.4. Distribuţii 139
8.4.1. Distribuţia binomială 140
8.4.2. Distribuţia Poisson 141
8.4.3. Distribuţia Gauss 146
8.5. Metode de fit 149
8.5.1. Metoda celor mai mici pătrate pentru o dreaptă 149
8.5.2. Metoda celor mai mici pătrate pentru un polinom de grad 3 154
8.6. Test de autoevaluare 159
8.7. Răspunsuri la testul de autoevaluare 1 160
8.8. Termeni şi expresii cheie. Formule cheie 160
8.9. Lucrare de verificare 162
8.10. Bibliografie 162
133
Prelucrarea statistică a datelor experimentale
134
Prelucrarea statistică a datelor experimentale
1 N
x= ∑ xi
N i =1
( 8.1)
( 8.5)
σ =
x N ∑
2 1
( N
i =1
2
) 2
2
xi − 2 xi x + x = x − x > 0
2
de unde şi
2
x2 > x ( 8.6)
adică media pătratelor este mai mare decât pătratul mediei unui şir de
valori.
Pentru caracterizarea împrăştierii se mai folosesc şi mărimile
σ x = ∆2 ( 8.7)
numită abatere standard şi abaterea standard relativă definită de:
∆2
εx = ( 8.8)
x
numită şi fluctuaţie.
Sumele se fac pe N valori ale probei măsurate. În general însă valoarea
medie nu este cunoscută; x este o estimare a ei şi de aceea
σ x2 =
1 N
∑
N − 1 i =1
( )
xi − x
2
( 8.9)
135
Prelucrarea statistică a datelor experimentale
σx
σx = ( 8.10)
N
Astfel crescând numărul de măsurări ale mărimii x, varianţa σ x2 nu se
schimbă (exceptând mici fluctuaţii) deoarece numitorul şi numărătorul
ecuaţiei (8.5) sau (8.9) cresc mai mult sau mai puţin proporţional, aceasta
întrucât σ x2 se presupune a fi o estimare a varianţei întregii populaţii care
este clar independentă de dimensiunea probei N. Pe de altă parte,
varianţa valorii medii σ x2 / N descreşte cu creşterea lui N; mai multe date
ajută la localizarea valorii medii cu o precizie mai înaltă.
Uneori măsurările sunt grupate astfel încât o aceeaşi valoare a xj apare
în mj evenimente. Atunci ecuaţiile (8.1) şi (8.9) se scriu
∑m x
j
j j
x= ( 8.11)
∑m j
j
şi
∑ m (x )
2
j j −x
j
σ x2 = ( 8.12)
∑ m j −1
j
Varianţa asupra valorii medii este
σ x2
u2 = ( 8.13)
∑m j
j
136
Prelucrarea statistică a datelor experimentale
şi
1 1
=∑ ( 8.18)
σ 2
σ i2
Astfel rezultatul experimentului i urmează a fi ponderat cu un factor 1 / σ i2
. Într-un anume sens, 1 / σ i2 dă o măsură a informaţiei conţinute de acel
experiment particular.
Când diferitele experienţe de măsură realizează diferite precizii σi folosind
aceleaşi aparate dar repetând măsurarea de ni ori şi mediind, atunci
1
σi ≈ ( 8.19)
ni
şi formulele de mai sus devin
a = ∑ n i ai / ∑ n i
( 8.20)
N = ∑ n i
Prima din relaţiile de mai sus spune că fiecare din măsurările originale de
precizie egală este egal ponderată; a doua este evidentă.
σ f = (∆ij f ) = ∑∑ ∆i +
2
∆j
N i j ∂x ∂y
2 1 ∂f
2
∂f
2
σ f = ∑ (∆i ) + ∑ (∆ j )
2 2
( 8.23)
N
∂ x i ∂y j
2 2
2 ∂f 2 ∂f 2
σ f = ∂x σ x + ∂y σ y
conform definiţiei (8.5) şi a faptului că suma produselor ∆i ∆j conţine
termeni ce se vor anula.
137
Prelucrarea statistică a datelor experimentale
138
Prelucrarea statistică a datelor experimentale
function dft(h,t:real):real;
begin
dft:=-2*f(h,t)/t;
end;
begin
write(’ introdu nr. de variabile ’); readln(m);
write(’ introdu numarul de seturi de
masuratori,n=’); readln(n);
{n este numarul de masuratori asupra lui h si t} for
i:=1 to m do
{in cazul nostru m=2}
begin
writeln(’ introdu valorile x[’,i,’]’); {x[1] sunt
valorile h, aici}
for j:=1 to n do read(valx[j]); {x[2] sunt valorile t,
aici} med_abstd(valx,n,xmediu[i],sigx2[i]);
end;
fmediu:=f(xmediu[1],xmediu[2]); {fmediu este g aici}
sig1fm2:=sqr(dfh(xmediu[1],xmediu[2]));
sig2fm2:=SQR(dft(xmediu[1],xmediu[2]));
sigfm2:=sig1fm2*sigx2[1]+sig2fm2*sigx2[2]; writeln(’
h=’,xmediu[1]:10:2,’+/-’,SQRT(sigx2[1]):10:2);
writeln(’
t=’,xmediu[2]:10:2,’+/-’,SQRT(sigx2[2]):10:2);
writeln(’
g=’,fmediu:10:2,’+/-’,SQRT(sigfm2):10:2); readln;
readln;
end.
8.4. Distribuţii
în cadrul unei măsurări se încearcă obţinerea valorii ’adevărate’ a mărimii
fizice. Ceea ce obţii de obicei este valoarea medie care este o
aproximaţie a valorii adevărate cu atât mai bună cu cât numărul de
măsurări este mai mare. Dar valoarea pentru mărimea fizică măsurată
deşi nu este unică nu este totuşi liberă a fi oricare. Ea are o distribuţie
care de obicei poate fi aproximată cu o funcţie matematică simplă numită
funcţie densitate de probabilitate, p(x), sau funcţie de distribuţie.
Aceasta înseamnă că probabilitatea de a obţine o valoare x în intervalul
(x, x+dx) este dată de p(x)dx dacă variabila x variază continuu şi de p(xi )
pentru xi dacă x are valori discrete.
Funcţia de distribuţie satisface condiţia
∞
∫ p( x )dx = 1
−∞
( 8.25)
∑ p( x
i =1
i ) =1 ( 8.26)
139
Prelucrarea statistică a datelor experimentale
−∞
∞
( 8.29)
< x 2 >= x 2 ⋅ p( x ) ⋅ dx
∫
−∞
respectiv
N
σ 2 = ∑ (x i − µ )2 ⋅ p( x i ) ( 8.30)
i =1
p1 + p2 + + ps = 1 ( 8.33)
140
Prelucrarea statistică a datelor experimentale
k = ∑ k 2
⋅ P ( k ) = ∑ [k (k − 1) + k ]P( k )
k =0 k =0 ( 8.37)
2
k = N (N − 1)p + Np = Np(1 − p ) + N p
2 2 2
şi
2
σ 2 = k 2 − k = Npq + N 2 p 2 − N 2 p 2 = Npq ( 8.38)
Valoarea aşteptată a lui k ( realizarea evenimentului de probabilitate p)
fiind k = Np putem estima p ca raportul k / N şi de asemeni o aproximaţie
a varianţei cu
N k k
s2 = N 1 − ( 8.39)
N −1 N N
Din relaţiile (8.34) şi (8.38) se vede că σ 2 < k egalitatea realizându-se
doar pentru p=0. Astfel în general varianţa este mai mică decât valoarea
aşteptată. Aceasta deoarece N impune o limită superioară asupra lui k,
limită ce reduce dispersia distribuţiei în k. De exemplu dacă p=1 atunci
singura valoare diferită de zero a lui P este cea pentru k = N ( avem doar
reuşite) şi deci σ = 0. Dacă p este foarte mic, limita superioară impusă de
N nu e importantă şi σ 2 ≈ k Similar pentru p aproape egal cu 1,
constrângerea asupra numărului de nereuşite nu este importantă şi
varianţa în numărul de nereuşite (care evident este egală cu varianţa
numărului de reuşite ) este aproximativ egală cu numărul de nereuşite.
Distribuţia binomială are o formă greoaie pentru aplicaţii în fizica nucleară
din cauza factorialelor care sunt greu de calculat în cazul numerelor mari.
Din această cauză experienţa a impus găsirea altor funcţii de distribuţie
mai comode diferitelor aplicaţii.
p → 0 , N → ∞, dar Np = m ( cons tan t ) ( 8.40)
distribuţia binomială trece în distribuţie Poisson
N → ∞, p = cons tan t ( 8.41)
distribuţia binomială trece în distribuţie Gauss.
141
Prelucrarea statistică a datelor experimentale
P ( k ) = 1 −
k ! (N − k )! N N
( 8.43)
N (N − 1) (N − k + 1) m
k N −k
m
P ( k ) = 1 −
k! N N
Dacă N este foarte mare atunci
N (N − 1) (N − k + 1)
lim
N →∞ Nk
=1 ( 8.44)
şi
N −k N
m m
lim 1 −
N →∞ N
= lim 1 − = e −m
N →∞ N
( 8.45)
∑n k i i
m= i =0
k max
( 8.47)
∑n
i =0
i
rezultă
∞
∑ p(k ) = 1
k =0
( 8.50)
142
Prelucrarea statistică a datelor experimentale
k = ∑
k =0
k 2
p ( k ) = ∑ [k (k − 1) + k ]p(k )
k =0
( 8.52)
k 2 = m 2
∞
mk −2 −m ∞
m k −1 − m
∑
k = 0 (k − 2 )!
e + m ∑
k = 0 (k − 1)!
e = m2 + m
pk (t ) =
(µ ⋅ t )k e − µ ⋅t = (m )k e − m ( 8.55)
k! k!
probabilitatea de a observa k evenimente independente într-un interval
de timp t când viteza de numărare este µ şi numărul aşteptat de
143
Prelucrarea statistică a datelor experimentale
EX37.PAS
program distr_Poisson;
uses graph;
type vector=array[0..10] of integer;
const k:vector=(0,1,2,3,4,5,6,7,8,9,10);
nk:vector=(5,10,30,60,76,85,72,50,30,15,4);
{ nk:vector=(35,70,98,100,70,40,30,20,10,5,2);}
{ nk:vector=(70, 90, 50, 30, 10, 5, 0, 2,0,0,0);}
{ nk:vector=(48,90,90,50,30,10,5,2,1,0,1);}
label unu, doi, trei;
var nkmax, kmax, snk,sknk:integer;
cx:array[0..10] of string[2];
kmediu, sigk, scy, sknk1:real;
niuk:vector;
i, scx, gd, gm, ix, iy1, iy2:integer;
g:char;
begin
sknk:=0; snk:=0; kmax:=10;
for i:=0 to kmax do
begin
sknk:=sknk+nk[i]*k[i]; snk:=snk+nk[i];
end;
kmediu:=1.*sknk/snk;sknk1:=0;
writeln(’kmediu=’,kmediu:6:2);
for i:=0 to kmax do sknk1:=sknk1+sqr(k[i]-
kmediu)*nk[i]; sigk:=sqrt(1.*sknk1/snk);
niuk[0]:=round(snk*exp(-kmediu));
for i:=1 to kmax do niuk[i]:=round(niuk[i-
1]*kmediu/i);
writeln(’k n(k) niu(k) ’);
writeln;
for i:=0 to kmax do writeln(k[i]:7,nk[i]:7,
niuk[i]:7);
trei: write(’ doriti histograma? (d/n)’);
readln(g); if upcase(g)=’N’ then goto unu;
if upcase(g)=’D’ then goto doi;
goto trei;
doi: nkmax:=nk[0]; if nkmax<niuk[0] then
nkmax:=niuk[0];
for i:=1 to kmax do
begin
if nkmax<nk[i] then nkmax:=nk[i];
if nkmax<niuk[i] then nkmax:=niuk[i];
end;
144
Prelucrarea statistică a datelor experimentale
scx:=50;scy:=300./nkmax;gd:=detect;
initgraph(gd,gm,’\tp\bgi’);
setlinestyle(0,0,1);line(10,330,10+scx*(kmax+1),330);
line(10,330,10,330-round(scy*nk[0]));moveto(10,330-
round(scy*nk[0]));
linerel(scx,0); for i:=1 to kmax do
begin
ix:=10+i*scx; iy1:=330-round(scy*nk[i-1]);
iy2:=330-round(scy*nk[i]);
line(ix,iy1,ix,iy2);
moveto(ix,iy2);linerel(scx,0);
end;
moveto((kmax+1)*scx+10,iy2);lineto((max+1)*scx+10,330)
; setlinestyle(1,0,1);line(10,330,10,330-
round(scy*niuk[0])); moveto(10,330-
round(scy*niuk[0]));linerel(scx,0);
for i:=1 to kmax do
begin
ix:=10+i*scx; iy1:=330-round(scy*niuk[i-1]);
iy2:=330-round(scy*niuk[i]);
line(ix,iy1,ix,iy2);
moveto(ix,iy2);linerel(scx,0);
end;
moveto((kmax+1)*scx+10,iy2);lineto((kmax+1)*scx+10,330
);
for i:=0 to kmax do
begin
str(i,cx[i]); outtextxy(35+i*scx, 335,cx[i]);
end;
repeat until keypressed; closegraph;
unu:end.
Figura 8.1
Distribuţii Gauss cu µ = 1 şi diferite σ
145
Prelucrarea statistică a datelor experimentale
Distribuţia normală sau distribuţia Gauss este distribuţia cea mai des
folosită în prelucrarea datelor experimentale. Forma sa este
( x − µ )2
1 − 2
p( x ) = e 2σ ( 8.57)
σ 2π
Aşa cum vezi, forma sa este determinată de doi parametri independenţi,
µ şi σ. Reţine câteva dintre proprietăţile distribuţiei Gauss
∫ p( x )dx = 1
−∞
( 8.58)
∫e
−u 2
du = π )
−∞
Aşa cum vezi, pentru o mărime, ale cărei valori sunt distribuite Gauss,
valoarea ei apare cu o probabilitate de:
• 69,3 % în intervalul (µ−σ, µ+σ)
• 95,4 % în intervalul (µ−2σ, µ+2σ)
• 99,7 % în intervalul (µ−3σ, µ+3σ)
Înţelegi că vei greşi foarte puţin ( cu mai puţin de 0,3%) dacă „arunci”
valorile ce nu aparţin intervalului (µ−3σ, µ+3σ).
146
Prelucrarea statistică a datelor experimentale
EX38.PAS
program distr_Gauss;
uses graph;
type fct=function(x:real):real;
const pi=3.14159; n=51;
xm:array[1..10]of real
=(11.,12.,13.,14.,15.,13.,12.,14.,13.,13);
var x,y:array[1..100] of real;
s,xmediu,sigx,xmin,xmax,dx,xscal,yscal:real;
r:array[1..3] of real;
i:byte;
gd,gm,nxx,nyy:integer;
nx,ny:array[1..100] of integer;
maxx,maxy:integer;
{$F+}
function gauss(x:real):real;
begin
gauss:=EXP(-sqr(x-xmediu)/2/sigx/sigx);
end; {end Gauss}
{$F-}
{$i simpson.inc}
BEGIN
s:=0;for i:=1 to 10 do s:=s+xm[i]; xmediu:=s/10;
writeln(’xmediu=’,xmediu);
s:=0; for i:=1 to 10 do s:=s+sqr(xm[i]-xmediu);
sigx:=sqrt(s/10);
writeln(’sigx=’,sigx); readln;
for i:=1 to 3 do
begin
xmin:=xmediu-i*sigx;
xmax:=xmediu+i*sigx;
r[i]:=simpson(xmin,xmax,20,gauss)/sigx/sqrt(2*pi);
writeln(’probabilitatea ca o valoare x sa cada’);
writeln(’in intervalul xmediu-’,i,’*sigx -
xmediu+’,i,’*sigx=’,r[i]);
end;
readln;
writeln(’ urmeaza reprezentarea grafica a
distr. Gauss a valorilor x’);
readln;
dx:=6*sigx/51;
xscal:=n/sigx/2;
yscal:=300*sigx*sqrt(2*pi);
writeln(’xscal=’,xscal,’ yscal=’,yscal);
147
Prelucrarea statistică a datelor experimentale
for i:=1 to n do
begin
x[i]:=xmediu-(n div 2+1-i)*dx;
y[i]:=gauss(x[i])/sigx/sqrt(2*pi);
nx[i]:=trunc(x[i]*xscal+0.5);nxx:=nx[i];
ny[i]:=trunc(y[i]*yscal+0.5);nyy:=ny[i];
end;
readln;
gd:=detect;
InitGraph(gd,gm,’c:\tp\bgi’);setbkcolor(1);
line(10,400,600,400);{axa X} outtextxy(600,400,’x’);
line(10,0,10,400);{axa Y} outtextxy(0,10,’y’);
setlinestyle(userbitln,$aa,normwidth);setcolor(14);
line(nx[27],400,nx[27],0);{axa ce marcheaza xmediu}
outtextxy(nx[27]-20,410,’xmediu’);
line(10,400-trunc(ny[26]*0.5),600,400-
trunc(ny[26]*0.5));
{axa ce marcheaza dispersia }
for i:=1 to n do outtextxy(nx[i],400-ny[i],’+’);
readln; end.
Fişierul simpson.inc conţine:
function simpson(a, b:real; n:integer; f:fct):real;
var s, h:real;
i:integer;
begin
h:=(b-a)/n/2; s:=f(a)+f(b);
i:=1;
while i < 2*n do begin
if i mod 2 = 0 then s:=s + 2*f(a+i*h)
else s:=s+4*f(a+i*h);
i:=i+1 end;
simpson:=s*h/3;
end; {end simpson}
148
Prelucrarea statistică a datelor experimentale
este adesea mai mare decât cea dată de distribuţia Gauss. Acest efect
este de asemeni probabil să rezulte din creşterea artificială a estimării
asupra semnificaţiei deviaţiilor observate.
S=∑
n
(y i − a ⋅ xi − b )2 = minim ( 8.65)
i =1 σ i2
Pentru găsirea minimului expresiei, trebuie determinate punctele critice,
în care derivatele parţiale se anulează, adică, succesiv
∂S
=0 ( 8.66)
∂a
din care rezultă
n
x2 n
x n
x ⋅y
a∑ i2 + b∑ i2 − ∑ i 2 i = 0 ( 8.67)
i =1 σi i =1 σi i =1 σi
şi
∂S
=0 ( 8.68)
∂b
din care rezultă
n
x n
1 n
y
a ∑ i2 + b∑ 2 − ∑ 2i = 0 ( 8.69)
i =1 σi i =1 σi i =1 σi
Ansamblul relaţiilor(8.67)(8.69) formează un sistem de 2 ecuaţii cu 2
necunoscute, a şi b. Notând
1
= pi ( 8.70)
σi2
149
Prelucrarea statistică a datelor experimentale
∑ i i ∑ ∑
2
a p ⋅ x + b p i ⋅ x i = p i ⋅x i ⋅ y i
i =1 i =1 i =1
n n n
( 8.71)
a p ⋅x + b p =
∑ ∑ ∑
i i i p i ⋅y i
i =1 i =1 i =1
cu soluţiile
n n n n
∑ p i ⋅ ∑ p i ⋅x i ⋅ y i − ∑ p i ⋅xi ⋅ ∑ p i ⋅y i
a = i =1 i =1 i =1 i =1
2
n
n
n
∑ p i ⋅ ∑ p i ⋅xi2 − ∑ p i ⋅xi
i =1 i =1 i =1
( 8.72)
n
n
n
n
∑ p i ⋅xi2 ⋅ ∑ p i ⋅y i − ∑ p i ⋅xi ⋅ ∑ p i ⋅xi ⋅ y i
i =1 i =1 i =1
b =
i =1
2
n
n
n
∑ p i ⋅ ∑ p i ⋅xi2 − ∑ p i ⋅xi
i =1 i =1 i =1
Dacă
σ1 = σ2 = ... = σn = σy ( 8.73)
atunci
p1 = p2 = ... = pn ( 8.74)
şi expresiile pentru a şi b devin cele întâlnite adesea în fitul cu o dreaptă
prin metoda celor mai mici pătrate
n n n
n ⋅ ∑ i i − ∑ xi ⋅ ∑ y i
x ⋅ y
a = i =1 i =1 i =1
2
n
2 n
n ⋅ ∑ xi − ∑ xi
i =1 i =1
( 8.75)
n 2 n n n
∑ xi ⋅ ∑ y i − ∑ xi ⋅ ∑ xi ⋅ y i
i =1 i =1 i =1 i =1
b = 2
n
n
n ⋅ ∑ xi2 − ∑ xi
i =1 i =1
Pentru a găsi erorile cu care sunt determinaţi parametrii a şi b ai dreptei
poţi aplica teorema de propagare a erorilor (8.24)
∂a
2
∂a
2
a = a( x, y ) ⇒ σ a = ⋅ σ x + ⋅ σ y2
2 2
∂x ∂y
2
( 8.76)
2
∂b ∂b
b = b( x, y ) ⇒ σ b = ∂x ⋅ σ x + ∂y ⋅ σ y
2 2 2
Cum am presupus că erori se fac doar în y rezultă că σx = 0 şi deci
150
Prelucrarea statistică a datelor experimentale
n
∂a
2
σ a = ∑
2
⋅ σ y2
i =1 ∂y i
2
( 8.77)
2 n
∂b
σ b = ∑ ∂y ⋅ σ y
2
i =1 i
cu
σ y1 = σ y 2 = = σ y n = σ y ( 8.78)
Cum
2
n
2 n ⋅ xi − ∑ xi
∂a i =1
= ( 8.79)
n
2
∂y i n
2
n ⋅ ∑ xi − ∑ xi
i =1 i =1
rezultă
n
σa = 2
⋅σ y ( 8.80)
n 2 n
n ⋅ ∑ xi − ∑ xi
i =1 i =1
La fel, din
2
n 2 n
2 ∑ xi − xi ∑ xi
∂b i =1
= i =1 ( 8.81)
n n
2
∂y i n ⋅ ∑ xi2 − ∑ xi
i =1 i =1
rezultă
n
∑x 2
i
σb = i =1
2
⋅σ y ( 8.82)
2
n
n
n ⋅ ∑ x i − ∑ x i
i =1 i =1
În EX39.PAS se află un program de fit pentru o dreaptă.
Datele luate din ((([6] tabelul 7.2))) se referă la înălţimea (în metri) şi
greutatea
(în kilograme) a 9 oameni cu vârstă cuprinsă între 25 şi 29 de ani. Se
presupune o eroare în aprecierea greutăţii de 1 Kg. Toate aceste date se
află în fişierul datehg.in
EX39.PAS
151
Prelucrarea statistică a datelor experimentale
assign(f,’datehg.in’); reset(f);
readln(f,n); for i:=1 to n do readln(f,x[i],y[i]);
readln(f,sigy);
sx:=0;sy:=0;sxy:=0;sx2:=0;{initializare pentru sume}
for i:=1 to n do
begin
sx:=sx+x[i]; sy:=sy+y[i]; sxy:=sxy+x[i]*y[i];
sx2:=sx2+x[i]*x[i];
end;
num:=n*sx2-sx*sx;{calcul numitor si verificare cu
0}
if num=0 then goto unu;
{calcul paramatrii dreptei}
a:=(n*sxy-sx*sy)/num; b:=(sx2*sy-sx*sxy)/num;
siga:=sqrt(n/num)*sigy; sigb:=sqrt(sx2/num)*sigy;
for i:=1 to n do z[i]:=a*x[i]+b; {punctele de pe
dreapta}
writeln(’ i ’,’ x ’,’ y ’,’ y=a*x+b ’);
{ scrie rezultate}
for i:=1 to n do
writeln(i:3,x[i]:10:2,y[i]:10:2,z[i]:10:2);
writeln(’ parametrii dreptei y=a*x+b sunt:’);
writeln(’a=’,a:8:2,’+/-’,siga:8:2);
writeln(’b=’,b:8:2,’+/-’,sigb:8:2);
writeln(’ doriti greutatea cea mai probabila ’);
writeln(’ pentru o anumita inaltime?
(d/n)’); readln(g);
if upcase(g)=’N’ then goto trei else
begin
end;
trei: write(’ doriti reprezentare grafica?(d/n)’);
readln(g);if upcase(g)=’N’ then goto doi;
if upcase(g)=’D’ then goto patru else goto
trei;
{rerprezentare grafica a dreptei si
punctelor experimentale}
patru: ymax:=y[1]; if ymax<z[1] then ymax:=z[1];
for i:=2 to n do
begin
if ymax<y[i] then ymax:=y[i];
if ymax<z[i] then ymax:=z[i];
end;
ymax:=ymax+10;
scx:=400./x[n]; scy:=300./ymax; {factori de scalare}
gd:=detect; InitGraph(gd,gm,’c:\tp\BGI’);
setbkcolor(15); setcolor(1);
152
Prelucrarea statistică a datelor experimentale
line(10,10,10,410); line(10,400,600,400);{axele X si
Y}
for i:=1 to n do
begin
px:=trunc(scx*x[i]+0.5);
py:=400-trunc(scy*y[i]+0.5);
sigpy:=trunc(scy*sigy+0.5); setcolor(3);
circle(px,py,trunc(sigpy*0.7*scy));
putpixel(px,py,4);
end;
setcolor(2);
line(0,400-trunc(scy*b),trunc(scx*3.+0.5),
400-trunc(scy*(a*3.+b)+0.5));
outtextxy(20,10,’Y’);outtextxy(600,400,’X’);
line(trunc(1.*scx),390,trunc(1.*scx),410);
outtextxy(trunc(1.*scx),415,’100cm’);
line(trunc(2.*scx),390,trunc(2.*scx),410);
outtextxy(trunc(2.*scx),415,’200cm’);
py:=trunc(scy*(a*1.+b)+0.5);
line(0,400-py,20,400-py);outtextxy(20,400-py,’33.51’);
py:=trunc(scy*(a*2.+b)+0.5);line(0,400-py,20,400-py);
outtextxy(20,400-py,’85.42’);
readln; closegraph; goto doi;
unu: writeln( ’ calcul imposibil’);
doi:end.
Figura 8.2
153
Prelucrarea statistică a datelor experimentale
9
1.57 61.24
1.63 63.50
1.63 71.21
1.68 69.85
1.73 68.95
1.78 73.03
1.83 78.93
1.88 81.65
1.93 78.93
Figura 8.1
n n n n
a 0 ⋅ N + a 1 ∑ x i + a 2 ∑ x 2
i + a 3 ∑ x 3
i = ∑ yi
i =1 i =1 i =1 i =1
n n n n n
0 ∑ i 1∑ i 2∑ i 3∑ i ∑
2 3 4
a ⋅ x + a x + a x +a x = xi ⋅ y i
i =1 i =1 i =1 i =1 i =1
n n n n n
( 8.86)
a ⋅ x 2 + a
0 ∑ 1 ∑ x i +a2 ∑ x i +a3 ∑ x i = ∑ x i ⋅ y i
3 4 5 2
i
i =1 i =1 i =1 i =1 i =1
n n n n n
a ⋅ x 3 + a
0 ∑ 1∑ i 2∑ i 3∑ i ∑
4 5 6
i x +a x + a x = x i3 ⋅ y i
i =1 i =1 i =1 i =1 i =1
154
Prelucrarea statistică a datelor experimentale
Procedura
gaussj(var a:glnpbynp; n,np:integer; var b:glnpbymp;
m,mp:integer)
din [7] cere ca programul principal ce o foloseşte să definească tipurile:
type glnpbynp=array[1..np,1..np] of real;
glnpbymp=array[1..np,1..mp] of real;
glnp=array[1..np] of integer;
a este matricea coeficienţilor şi are dimensiunea npXnp
n este numărul de ecuaţii ale sistemului, n < np
b este matricea termenilor liberi, de dimensiune npXmp atunci când cu
aceeaşi matrice a se rezolvă mai multe (m) sisteme de ecuaţii ce diferă
prin termenii liberi (în cazul nostru matricea b are o singură coloană).
PROCEDURE gaussj(VAR a: glnpbynp; n,np: integer;
VAR b: glnpbymp; m,mp: integer);
VAR
big,dum,pivinv: real;
i,icol,irow,j,k,l,ll: integer;
indxc,indxr,ipiv: glnp;
BEGIN
FOR j := 1 to n DO BEGIN ipiv[j] := 0 END;
FOR i := 1 to n DO BEGIN
big := 0.0; FOR j := 1 to n DO BEGIN
IF (ipiv[j] <> 1) THEN BEGIN
FOR k := 1 to n DO BEGIN
IF (ipiv[k] = 0) THEN BEGIN
IF (abs(a[j,k]) >= big) THEN BEGIN
big := abs(a[j,k]); irow := j; icol := k
END
END ELSE IF (ipiv[k] > 1) THEN BEGIN
writeln(’pause 1 in GAUSSJ - singular matrix’);
readln
END
END
END
END;
ipiv[icol] := ipiv[icol]+1;
IF (irow <> icol) THEN BEGIN
FOR l := 1 to n DO BEGIN
dum := a[irow,l]; a[irow,l] := a[icol,l];
a[icol,l] := dum
END;
FOR l := 1 to m DO BEGIN
dum := b[irow,l]; b[irow,l] := b[icol,l];
b[icol,l] := dum
END
END;
indxr[i] := irow; indxc[i] := icol;
IF (a[icol,icol] = 0.0) THEN BEGIN
writeln(’pause 2 in GAUSSJ - singular matrix’);
readln
END;
pivinv := 1.0/a[icol,icol]; a[icol,icol] := 1.0;
155
Prelucrarea statistică a datelor experimentale
FOR l := 1 to n DO BEGIN
a[icol,l] := a[icol,l]*pivinv
END;
FOR l := 1 to m DO BEGIN
b[icol,l] := b[icol,l]*pivinv
END;
FOR ll := 1 to n DO BEGIN
IF (ll <> icol) THEN BEGIN
dum := a[ll,icol]; a[ll,icol] := 0.0;
FOR l := 1 to n DO BEGIN
a[ll,l] := a[ll,l]-a[icol,l]*dum
END;
FOR l := 1 to m DO BEGIN
b[ll,l] := b[ll,l]-b[icol,l]*dum
END
END
END
END;
FOR l := n DOWNTO 1 DO BEGIN
IF (indxr[l] <> indxc[l]) THEN BEGIN
FOR k := 1 to n DO BEGIN
dum := a[k,indxr[l]];
a[k,indxr[l]] := a[k,indxc[l]];
a[k,indxc[l]] := dum
END
END
END
END;
Fişierul ’polinom3.dat’:
21
0. 1.00762 5. 1.00392 10. 1.00153 15. 1.00000 20. 0.99907
25. 0.99852 30. 0.99826 35. 0.99818 40. 0.99828 45. 0.99849
50. 0.99878 55. 0.99919 60. 0.99967 65. 1.00024 70. 1.00091
75. 1.00167 80. 1.00253 85. 1.00351 90. 1.00461 95. 1.00586
100. 1.00721
Figura 8.2
156
Prelucrarea statistică a datelor experimentale
EX40.PAS
program mcmp_polinom;
uses graph;
const np=10; mp=10;
type glnpbynp=array[1..np,1..np] of real;
glnpbymp=array[1..np,1..mp] of real;
glnp=array[1..np] of integer;
var x, y, yt:array[1..30] of real;
a:glnpbynp; b:glnpbymp;
i, j, n:byte; gd, gm:integer;
px, py, pyt:integer;
scx, scy, ymin, ymax:real;
sx6, sx5, sx4, sx3, sx2, sx, sx3y, sx2y, sxy,
sy:real;
a0, a1, a2, a3:real;
f:text; numef:string;
BEGIN
write(’introdu nume fisier cu date de \intrare:’);
readln(numef);
assign(f,numef); reset(f); readln(f,n);
for i:=1 to n do read(f,x[i],y[i]); close(f);
sx6:=0;sx5:=0;sx4:=0;sx3:=0;sx2:=0;
sx:=0;sx3y:=0;sx2y:=0;sxy:=0;sy:=0;
for i:=1 to n do
begin
sx6:=sx6+sqr(x[i])*sqr(x[i])*sqr(x[i]);
sx5:=sx5+ sqr(x[i])*sqr(x[i])*x[i];
sx4:=sx4+sqr(x[i])*sqr(x[i]);
sx3:=sx3+sqr(x[i])*x[i];
sx2:=sx2+sqr(x[i]);
sx:=sx+x[i]; sx3y:=sx3y+sqr(x[i])*x[i]*y[i];
sx2y:=sx2y+sqr(x[i])*y[i]; sxy:=sxy+x[i]*y[i];
sy:=sy+y[i];
end;
a[1,1]:=n; a[1,2]:=sx; a[1,3]:=sx2; a[1,4]:=sx3;
b[1,1]:=sy;
a[2,1]:=sx; a[2,2]:=sx2; a[2,3]:=sx3; a[2,4]:=sx4;
b[2,1]:=sxy;
a[3,1]:=sx2; a[3,2]:=sx3; a[3,3]:=sx4; a[3,4]:=sx5;
b[3,1]:=sx2y;
a[4,1]:=sx3; a[4,2]:=sx4; a[4,3]:=sx5; a[4,4]:=sx6;
b[4,1]:=sx3y;
writeln(’matricea a este:’); for i:=1 to 4 do
begin
for j:=1 to 4 do
write(a[i, j]:17:1);
writeln;
end;
readln; writeln(’matricea b este:’);
for i:=1 to 4 do writeln(b[i,1]:15:5); readln;
157
Prelucrarea statistică a datelor experimentale
gaussj(a,4,np,b,1,mp);
writeln(’parametrii polinomului
y=a0+a1*x+a2*x^2+a3*x^3 sunt:’);
a0:=b[1,1]; a1:=b[2,1];
a2:=b[3,1]; a3:=b[4,1];
writeln(’a0=’,a0,’ a1=’,a1);
writeln(’a2=’,a2,’ a3=’,a3); readln;
writeln(’ i x y yt’);
for i:=1 to n do
yt[i]:=a0+a1*x[i]+a2*x[i]*x[i]+a3*sqr(x[i])*x[i];
for i:=1 to n do writeln(i:3, x[i]:10:1, y[i]:10:5,
yt[i]:10:5);
ymin:=1.E30; ymax:=-1.E30;
for i:=1 to n do
begin
if ymin > y[i] then ymin:=y[i];
if ymin > yt[i] then ymin:=yt[i];
if ymax < y[i] then ymax:=y[i];
if ymax < yt[i] then ymax:=yt[i];
end;
writeln(’ymin=’, ymin, ’ ymax=’, ymax); READLN;
scy:=300/(ymax-ymin); scx:=6.;
gd:=detect;InitGraph(gd,gm,’\tp\bgi’);
setcolor(3);
for i:=1 to n do
begin
px:=trunc(scx*x[i]+0.5);
py:=400+trunc(scy*ymin+0.5)-trunc(scy*y[i]+0.5);
pyt:=400+trunc(scy*ymin+0.5)-trunc(scy*yt[i]+0.5);
circle(px+5, py, 2); putpixel(px+5, pyt, 2);
end;
readln; pyt:=400+trunc(scy*ymin+0.5)-trunc(scy+0.5);
line(trunc(scx*x[1])+5, pyt, trunc(scx*x[n])+5, pyt);
{axaX}
outtextxy(trunc(scx*x[n])+10,pyt,’X’);line(trunc(scx*x
[1])+5,
pyt,trunc(scx*x[1])+5, 400-pyt); {axa Y}
outtextxy(trunc(x[1]*scx)+5,400-pyt-10,’Y’);
px:=trunc(scx*(x[n]-x[1]));
line(px,pyt-10,px,pyt+10);outtextxy(px,pyt+20,’1.’);
px:=trunc(scx*((x[n]-x[1])/2));
line(px+10,pyt-
10,px+10,pyt+10);outtextxy(px,pyt+20,’0.5’);
px:=trunc(scx*x[1])+5;
line(px,pyt-10,px,pyt+10);outtextxy(px,pyt+20,’0.’);
outtextxy(px-5,pyt-5,’1. ’); readln; closegraph;
END.
158
Prelucrarea statistică a datelor experimentale
Figura 8.5
fitul datelor cp (T ) cu un polinom de grad 3
Figura 8.5 arată cât de bine sunt fitate datele cu un polinom de grad 3.
Cercurile albe reprezintă datele experimentale, iar punctele sunt valorile
rezultate din fitul datelor cu un polinom de grad 3
Răspunsurile le
găseşti la pagina 160
159
Prelucrarea statistică a datelor experimentale
1
1. m = (1 + 2 + 3 + 4 + 5 + 6) = 21 .
6 6
2. 315 / 108
2
∂f
m
2
3. σ = ∑
f
2
σ k
k =1 ∂x x
n n n n
∑ p i ⋅ ∑ p i ⋅x i ⋅ y i − ∑ p i ⋅x i ⋅ ∑ p i ⋅y i
5. a =
i =1 i =1 i =1 i =1
2
n
n
n
∑ p i ⋅ ∑ p i ⋅x i2 − ∑ p i ⋅x i
i =1 i =1 i =1
160
Prelucrarea statistică a datelor experimentale
Formule cheie
1 N
Formula de calcul a mediei x = ∑ xi
N i =1
Formula de calcul a abaterii pătratice medii
2
σ
x = ∆ 2
=
1 N 2 1 N
∑
N i =1
∆i = ∑ x i − x
N i =1
( 2
)
σ 2 = 1
x ∑
N
N i =1
( 2
)
2
x i2 − 2 x i x + x = x 2 − x > 0
Distribuţia binomială
N!
p k (1 − p )
N −k
P( k ) =
k ! (N − k )!
m k −m
Distribuţia Poisson p( k ) = e
k!
Distribuţia Gauss
( x − µ )2
1 − 2
p( x ) = e 2σ
σ 2π
Dreapta de fit
n n n
n ⋅ ∑ i i − ∑ xi ⋅ ∑ y i
x ⋅ y
a = i =1 i =1 i =1
2
n
2 n
n ⋅ ∑ xi − ∑ xi
i =1 i =1
n
2
n
n n
∑ xi ⋅ ∑ y i − ∑ xi ⋅ ∑ xi ⋅ y i
i =1 i =1 i =1 i =1
b = 2
n 2 n
n ⋅ ∑ xi − ∑ xi
i =1 i =1
161
Prelucrarea statistică a datelor experimentale
8.10. Bibliografie
162
Simularea unui experiment de fizică
Unitatea de învăţare 9
SIMULAREA UNUI EXPERIMENT DE FIZICĂ
Cuprins Pagina
Bibliografie 179
163
Simularea unui experiment de fizică
În 1910 cei mai mulţi fizicieni ajunseseră să creadă că atomii sunt formaţi
din sarcini electrice pozitive şi negative şi că forţele de atracţie şi repulsie
dintre aceste sarcini electrice sunt responsabile de toate fenomenele
fizice şi chimice în solide, lichide, gaze. Deoarece se ştia că electronii
sunt prezenţi în toate aceste forme ale materiei, părea rezonabil a
presupune că fiecare atom constă dintr-o combinaţie de sarcini pozitive şi
negative. Mişcările de vibraţie ale electronilor într-un astfel de atom ar fi
explicat emisia undelor electromagnetice şi, deci, emisia luminii de către
atom. Totuşi atât aranjarea sarcinilor electrice în atom cât şi mecanismul
care să explice caracteristicile de culoare ale luminii emise au rămas un
mister până când E.Rutherford a descoperit nucleul atomic şi Niels Bohr
a dat cuantificarea stărilor atomice. Un atom constă dintr-un număr de
electroni, să zicem Z electroni, dispuşi într-un nor de sarcini pozitive.
Norul este greu având aproape întreaga masă a atomului. Sarcina
pozitivă în nor este +Ze astfel că ea neutralizează sarcina negativă - Ze,
a celor Z electroni. Intr-un atom neperturbat electronii se află
în poziţiile lor de echilibru unde atracţia norului asupra electronilor este
anulată de repulsia lor reciprocă. Dar dacă electronii sunt perturbaţi, să
zicem prin ciocnire, atunci ei vor avea o mişcare de oscilaţie în jurul
164
Simularea unui experiment de fizică
165
Simularea unui experiment de fizică
Figura 9.1
Mv 2 Z Z e2
Ecin = = 1 2 ( 9.1)
2 4πε 0rmin
cu e 2 / 4πε 0 = 1.44MeV ⋅ fm , E α = 6.4MeV , Z 1 = 2, Z 2 = 79 se obţine
rmin = 35,5fm adică o distanţă de ≈ 3.610−14 m sau ≈ 1/106 din
dimensiunea atomului.
−1
dθ L 2 L2 2
= 2 E − U − ( 9.6)
dr µr µ 2µr 2
166
Simularea unui experiment de fizică
Figura 9.2
167
Simularea unui experiment de fizică
168
Simularea unui experiment de fizică
EX41.PAS
169
Simularea unui experiment de fizică
170
Simularea unui experiment de fizică
outtextxy(610,yc,’X’);
setfillstyle(1,1);
fillellipse(xc,yc,trunc(rint+0.5),trunc(rint+0.5));
outtextxy(xc-10,yc+10,’A2=’+a2c);
outtextxy(xc-10,yc+30,’Z2=’+z2c);
outtextxy(10,50,’miscarea particulei alpha in
campul Coulomb al nucleului Z2, A2’);
outtextxy(10,70,’energia’+elabc+’MeV’);
outtextxy (500,330,’dmin=’+stdim+’fm’);
outtextxy(470,30,’unghiul de deviatie’);
171
Simularea unui experiment de fizică
{$i rk4.inc}
BEGIN
clum2:=clum*clum;
{ marimi ce caracterizeaza sist.de ioni grei}
write( ’a si z pentru tinta: ’); readln( a2, z2);
str(a2:5:1,a2c);str(z2:5:1,z2c);
write(’elab=’); readln( elab );
{calcul constante ce depind de sistemul de ioni
grei}
ared:=a1*a2/(a1+a2)*amu;
cm:=clum2/ared;
rint:=1.5*putere(a2,p13);
cz:=z1*z2*e2c2/ared;
cb:=hc/ared/sqrt(2*elab/a1/amu);
cw:=hc*clum/ared; ecm:=a2/(a1+a2)*elab;
cs:=z1*z2*e2/2./ecm;
cs2:=cs*cs; vinit:=clum*sqrt(2*elab/a1/amu);
writeln(’ a2=’,a2:5:1,’ z2=’,z2:5:1);
writeln(’ elab=’,elab:10:2,’ ecm=’,ecm:10:2,
ared=’,ared:10:2 ,’ rint=’,rint:10:2);
ndim:=trunc((tf-t0)/dt); writeln(’ndim=’,ndim:5);
dmin:=z1*z2*e2/2/ecm;
str(dmin:6:2,stdim); str(elab:6:1,elabc);
unu: nparc:=10;
for i:=1 to nparc do
begin
if i<= 3 then bcioc[i]:=2*i else bcioc[i]:=3*i;
l:=trunc(bcioc[i]/cb);
moml:=sqrt(l*(l+1));
r0:=sqrt(bcioc[i]*bcioc[i]+xlat0*xlat0);
z0:=pi-Arctan(bcioc[i]/xlat0);
z0g:=z0*180/pi; w0:=moml*cw/r0/r0;
x:=t0; y[1]:=-vinit; y[2]:=r0; y[3]:=-w0; y[4]:=z0;
172
Simularea unui experiment de fizică
173
Simularea unui experiment de fizică
patru: r:=random(100)/100.;
bcioc[i]:=sqrt(2*r)*bmax;
if bcioc[i]<0.5 then goto patru;
l:=trunc(bcioc[i]/cb); moml:=sqrt(l*(l+1));
r0:=sqrt(bcioc[i]*bcioc[i]+xlat0*xlat0);
z0:=pi-Arctan(bcioc[i]/xlat0); z0g:=z0*180/pi;
w0:=moml*cw/r0/r0; x:=t0;
y[1]:=-vinit; y[2]:=r0; y[3]:=-w0; y[4]:=z0;
for j:=1 to ndim do
begin
derivs(x,y,dydx);
rk4(y,dydx,4,x,dt,y);
x:=x+dt;
xt[j]:=y[2]*cos(y[4]); yt[j]:=y[2]*sin(y[4]);
if abs(y[2]) > 100 then goto 35
end;
nmax:=j-1;goto 40;
35: nmax:=j;
40: if xt[nmax] < xt[nmax-1] then
tetaf[i]:=pi-arctan((yt[nmax]-yt[nmax-1])/
(xt[nmax-1]-xt[nmax]))
else tetaf[i]:=arctan((yt[nmax]-yt[nmax-1])/
(xt[nmax]-xt[nmax-1]));
end; {inchide ciclul dupa i de la 1 la nparc}
dsigmax:=dsig[1]; dsigmin:=dsig[1];
174
Simularea unui experiment de fizică
for j:=1 to 18 do
begin
tetat[j]:=j*10*pi/180;arg:=tetat[j]/2.;
dsigt[j]:=cs2/sin(arg)/sin(arg)/sin(arg)/sin(arg)*ysca
;
tetat[j]:=xscal*tetat[j]; xsigtt[j]:=trunc(tetat[j]);
ysigtt[j]:=trunc(dsigt[j]);
end;
graficas; readln; readln;closegraph;
trei:end.
Figura 9.3
175
Simularea unui experiment de fizică
Figura 9.4
Figura 9.5
176
Simularea unui experiment de fizică
Figura 9.6
Figura 9.7
secţiunea Rutherford pentru împrăştierea particulei alpha pe Ag,
energia incidenta 10 MeV
177
Simularea unui experiment de fizică
Figura 9.8
178
Simularea unui experiment de fizică
Bibliografie
[8] Louis Lyons, Statistics for nuclear and particle physicists, Cambridge
Univ. Press, 1986
179
Proiect cofinanţat din Fondul Social European prin Programul Operaţional Sectorial Dezvoltarea Resurselor Umane 2007-2013
Investeşte în oameni!
Unitatea de Management al
Proiectelor cu Finanţare Externă
http://conversii.pmu.ro
e-mail: conversii@pmu.ro
IS
BN
97
3-
0-
04
08
4-
2