Documente Academic
Documente Profesional
Documente Cultură
Facultatea ?IM
Raport
Metode Numerice
Lucrare de laborator nr 2
Chiinu 2015
Scopul lucrarii:
1.Sa se rezolve sistemul de ecuatii liniare Ax=b,utilizind:
Metoda lui Cholesky;
Metoda iterativa a lui Jacobi cu eroare =10-3;
Metoda iterativa a lui Gauss-Seidel cu eroare =10-5;
2.Sa se determine numarul necesar de iteratii pentru aproximarea solutiei
sistemului cu eroarea data . Sa se compare rezultatele.
3.Sa se implementeze metodele date intr-un limbaj de programare.
Varianta 1:
A=
9 3 1
3 6 1
1 1 4
b=
()
4
7
5
l 12 =
a12
=1
a11
l 13 =
a13
1 1
= =
a 11 9 3
l 22 = a22l 212= 5
l 23=
a23l 13 l 12 2
=
l 11
9
( )( )
1
2
311
l 33 = a33l l = 4
=
3
9
81
2
13
2
23
y 2=
b2l 12 y1 17
=
l 22
3 5
y 3=
b3l13 y 1l 23 y 2
=2.03
l 33
x 2=
y 2 l 23 x 3
=1.02
l 22
x 1=
y 1 l12 x2 l 13 x 3
=0
l 11
4 3
1
x 1= + x 2 x 3
9 9
9
9 x 13 x 2+ x 3=8
7 3
1
+ x+ x
3 x 1+ 6 x 2x 3=7 x 2=
6 6 1 6 3
x 1x 2+ 4 x 3=5
5 1
1
x 3 = x 1+ x 2
4 4
4
3
9
4
9
(0)
7
x =d=
6
5
4
( ) ()
0
Q= 3
6
1
4
0
1
4
1
9
1
6
0
i=1
i=2
i=3
1
+ =0<1
|q3 j|=|q 31|+|q32|+|q33|= 1
4 4
j=1
3
1 (k) 4
x (k1 +1)= x (k)
2 x3 +
9
9
9
3 (k) 1 (k) 7
(k+1)
x 2 = x1 + x 3
6
6
6
(k+1) 1 (k) 1 (k ) 5
x3 =
x + x +
4 1 4 2 4
Prima iteratie
3 (0) 1 (0) 4 1
x(1)
1 = x2 x3 + =
9
9
9 12
3 (0) 1 (0) 7 43
x(1)
x =
2 = x1 +
6
6 3 6 54
(1)
x3 =
1 (0) 1 (0) 5 61
x + x + =
4 1 4 2 4 72
x (i1) x(i0)=max {| x(11)x (10 )| ,|x (21)x (20 )|,|x (31 )x (30 )|}=max { 0,36 ; 0,37 ; 0,402 }
0,402>
Deoarece 0, 402 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat:
Iteratia a doua
3
1 (1) 4
(2)
(1)
x 1 = x2 x 3 + =0,085
9
9
9
3 (1) 1 (1) 7
x(2)
x + x =0,9838
2 =
6 1 6 3 6
x(2)
3 =
1 (1) 1 (1) 5
x + x + =1.0302
4 1 4 2 4
x (i2 )x(i1)=max {| x(12)x (11 )|,|x (22 )x (21)|,|x (32)x (31 )|}=max { 0,002 ; 0,187 ; 0,183 }
0,187>
Deoarece 0, 187
trebuie continuat:
Iteratia a treia
3 (2) 1 (2 ) 4
x(3)
x x + =0,0017
1 =
9 2 9 3 9
3 (2) 1 (2) 7
x(3)
x + x =1,037
2 =
6 1 6 3 6
x(3)
3 =
1 (2) 1 (2) 5
x + x + =0,9828
4 1 4 2 4
x=( 0; 1 ;1) ;
3. Rezolvarea sistemului de ecuatii liniare prin metoda iterativa GaussSeidel cu eroarea =10-5 :
3
1 (k) 4
x (k1 +1)= x (k)
2 x3 +
9
9
9
3
1
7
x (k+1)
= x(k)
+ x (k)
2
6 1 6 3 6
(k+1) 1 (k) 1 (k ) 5
x3 =
x + x +
4 1 4 2 4
Prima iteratie
3 (0) 1 (0) 4 1
x(1)
1 = x2 x3 + =
9
9
9 12
3 (1) 1 (0) 7
x(1)
x =
2 = x1 +
0.917
6
6 3 6
x(1)
3 =
1 (1) 1 (1) 5
x + x + =1,0302
4 1 4 2 4
x (i1) x(i0)=max {| x(11)x (10 )| ,|x (21)x (20 )|,|x (31 )x (30 )|}=max { 0,36 ; 0,248 ; 0,2198 }
0,36>
Deoarece 0, 36 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat:
Iteratia a doua
3 (1) 1 (1) 4
(2)
x 1 = x2 x 3 + =0.065
9
9
9
3 (2) 1 (1) 7
x(2)
x + x =0.962
2 =
6 1 6 3 6
x(2)
3 =
1 (2) 1 (2) 5
x + x + =0.9933
4 1 4 2 4
x (i2 )x(i1)=max {| x(12)x (11 )|,|x (22 )x (21)|,|x (32)x (31 )|}=max { 0,018 ; 0,166 ; 0,036 }
0,166>
Deoarece 0, 166 >,solutia n-a fost determinata si deci procesul iterativ trebuie
continuat:
Iteratia a treia
3
1 (2 ) 4
x(3)
x(2)
1 =
2 x 3 + =0.014
9
9
9
3 (3) 1 (2) 7
(3)
x 2 = x1 + x 3 =0.997
6
6
6
(3)
x3 =
1 (3) 1 (3) 5
x + x + =0.9975
4 1 4 2 4
(5)
x =(1 ;1 ; 0) ;
{t=0;
for(j=0;j<k-1;j++)
t+=l[k][j]*l[k][j];
l[k][k]=sqrt(A[k][k]-t);
for(i=k+1;i<n;i++)
{t=0;
for(j=0;j<k-1;j++)
t+=l[i][j]*l[k][j];
l[i][k]=(A[i][k]-t)/l[k][k];}k1++;}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{l[i][j]=l[j][i]; }
for(i=0;i<n;i++)
{t=0;
for(j=0;j<i;j++)
t+=l[i][j]*y[j];
t=B[i]-t;
y[i]=t/l[i][i]; }
for(i=n-1;i>=0;i--)
{t=0;
for(j=n-1;j>i;j--)
t+=l[i][j]*x[j];
t=y[i]-t;
x[i]=t/l[i][i]; }
cout<<"==Metoda lui Cholesky"<<endl<<endl;
for(i=0;i<n;i++)
printf("%7.3f ",x[i]);
cout<<endl<<endl;
}
void jacobi()
{int i,j,m,k1=0;
float v,x[n],q[n][n],d[n],s[n][n],t[n][n],x1[n],er;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{if(i==j)
{s[i][j]=1/A[i][j];
t[i][j]=0;}
else
{s[i][j]=0;
t[i][j]=A[i][j];}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{v=0;
for(m=0;m<n;m++)
v+=s[i][m]*t[m][j];
q[i][j]=-v; }
for(i=0;i<n;i++)
{v=0;
for(m=0;m<n;m++)
v+=s[i][m]*B[m];
d[i]=v; }
for(i=0;i<n;i++)
x[i]=d[i];
do {k1++;
for(i=0;i<n;i++)
x1[i]=x[i];
for(i=0;i<n;i++)
{v=0;
for(m=0;m<n;m++)
v+=x1[m]*q[i][m];
x[i]=v+d[i];}
er=fabs(x1[0]-x[0]);
for(m=0;m<n;m++)
if(er<fabs(x1[m]-x[m]))
er=fabs(x1[m]-x[m]); }
while(er>0.001);
cout<<"==Metoda lui Jacobi cu eroarea 0.001"<<endl<<endl;
for(i=0;i<n;i++)
printf("%7.3f ",x[i]);
cout<<endl;
cout<<"\n==Numarul de iteratii:"<<k1<<endl<<endl;
}
void gauss_seidel()
{ int i,j,m,k1=0,k;
float v,x[n],q[n][n],d[n],s[n][n],t[n][n],x1[n],er;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ if(i==j)
{s[i][j]=1/A[i][j];
t[i][j]=0;
}else
{ s[i][j]=0;
t[i][j]=A[i][j];}
};
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
v=0;
for(m=0;m<n;m++)
v+=s[i][m]*t[m][j];
q[i][j]=-v;
}
for(i=0;i<n;i++)
{ v=0;
for(m=0;m<n;m++)
v+=s[i][m]*B[m];
d[i]=v;
}
for(i=0;i<n;i++)
x[i]=d[i];
do{k1++;
for(i=0;i<n;i++)
x1[i]=x[i];
for(i=0;i<n;i++)
{v=0;
for(m=0;m<n;m++)
v+=x[m]*q[i][m];
x[i]=v+d[i];}
er=fabs(x1[0]-x[0]);
for(m=1;m<n;m++)
if(er<fabs(x1[m]-x[m]))er=fabs(x1[m]-x[m]);}
while(er>0.00001);
cout<<"==Metoda a lui Gauss-Seidel cu eroarea 0.00001"<<endl<<endl;
for(i=0;i<n;i++)
printf("%7.5f ",x[i]);
cout<<endl;
cout<<"\n==Nrumarul de iteratii:"<< k1<<endl<<endl;
}
int main()
{int p;
do {
}
while(p!=4);
}
Rezultatele obtinute: