Sunteți pe pagina 1din 25

CURSUL 1.

I. PREZENTAREA GENERALĂ A PROGRAMULUI SCILAB


II. ERORI DE CALCUL NUMERIC

I. 1. Ce este Scilab-ul?

Structural, SCILAB-ul este, cu mici modificări, o variantă gratuită


a MATLAB-ului având versiuni pentru Unix şi pentru Windows.
La adresa www.scilab.org se găseşte documentaŃie gratuită pe
INTERNET referitoare la Scilab precum şi programul corespunzător.
Pentru început, Scilab-ul se poate folosi pentru efectuarea
calculelor elementare, operaŃiilor cu vectori şi matrice (cu elemente
reale şi complexe) şi reprezentărilor grafice de curbe şi suprafeŃe. De
asemenea, Scilabul poate fi un mediu agreabil de realizare a calculelor
numerice pentru că dispune de o serie de metode uzuale din acest
domeniu, de exemplu:
- rezolvarea sistemelor liniare,
- calculul valorilor şi vectorilor proprii,
- rezolvarea ecuaŃiilor diferenŃiale,
- rezolvarea sistemelor neliniare,
- noŃiuni de bază din algebra liniară,
- algoritmi de optimizare
Programarea în Scilab se efectuează destul de uşor, pentru
anumite secvenŃe mai complicate se pot folosi subprograme realizate
în C sau fortran (77). Scilab-ul include aplicaŃii specifice, numite
TOOLBOX-uri - colecŃii extinse de funcŃii SCILAB care dezvoltă mediul
de programare de la o versiune la alta, pentru a rezolva probleme din
domenii variate.
I. 2. Mediul Scilab

Mediul Scilab lucrează cu mai multe tipuri de ferestre: o fereastră


de comenzi, o fereastră pentru fişiere sau grafice, o fereastră pentru
‘help’. Când se lansează în execuŃie se deschide implicit fereastra de
comandă care, conŃine meniurile File, Edit, Preferences, Control,
Editor, Applications şi ? (help) şi o bară de butoane

unde

Buton SemnificaŃie
Deschide o nouă fereastră de
comandă
Deschide Scipad-ul (editorul Scilab-
ului)
Deschide un fişier
Copiează
Lipeşte
Schimbă directorul
Consolă Scilab
Alege font

În fereastra de comenzi, instrucŃiunile se scriu pe prompterul -->


şi se execută apăsând Enter; instrucŃiunile se execută de la stanga la
dreapta şi de sus în jos în ordinea în care s-au scris.
Meniul File conŃine:

unde, un fişier specificat este executat cu Exec şi încărcat cu Load.


Activat meniul Editor face să se dechidă editorul Scilab-ului în
care se pot scrie programe care se pot executa folosind Execute/Load
into Scilab.
Folosind Scicos din Applications se pot realiza diverse
diagrame şi simulări în fereastra care se deschide.

Pentru realizarea diagramelor se pot alege obiecte folosind opŃiunea


Palettes din Edit (sau clic dreapta cu mouse-ul), de exemplu:
Se pot introduce instrucŃiuni cu ajutorul ferestrei de dialog obŃinute prin
accesarea opŃiunii Context (clic dreapta cu mouse-ul).

Într-o fereastră asemănătoare se pot edita şi personaliza graficele.


I. 3. NoŃiuni Scilab

Pachet de programe de înaltă performanŃă, dedicat calcului numeric


şi reprezentărilor grafice în domeniul ştiinŃei şi ingineriei, precum şi
simulărilor stocastice. Matricea este elementul de baza; cu aceasta se pot
rezolva probleme fără a fi necesară scrierea unui program într-un limbaj de
programare.
Lucrează cu mai multe tipuri de ferestre: o fereastră de comenzi, o
fereastră pentru fişiere sau grafice, o fereastră pentru ‘help’. Include
aplicaŃii specifice, numite TOOLBOX-uri; colecŃii extinse de funcŃii SCILAB
care dezvoltă mediul de programare de la o versiune la alta, pentru a
rezolva probleme din domenii variate. Structural, SCILAB-ul este (cu mici
modificări!) o variantă gratuită a MATLAB-ului.

