Documente Academic
Documente Profesional
Documente Cultură
x1
, x2
x2
, ... , xn
xn
METODE NUMERICE
a11 a12
a21 a22
a31 a32
a13
a23
a33
Dac elementul a11 este diferit de zero, atunci cutm s ajungem la un determinant care s
conin pe prima coloan numai pe zero, cu excepia elementului a11. Acesta se poate obine succesiv
nmulind prima linie cu
linie cu
a21
i adunnd rezultatul la linia a doua. De asemenea nmulind prima
a11
a31
i adunnd la linia a treia se ajunge la un determinant, cu aceeai valoare ca cel iniial,
a11
dar care are pe prima coloan un singur element nenul. Deci determinatul devine:
a11
a12
a13
'
a22
'
a23
'
a32
'
a33
'
n continuare, dac a22
este diferit de zero, putem, fr a afecta valoarea determinatului, s
'
a32
i s adunm la a treia; vom obtine :
'
a22
a11
a12
a13
'
a22
'
a23
"
a33
'
"
a33
Evident valoarea acestui determinant este egal cu a11 a22
.
METODE NUMERICE
a13
a23
a33
K
an3
K
K
K
K
K
a1n
a2 n
a3n
K
ann
METODE NUMERICE
4
else t=0;
if(t==1)
{
return 0;
}
if(j!=iv)
{
d=-d;
for(k=j;k<=n;k++)
{
temp=a[j][k];
a[j][k]=a[iv][k];
a[iv][k]=temp;
}
}
for(l=j+1;l<=n;l++)
for(k=j+1;k<=n;k++)
a[l][k]=a[l][k] - a[j][k] * a[l][j] / a[j][j];
}
for(j=1;j<=n;j++)
d=d*a[i][j];
return d;
}
void main(void)
{
clrscr();
cout<<"Dati numarul de ecuatii ";cin>>n;
cout<<"Dati matricea A "<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
METODE NUMERICE
5
cout<<"a["<<i<<"]["<<j<<"]= ";
cin>>a[i][j];
}
METODE NUMERICE
a22 x2 a23 x3 K a2 n xn b2
K K K K K K K K K
an 2 x2 an3 x3 K ann xn bn
22 x2 23 x3 K 2 n xn 2
33 x3 K 3n xn 3
K K K K K K K
nn xn n
Acest sistem, numit sistem triunghiular superior, se poate rezolva, ncepnd cu valoarea lui
xm care se determin din ultima ecuaie. Cu xn, cunoscut de determinantul xn1 din penultima ecuaie,
s.a.m.d.
Soluia n limbajul C++, se aseamn foarte mult cu cea de la metoda lui Cramer, doar cu
cteva mici modificri :
#include<iostream.h>
#include<conio.h>
METODE NUMERICE
#include<stdlib.h>
float a[10][10],b[10],x[10],dp;
int i,j,n,iv,t,k,l;
float temp;
void main(void)
{
clrscr();
cout<<"Dati numarul de ecuatii ";cin>>n;
cout<<"Dati matricea A "<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Dati termenul liber"<<endl;
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];
}
for(j=1;j<=n-1;j++)
{
iv=j;
t=1;
while( (iv<=n) && (t==1) )
if(a[iv][j] == 0) iv=iv+1;
else t=0;
if(t==1)
{
METODE NUMERICE
8
cout<<"Determinantul pricipal este nul ";
exit(0);
}
if(j!=iv)
{
for(k=j;k<=n;k++)
{
temp=a[j][k];
a[j][k]=a[iv][k];
a[iv][k]=temp;
}
// schimbam si elementul corespunzator liniei k al termenului liber
temp=b[j];
b[j]=b[iv];
b[iv]=temp;
}
for(l=j+1;l<=n;l++)
{
for(k=j+1;k<=n;k++)
a[l][k]=a[l][k] - a[j][k] * a[l][j] / a[j][j];
// calcul pt. termenul liber
b[l]=b[l] - b[j] * a[l][j] / a[j][j];
}
}
if(a[n][n]==0)
{
cout<<"Deterninantul principal este nul";
exit(0);
}
// calculul lui xn
x[n]=b[n] / a[n][n];
METODE NUMERICE
for(i=n-1;i>=1;i--)
{
temp = b[i];
for(j=i+1;j<=n;j++) temp = temp - a[i][j] * x[j];
x[i] = temp / a[i][i];
}
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]= "<<x[i]<<endl;
getch();
}
Metodele directe presupun obinerea soluiilor exacte a sistemelor liniare dup un numr finit
de operatii elementare. O metod direct este cu att mai bun cu ct numrul de operaii elementare
(adunare, nmulire, mprire i rdcin ptrat) necesare este mai mic (numrul de operaii
executate influeneaz att timpul de execuie ct i eroarea de rotunjire).
Considerm sistemul cu n ecuatii i n necunoscute.
Ax = b, A Mn,n(R) nesingular.
Deoarece A este nesingular sistemul admite solutie unic, ce poate fi determinat cu regula
lui Cramer: xi
xi
, 1 i n . Artm c aplicarea acestei metode este nepractic (pentru n mare).
1 c
Sn
1 1 c2 2 ...cn n
nn
n 1
Deoarece n ! n (pentru n 1), rezult c Nop(n) > n
e
r n 1
. De exemplu, dac se
utilizeaz un sistem de calcul ce execut 109 operatii pe secund, atunci pentru rezolvarea unui
sistem cu n ecuaii i n necunoscute timpii de execuie sunt prezentai n tabelul de mai jos
METODE NUMERICE
10
n
n=5
Timp de executie 6
0.5782433079 10 s
n = 10
0.04765190154 s
n = 15
n = 20
n = 25
>1011 ani
n= 30
METODE NUMERICE
11
A(0) A(1) A(nmin),
ak ,i max ak , j , k j n
k
Se permut liniile i cu k;
k
Se aplic regula dreptunghiului (pivotului) cu pivotul ak ,k . Astfel:
ak ,i
ak ,i
k
k , i k , k 1,..., m
ak ,k
k K
j
M
K
M
i
k 1
ai , j
ai , j ak ,k ak , j ai ,k
k
ai ,k
ak ,k
k
ak , j
k
M
K
ai , j
k
, k 1 i n, k 1 j m.
METODE NUMERICE
12
1 1
a1,2
a1,3
......
1
1
a1, n a1, n 1
......
1a2,3
......
......
......
a2, n a2, n 1
......
0......1
an ,n 1
n min
1
...... a1, m
2
...... a2,m
,
...... ......
n
...... an ,m
(m n).
Nop(n) =
n 1 k j
2
k 1
j 2
n n 1 2n 1
1
6
n3
(sau Nop(n) O(n3) ).
3
x2 a2,3
x3 ...... a 2,n xn a2, n 1
........................................................
xn an ,n 1
Rezolvarea acestui sistem se poate face foarte uor de la sfrit spre nceput:
xn an ,n 1
n
METODE NUMERICE
13
xi ai ,n1
a x
i
i, j
j i 1
0
1 0
In
... ... ... ...
0 0 0 ......
......
......
......
......
0
...
Se tie c A este inversabil dac i numai dac are determinantul nenul. Notm:
ek = (0,, 0, 1, 00)
vectorul k al bazei canonice din Rn.
Pentru fiecare k (k = 1, 2,, n) considerm sistemul Ax = ek. Soluia acestui sistem reprezint
chiar coloana k a matricei A1. Astfel pentru aflarea lui A1 este necesar s rezolvm n sisteme de
ecuaii liniare Ax = ek, k = 1, 2,, n. Aceste sisteme pot fi rezolvate utiliznd algoritmul de
eliminare al lui Gauss. Pentru a micora volumul de calcul vom aplica algoritmul asupra matricei
obtinute prin concatenarea la matricea A a coloanelor bazei canonice din Rn. Coeficienii matricei
A A | e1 | e 2 | ...... | en
sunt
aij, dac 1 i, j n
ai,n+k = ik, dac 1 I, k n
unde
1, i k
0, i k
ik
Prin aplicarea algoritmului de eliminare Gauss cu pivotare partial asupra lui A se obine un
ir de matrice
A(0) A(1) A(n),
unde A 0 A , iar A(n) are urmtoarea form superior triunghiular:
METODE NUMERICE
14
1 1
a1,2
a1,3
......
1
1
a1, n a1, n 1
......
1a2,3
......
......
......
a2, n a2, n 1
......
0......1
an ,n 1
1
...... a1,2
n
2
...... a2,2 n
...... ......
n
...... an ,2 n
bi ,k ai ,n k
a b
i
i, j i, j ,
1 i n 1, 1 k n
j i 1
2. Metode iterative
2. Metode iterative permit gsirea soluiei sistemelor liniare cu o anumit precizie, ntr-un
numr finit de pasi:
Metoda lui Jacobi
Metoda lui Gauss Seidel
j=1,m
termenilor liberi:
b1
b2
M
bn
Definiie:
METODE NUMERICE
15
Numim norma unui vector x, pe care o notm cu ||x||, un numr real definit astfel :
n
x max xi
i 1
Numim norma unei matrice A cu n linii i m coloane, pe care o notm ||A||, un numr real
definit astfel:
n
A max
i 1
ij
j 1
Teorem:
Dac numrul q = ||I A|| are proprietatea q (0, 1), atunci sistemul de ecuaii Ax = b, are o
soluie unic, x, iar irul {xm}, definit:
x0 = 0, xm+1 = (I A) xm + b, converge la x.
n plus, sunt adevrate inegalitile :
xm x
1
qm
xm 1 xm
b
1 q
1 q
0.4 x1 x2 x3 0.9
METODE NUMERICE
16
ln
0.001 1 q
b
1
ln q
Prezentm n continuare soluia exemplului dat mai sus, cu precizarea c pentru a putea
generaliza metoda lui Jacobi, trebuie scrise cte o funcie de calcul a normei unui vector, respectiv, o
funcie de calcul a normei unei matrice.
Solutia in limbajul C++ :
/*
rezolvarea sistemelor de ecuatii liniare
metoda JACOBI
*/
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
double a[10][10],x[10],b[10],temp[10];
// a este matricea sistemului
// x vectorul de necunoscute ale sistemului
// b vectorul de termeni liberi
// temp un vector pentru calcul al unor valori temporare double q,eps,nb,s;
// q numar egal cu norma matricei I-A ( adica q = |I - A| )
// eps eroarea de calcul aproximativ al solutiilor sistemului
// nb numar egal cu norma vectorului B ( adica nb = |B| )
METODE NUMERICE
17
int n,m,j,i,iteratii;
void main(void)
{
clrscr();
cout<<"Intoduceti nr. de linii si de coloane ale matricei sistemului ";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Introduceti elementele termenului liber "<<endl;
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];
}
cout<<"Sistemul initial este :"<<endl;
for(i=1;i<=n;i++)
{
cout<<a[i][1]<<" x"<<1;
for(j=2;j<=n;j++)
cout<<" + "<<a[i][j]<<" x"<<j;
cout<<" = "<<b[i]<<endl;
}
cout<<"are solutiile :"<<endl;
eps=0.0001;
/*
caz particular pentru sistemul :
METODE NUMERICE
18
x1 + 0.3x2 - 0.2x3 = 1
0.4x1 + x2 + 0.1x3 =-0.9
-0.1x1 - 0.6x2 + x3 = 1.1
*/
nb=1.1;
q=0.7;
m=(int)(log(eps * (1-q) / nb ) / log(q) + 1);
for(i=1;i<=n;i++) x[i]=0.0;
for(iteratii=1;iteratii<=m;iteratii++)
{
for(i=1;i<=n;i++)
{
s=0.0;
for(j=1;j<=n;j++)
s+=a[i][j] * x[j];
temp[i]=x[i] - s + b[i];
}
for(i=1;i<=n;i++) x[i]=temp[i];
}
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]= "<<x[i]<<endl;
getch();
}
Dup execuia programului, se vor obine soluiile x = {0.63, 0.54, 1.04}.
METODE NUMERICE
19
i 1
j 1
a x x
ij i
METODE NUMERICE
20
METODE NUMERICE
21
for(i=1;i<=n;i++) b[i]=tt[i];
do{
k++;
eroare=0.0;
for(i=1;i<=n;i++)
{
t = tt[i];
for(j=1;j<=n;j++) t = t + a[i][j] * b[j];
b[i] = b[i] + t;
if(b[i] != 0.0) t = t / b[i];
if(fabs(t)>eroare) eroare = fabs(t);
}
}while((eroare<eps) || (k==imax) );
return;
}
void main(void)
{
clrscr();
cout<<"Introduceti nr. de linii si de coloane ale matricei sistemului ";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
}
cout<<"Introduceti elementele termenului liber "<<endl;
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];
METODE NUMERICE
22
}
cout<<"Sistemul initial este :"<<endl;
for(i=1;i<=n;i++)
{
cout<<a[i][1]<<" x"<<1;
for(j=2;j<=n;j++)
cout<<" + "<<a[i][j]<<" x"<<j;
cout<<" = "<<b[i]<<endl;
}
cout<<"are solutiile :"<<endl;
gauss_seidel(a,b,n);
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]= "<<b[i]<<endl;
cout<<"Eroarea relativa maxima este "<<eroare<<endl;
getch();
}