Tabel 1. FuncŃii SCILAB de interes general:


Denumire funcŃie AcŃiune funcŃie
exit, quit Comanda pentru ieşirea din SCILAB
help Furnizează informaŃii “on-line” despre
SCILAB
who Listează variabilele curente
cd Schimbă directorul de lucru
dir Afişează lista directorului
clc Şterge fereastra de comenzi
mtlb_save Salvează variabilele curente
error Afişează mesaje de eroare
exist Verifică dăcă o variabilă sau un fişier există
disp Afişează o matrice sau un text
clear Şterge variabile şi funcŃii
size Returnează dimensiunile unei matrice
apropos Caută în ‘help’ un cuvânt specificat
Manevrarea vectorilor şi matricelorDefinirea matricelor:
- Introducerea explicită a listei de elemente;
- Generarea prin instrucŃiuni şi funcŃii;
- Crearea de fişiere script;
- Încărcarea din fişiere de date externe.
Introducerea explicită a unei matrice:
- Elementele unei linii sunt separate prin virgulă sau spaŃiu;
- Lista elementelor matricei trebuie încadrată între
paranteze drepte;
- Liniile se separă prin punct şi virgulă (‘;’).

Exemplu pentru definirea unei matrice: comanda


-->A=[1 1 1;2 4 8;3 9 27]
are drept efect
A = ! 1. 1. 1. !
! 2. 4. 8. !
! 3. 9. 27. !
Exemplu pentru definirea unui vector:
-->b=[ 2 10 44 190]
b = ! 2. 10. 44. 190. !

Tabel 2. FuncŃii pentru construirea unui vector sau unei matrice tip
FuncŃia SemnificaŃi Exemplu
a
eye Matricea I=eye(4,4)
unitate I =
! 1. 0. 0. !
! 0. 1. 0. !
! 0. 0. 1. !
diag Matrice B=diag(b)
diagonală B =
! 2. 0. 0. 0. !
! 0. 10. 0. 0. !
! 0. 0. 44. 0. !
! 0. 0. 0. 190. !
zeros Matrice cu -->C=zeros(3,2)
toate C =
elementele ! 0. 0. !
0 ! 0. 0. !
! 0. 0. !
ones Matrice cu -->D=ones(2,3)
toate D =
elementele ! 1. 1. 1. !
1 ! 1. 1. 1. !
rand Matrice cu -->M=rand(3,4)
elemente M =
aleatoare ! 0.2113249 0.3303271 0.8497452
0.0683740 !
! 0.7560439 0.6653811 0.6857310
0.5608486 !
! 0.0002211 0.6283918 0.8782165
0.6623569 !
triu Partea -->U=triu(D)
triunghiulară U =
superioară a ! 1. 1. 1. !
unei matrice ! 0. 1. 1. !
! 0. 0. 1. !
tril Partea -->V=tril(D)
triunghiulară V =
inferioară a ! 1. 0. 0. !
unei matrice ! 1. 1. 0. !
! 1. 1. 1. !
linspace Vector cu -->v=linspace(0,1,5)
incrementar v =
e constantă ! 0. 0.25 0.5 0.75 1. !
între doua ObservaŃie: acelas lucru se obtine daca
valori -->x=0:0.25:1
x =
! 0. 0.25 0.5 0.75 1. !
Pentru
-->y=1:5
se obtine
y =
! 1. 2. 3. 4. 5. !
plot Reprezintă -->x=linspace(0,2*%pi,101);
grafic o -->y=exp(x).*sin(4*x);
curba în 2D -->plot(x,y,'x','y','y=exp(x)*sin(4x)')

ObservaŃie: InstrucŃiunea plot va desena într-o alta fereastră graficul


Tabel 3. FuncŃii uzuale ale SCILAB-ului:
Apelarea SemnificaŃia matematică
funcŃiei
sin(x) sin x
sinc(x) sin( x)
x
cos(x) cos x
tan(x) tg x
cotg(x) ctg(x)
sinh(x) sh x
cosh(x) ch x
tanh(x) th x
asin(x) arcsin x
acos(x) arccos x
atan(x) arctg x
exp(x) ex
log(x) ln(x)
log10(x) lg x
floor(x) [x]
ceil(x) [x]+1
Re(z) Re z
Im(z) Im z
lenght(v) Numărul elem. vectorului v
size(a) Dimensiunea matricei a
max(v) Cel mai mare elem. al vect. v
min(v) Cel mai mic elem. al vect. v
sqrt(x) x

Tabel 4. Operatorii aritmetici SCILAB:


OperaŃia Scalari Matrice Tablouri
Adunare + + +
Scădere - - -
ÎnmulŃire * * .*
ÎmpărŃire la stânga \ \ .\
ÎmpărŃire la dreapta / / ./
Ridicare la putere ^ ^ .^
Transpunere ‘ .’

Tabel 5. Operatorii relaŃionali


Operator SemnificaŃie
< Mai mic
> Mai mare
Operator SemnificaŃie
<= Mai mic sau egal
>= Mai mare sau egal
== Identic
~= Diferit

Tabel 6. Operatorii logici


Operator Simbol SCILAB Prioritatea
NU ~ 1
ŞI & 2
SAU | 3

Programare în SCILAB
SCILAB-ul poate lucra în urmatoarele moduri:
- În modul linie de comanda; fiecare linie este prelucrată imediat şi
rezultatele sunt afişate;
- Cu programe conŃinute în fişiere. Un fişier constă dintr-o succesiune de
instrucŃiuni SCILAB, cu posibilitatea apelării altor fişiere precum şi a
apelării recursive. Un program SCILAB poate fi scris sub forma
fişierelor:
- Script: conŃine o secventă de comenzi SCILAB; se execută
prin apelarea numelui fişierului: exec(‘nume_fisier’)FuncŃie:
prima linie conŃine cuvântul function; poate lucra cu argumente.
Se pot defini mai multe funcŃii în acelaşi fişier.

Tabel 7. InstrucŃiuni şi funcŃii de control


InstrucŃiune SemnificaŃia
if InstrucŃiune pentru execuŃia condiŃională
else InstrucŃiune asociată cu if
elseif InstrucŃiune asociată cu if
case InstrucŃiune folosită pentru a face o alegere
for InstrucŃiune pentru crearea ciclurilor cu număr specificat
de paşi
while InstrucŃiune pentru crearea ciclurilor cu condiŃie logică
break InstrucŃiune pentru terminarea forŃată într-un ciclu
return Returnează execuŃia la funcŃia precizată
error InstrucŃiune pentru afişarea unui mesaj de eroare
end InstrucŃiune pentru încheierea ciclurilor for, while şi if
Tabel 8. Sintaxa instrucŃiunilor SCILAB
InstrucŃiune Sintaxă
If if expresie_logică grup instrucŃiuni end
Else if expresie_logică grup instrucŃiuni A
else grup instrucŃiuni B end
Elseif if expresie_logică_1 grup instrucŃiuni A
elseif expresie_logică_2 grup instrucŃiuni B
end
Case select expr_0
case expr_1 Instr_1 …
case expr_n Instr_n else Instr end
For for index = expresie \\ expresie = iniŃial: pas:
final
grup_instrucŃiuni
end
While while expresie
grup_instrucŃiuni
end

Exemple de fişiere script


Definirea şi reprezentarea grafică a funcŃiilor cu acoladă: cu ajutorul
Scipad-ului (editorul Scilab-ului) se editează un fişier script care se
salvează, de exemplu, Functie.sce şi conŃine următoarele instrucŃiuni:
a=-4;b=4;d=0.01;c=0;
x=a:d:b;
k=max(size(x));
for i=1:k
if (x(i)>=a)&(x(i)<c)
y(i)=x(i)+sin(x(i));
end
if (x(i)>=c)&(x(i)<=%pi)
y(i)=sin(x(i));
elseif (x(i)>%pi)&(x(i)<=b)
y(i)=(x(i))^1/3-%pi^1/3;
end
end
plot(x,y)

În fereastra de comandă se execută fişierul folosind instrucŃiunea:


-->exec('functie.sce')
şi se va obŃine într-o nouă fereastră graficul funcŃiei:
f ( x) := x + sin ( x) if −4 ≤ x < 0
sin ( x) if 0 ≤ x ≤ π
(3 x − 3 π) otherwise

-1

-2

-3

-4
-4 -3 -2 -1 0 1 2 3 4

ObservaŃie: Fişierul se poate executa direct, în editorul Scilab-ului folosind


din meniul ‘Execute’ opŃiunea ‘Load into Scilab’.

Calculul limitei şirurilor definite recurent: să se calculeze limita şirului


2 + c n2
lim c n , unde c1 = 10 si c n+1 = ,∀n ≥ 1 .
n→∞ 2c n

Se scrie programul în fişierul numit SirRecurent.sce:


x=10;
c=(2+x^2)/(2*x);
while abs(c-x)>0.00001
x=c;
c=(2+x^2)/(2*x);
end
c
Se lansează în execuŃie în fereastra de comandă scriind:
-->exec("SirRecurent.sce")
şi se obtine rezultatul:
c = 1.4142136

Fişierele funcŃie sunt utilizate pentru crearea unor noi funcŃii SCILAB.
Forma generală a unui fişier funcŃie este:
function [parametri_ieşire] = nume_funcŃie (parametri_intrare)
…..instrucŃiuni de definire a funcŃiei….
endfunction
unde:
function: cuvânt cheie care declară fişierul ca fişier funcŃie (obligatoriu);
nume_functie: numele funcŃiei, adică numele sub care se salvează fişierul,
fără extensie; nu poate fi identic cu cel al unui fişier existent;
parametri_iesire: parametrii de ieşire trebuie separaŃi cu virgulă şi cuprinsi
între paranteze drepte. Dacă funcŃia nu are parametri de ieşire parantezele
drepte şi semnul egal (=) nu mai au sens;
parametri_intrare: parametrii de intrare trebuie separaŃi cu virgulă şi
cuprinsi între paranteze rotunde. Daca funcŃia nu are parametri de intrare
parantezele rotunde nu mai au sens.
endfunction: instrucŃiunea de terminare a unei funcŃii.

ObservaŃii:
Un fişier de tip funcŃie poate să contină mai multe funcŃii. Pentru utilizarea
unei funcŃii trebuie folosită, mai intâi, comanda:
getf(“NumeFunctie.sci”)
Spre deosebire de fişierele script care au extensia ‘sce’, fişierele de tip
funcŃie au extensia ‘sci’.

Exemplu: Calculul factorialului


Se vor defini în acelaşi fişier (functii.sci) două funcŃii care calculează
factorialul unui număr dat; prima nu verifică dacă argumentul este întreg
pozitiv, a doua funcŃie face acest lucru înainte de a face calculul
function [f]=factorial(n)
f=prod(1:n)
endfunction

function [f]=factorial1(n)
//dacă n nu este întreg şi pozitiv se transmite un mesaj de eroare,
//apoi se transformă numărul într-un număr întreg pozitiv
if (n-floor(n)~=0)|n<0 then
n=floor(abs(n))
warning('argumentul nu este întreg pozitiv; se va calcula
'+sprintf("%d",n)+"!")
end
f=prod(1:n)
endfunction
În fereastra de comandă se vor folosi aceste funcŃii astfel:
-->getf('functii.sci')
-->factorial(5)
ans = 120.
-->factorial(0.5)
ans = 1.
-->factorial(-0.5)
ans = 1.

Dacă argumentul nu este întreg şi pozitiv funcŃia factorial întoarce un


rezultat oarecare, 1. Dacă vom folosi funcŃia factorial1 se va obŃine:
-->factorial1(5)
ans = 120.

-->factorial1(0.5)
WARNING:argumentul nu este întreg pozitiv; se va calcula 0!
ans = 1.

-->factorial1(-5)
WARNING:argumentul nu este întreg pozitiv; se va calcula 5!
ans = 120.

Recursivitate: o funcŃie se poate apela pe ea însăşi (exemplu: calculul


factorialului recursiv)
function [f]=fact(n)
if n<=1 then
f=1
else
f=n*fact(n-1)
end
endfunction

ObservaŃie: O funcŃie se poate defini direct prin intermediul comenzii deff


deff(‘[y1, y2,…, ]=nume_functie(x1, x2, …)’,text)
Exemplu: deff(‘[y]=f(x)’,’y=sin(x).*cos(x)’)
Reprezentări grafice

Exemplul 1: Reprezentarea color, în plan a liniilor de contur ale unei


suprafeŃe folosind Sgrayplot:
x=-10:10; y=-10:10;m =rand(21,21);
Sgrayplot(x,y,m,"111",[-20,-20,20,20])
t=-%pi:0.1:%pi; m=sin(t)'*cos(t);
clf()
Sgrayplot(t,t,m)

-1

-2

-3

-3 -2 -1 0 1 2 3

Exemplul 2: Reprezentarea liniilor de contur în plan a unei suprafeŃe


contour2d(1:10,1:10,rand(10,10),5,rect=[0,0,11,11])
xset("fpf","%.2f")
clf()
contour2d(1:10,1:10,rand(10,10),5,rect=[0,0,11,11])

11.0

0.17 0.66 0.50


0.33 0.66
0.66 0.17
8.8 0.33 0.33
0.50 0.33 0.50
0.17 0.66
0.83 0.66 0.83
0.50
0.33 0.17
0.33 0.17 0.66 0.33 0.66

6.6 0.66 0.500.66


0.83 0.33
0.50 0.17
0.83
0.170.33 0.66 0.33

4.4 0.17 0.33

0.50
0.66 0.83
0.50 0.50
0.66 0.33
0.33 0.83 0.17
2.2 0.66
0.33 0.17 0.66
0.50 0.50
0.66 0.33 0.83

0.0
0.0 2.2 4.4 6.6 8.8 11.0
Exemplul 3: Reprezentarea în 3D a suprafeŃei: z=sin(x)*cos(y)
t=%pi*(-10:10)/10;
deff('[z]=surf(x,y)','z=sin(x)*cos(y)');
rect=[-%pi,%pi,-%pi,%pi,-5,1];
z=feval(t,t,surf);
plot3d(t,t,z,35,45,'X@Y@Z',[2,1,3],rect);
title=['plot3d’];
plot3d

-1
Z -2

-3

-4 -4
-3
-5
-2
-4 -1
-3
-2 0
-1 1
0
2
1
2 3
3 4
4

Citirea / Scrierea din/în fişier în Scilab


Citire:read (citirea se face în matrice)
[x]=read(file-desc,m,n,[format]) sau [x]=read(file-desc,m,n,k,format)
file-desc: şir de caractere specificând numele fişierului sau valoare
întreagă specificând unitatea logică
m, n: numere întregi reprezentând dimensiunile matricei. Dacă nu se
dă numărul de linii, se citeşte tot fişierul
format: şir de caractere ce specifică un format ”Fortran”
k: întreg sau vector de întregi

Scriere în fişier: write(fisier,text_de_scris)

Alte instrucŃiuni pentru fişiere:


Deschidere fişier: [unit,[err]]=file(‘open’,nume_fisier,[status]) unde
status poate fi “new” (pentru fişier nou), “old” (pentru fişier deja existent),
“unknown” (când nu se ştie exact). unit este un ‘identificator’ pentru fişier,
iar err conŃine posibilele erori.
Închidere fişier: file(‘close’, unit)
Pozitionare la sfârşit de fişier: file(‘last’,unit)
Pozitionare la început de fişier: file(‘rewind’,unit)
Pentru mai multe detalii să se apeleze apropos comanda.
II.1. Erori de calcul numeric
O formula de calcul numeric se aplica, de obicei, in mod repetat. In
consecinŃa, prezintă importanta nu numai eroarea introdusa intr-o etapa, ci
si tendinŃa de a amplifica sau, dimpotrivă, de a atenua erorile introduse de
anterior, adică stabilitatea metodei numerice. Studiul erorilor numerice
rămâne deci o problema deschisa, care trebuie luata in considerare pentru
fiecare metoda de calcul in parte.

II.1.1. Surse de erori


Erorile inerente: sunt erorile legate de cunoaşterea aproximativa a
unor valori provenite din măsurători sau din faptul că avem de-a face cu
numere iraŃionale (algebrice sau transcendente: numerele π, e, 3 , etc.).
Evident, rezultatul oricăror calcule depinde şi de precizia datelor introduse
iniŃial. Ca erori inerente pot fi considerate şi erorile de conversie făcute la
trecerea in baza 2 a unor numere care se introduc in memoria
calculatoarelor numerice actuale. Spre exemplu, numărul 0.1 reprezentat
printr-un număr finit de zecimale in baza 10, devine o frac zecimala
periodica in baza 2 (0.110 ‚ 0.0(0011)2).
Erorile de metodă sau erorile de trunchiere sunt provenite din
aproximaŃiile făcute la deducerea formulelor de calcul. Exemple: restul
RN(x) la interpolarea polinomială, distanŃa x n +1 − α la rădăcină, din metodele
iterative de calcul, erorile introduse prin trunchierea seriilor la un anumit
rang, etc. Spre deosebire de erorile inerente, erorile de metodă pot fi
reduse, in principiu, oricât de mult.

Erorile de rotunjire sunt legate de posibilităŃile limitate de


reprezentare a numerelor in calculatoarele numerice. In general, orice
calculator poate reprezenta numerele cu un număr redus de cifre
semnificative, depinzând de lungimea cuvântului (numărul de biŃi utilizat la
stocarea unui număr In mod curent se lucrează cu un echivalent de circa 7
cifre semnificative în simplă precizie şi de circa 15 cifre semnificative in
dubla precizie.

După cum se ştie, în memoria internă a calculatoarelor actuale se foloseşte


reprezentarea în virgulă mobilă, in forrna normalizată. Astfel, orice număr
real x se scrie x = f ⋅ b n , f < 1 unde f este un număr real denumit mantisă,
b > 0(b ≠ 1) este baza sistemului de numeraŃie utilizat, iar n (întreg) este
exponentul.

În forma normalizată mantisa este cuprinsà in intervalul [b-1, 1)

b −1 ≤ f < 1

Singura excepŃie de la acestă regulă de reprezentare este numărul zero.


In consecinŃă un număr real cu mai multe cifre semnificative este “rotunjit”
la numărul de cifre maxim. Acest lucru se realizează prin rotunjirea
mantisei, Alte rotunjiri se efectuează în decursul operaŃiilor.
In general, notand cu x valoarea exactă a numdrului şi cu x valoarea
calculată (aproximativă), eroarea absolută ex se defineşte ca diferenŃa
dintre valoarea exactă şi cea aproxirnativă

ex = x − x

ex
Raportul se numeşte eroare relativă, notată deseori cu ε x
x

ex
εx =
x

Fie t numărul de cifre semnificative. Pentru comoditate, să presupunem că


lucrăm in baza 10 (b = 10). Atunci, un număr x a cărui valoare o
presupunem iniŃial cunoscută cu exactitate. se va scrie

x = f ⋅ 10 n + g ⋅ 10 n −t , f , g ∈ [0.1 , 1)

unde g conŃine cifrele care nu pot fi incluse in mantisa f. Rotunjirea se face


de obicei simetric, adică se înlocuieşte
g = 1 daca g ≥ 0.5, g = 0 daca g < 0.5

În acest fel, marginea erorii relative este

g ⋅ 10 n −t
ex = ≤ 5 ⋅ 10 −t
f ⋅ 10 n

Erorile cu marginea data de formula de mai sus se fac la introducerea


numerelor reale in memoria calculatorului numeric. Ele afectează
rezultatele in funcŃie de operaŃiile la care sunt supuse valorile introduse.

II.2. Propagarea erorilor in calcule

II.2.1. Propagarea erorilor la înmultire

Vom considera două nurnere, x şi y, introduse cu erorile ex respectiv ey

x = x + ex , y = y + e y

Presupunem că se efectuează produsul numerelor

xy = ( x + ex )( y + e y ) = x y + yex + x e y

unde s-a neglijat produsul exey considerat ca având un ordin do mărime


suficient de mic. Rezultă eroarea la înmulŃire

e xy ex e y
= + = εx + εy
xy x y

Rezultă că la înmu1Ńire erorile relative introduse iniŃial se adună. În afară


de aceste erori, pot apărea însă noi erori, deoarece produsul poate avea, la
rândul său un număr de cifre semnificative mai mare decât cel admis (notat
cu t) necesitând o nouă rotunjire (simetrica). Notând cu ε p această nouă

eroare, vom obŃine eroarea relativă totală ε tp la înmulŃirea a două numere

etp = ex + e y + e p
iar ca margine a erorii

etp ≤ ex + e y + e p < 15 ⋅ 10 − t

Desigur, această evaluare este acoperitoare deoarece erorile nu se adună,


ci se compun după legi mai complicate (probabilistice).

II.2.2. Propagarea erorilor la împărŃire

x ( x + ex ) x  ex e y  x
= = 1 + +  = (1 + ε x + ε y )
y ( y + e y ) y  x y y

unde am neglijat termenii de grad superior lui 2 in ex şi ey. S-a folosit


1
dezvoltarea în serie Taylor pentru ≅ 1 − ε y + ... . Rezultă că eroarea
1+ εy

relativă la împărŃire, datorată erorilor de reprezentare in calculator (ex şi ey),


este

ex
y
= εx − εy
x
y

adică este egală cu diferenŃa erorilor relative introduse iniŃial in valorile


numărătorului şi numitorului. La acestea se adaugă eroarea de rotunjire la
x
reprezentarea raportului , pe care o vom nota cu ε d , astfel încât eroarea
y
relativă totală la împărŃirea douà numere x, y este

etd = ex − e y + ed

II.2.3. Propagarea erorilor la adunare

In acest caz, suma a două numere este


x + y = x + y + ex + e y

astfel încât eroarea relativa la sumare este

ex + y
=
(e x + ey )
=
x
+
y
x+y (x + y ) (x + y )ε x ( x + y )ε y
adică o sumă ponderată a erorilor introduse la reprezentarea in calculator a
cantităŃii sumate. Şi în acest caz se introduce a eroare suplimentară la
reprezentarea sumei x + y , a cărei valoare relativă o vom nota cu ε s . Ca
urmare, eroarea relativă

la sumare ε ts va fi

x y
ets = εx + ε y + es
x+y x+y

AplicaŃie: să scriem eroarea totală la calculul expresiei

E = ( x + y )z ≅ ( x + y )z

Solutie:

x y
etE = εx + ε y + e z + es + e p
x+y x+y
cu marginea
x + y 
etE ≤ 15 ⋅ 10 −t  + 3 
 x+y 
Ca recomandare generală, în calculul numeric trebuie studiată şi
propagarea erorilor. În anumite cazuri, acurnularea erorilor poate conduce
la rezultate complet eronate. Pentru a ilustra această posibilitate, să
1
consideràrn calculul integralei I n = ∫ x n e x −1dx
0

O modalitate de calcul o reprezintă utilizarea unei relaŃii de recurenŃă

I n = 1 − nI n −1 , n = 1,2,...
plecând de la valoarea I 0 = 1 − e −1 . Rezultatele calculelor pentru diferitele
valori ale lui n sunt date in tabelul de mai jos. Se observă că pentru n = 13,
se obŃine.o valoare negativă a integralei, ceea ce nu este posibil, funcŃia
integrată fiind pozitivă pe [0, 1]. Rezultă că valorile obŃinute sunt eronate,
incepând cu o anurnită valoar a lui n. ExplicaŃia o constituie faptul că
valoarea integralei I0 se calculează cu o eroare e0 care este amplificată prin
aplicarea formulei de recurenŃă, astfel că, la calculul lui I13 eroarea este

e13 ≅ 13! e0 = 6227 ⋅ 10 9 e0

Pentru a obŃine o valoare corectă în cazul indicilor n mari se aplică formula


de recurenŃă sub forma

1 − In
I n −1 = , n = N , N − 1,...
n

in care erorile sunt reduse in fiecare etapă. Prin urmare, plecând de la un N


suficient de mare eroarea introdusă din necunoa valorii In va fi redusă,
astfel încât să obŃinem rezultate corecte. Observând că valoarea integralei
scade cu n, vom alege N = 20 şi vom aproxima I20 ≈ 0, calculând
integralele de indice mai mic din ce în ce rnai precis. Valonile obŃinute sunt
date in acelade mai sus. Se observă că rezultatele sunt rnai bune la indici
mari şi identice la indici mici (n < 7).

Tabel. Exemplu de amplificare a erorilor


1 − In
n I n = 1 − nI n −1 , n = 1,2,... I n −1 = , n = N , N − 1,...
n
0 0.632121 0.632121
1 0.367879 0.367879
3 0.207277 0.207277
7 0.112383 0.112383
9 0.091586 0.091612
13 -0.377925 0.066948
17 - 0.052778
20 - 0.000000
Exercitii pentru seminarul 1
1. Sa se genereze o matrice A, cu n linii si n+1 coloane, ale carei elemente
2, daca i = j
sunt: 
A = − 1, daca i − j = 1
.

0, in rest
2. Sa se scrie un program utilizand while care calculeaza suma elementelor
vectorului x=(5 2 –9 10 –1 9 –1) pana cand intalneste un nr mai mare ca 8.
10 10
3. Sa se calculeze si sa se afiseze A = ∑ (2k − 1)3 + ∏ 3k 2
k =1 k =1
4. Să se calculeze suma elementelor unui vector care sunt cuprinse intre
valorile a şi b cu a<b.
5. Să se calculeze produsul elementelor diferite de zero ale unui vector.
6. Se dă şirul de numere x1, x2, …, xn. Să se determine numărul de elemente
pozitive şi să se calculeze produsul lor.
7. Să se calculeze media aritmetică a elementelor unui vector care sunt mai
mari decat o valoare dată.
8. Se dau două siruri de câte n numere: a1, a2, …, an şi b1, b2, …, bn. Să se
formeze şirul c1, c2, …, cn în care termenii se obŃin după următorul
 a i + bi
, daca a i ⋅ bi < 0
procedeu: pentru orice i, i = 1, n , ci =  2
max{a i , bi }, daca a i ⋅ bi ≥ 0

9. Sa se calculeze si sa se afiseze suma patratelor elementelor mai mari decat 1


ale unei matrice patratice.
10.Sa se calculeze media aritmetica a elementelor de pe diagonala principala a
unei matrice patratice de ordinul n, cu n<10
11.Sa se determine valorile maxime si minime ale unui vector si ale unei
matrice, apoi sa se determine si indicele (pozitia acestora).
12.Să se calculeze suma elementelor diferite de o valoare dată, v, ale unei
matrice.
13.Sa se determine elementul maxim al unui matrice de numere reale.
14.Să se calculeze produsul elementelor diferite de zero de pe diagonala
principală (secundară) ale unei matrice.
15.Să se calculeze suma elementelor unei matrice situate deasupra (dedesubtul)
diagonalei principale (secundare).
16.Se dau numerele aij , i = 1,2,...,100; j = 1,2,...,50 si b j j = 1,2,...,50 . Sa se realizeze
50
un program care calculeaza: ci = ∑ aij b j , i = 1,2,...,100 .
j =1

S-ar putea să vă placă și