Universitatea A.I.
Cuza din Iai, extensiune Bli
Facultatea de fizic
Specializarea fizic tehnologic
(Proiect de program la cursul de Prelucrarea datelor fizice)
.
PROIECT DE PROGRAM Nr.2
Rezolvarea matricilor aplicnd metodele:
Guass, Gauss optimizat, Gauss-Jordan
A elaborat: Brsanu Marina
Averificat: icu Vitalie
Bli, 2016
I. Formularea problemei
Calcularea matricei: a[Nmax][Nmax+1] = {{-8, 7, 3, 6, 10}, {11, 4, -2, 3, 47},
{13, 7, 25, 3, 61}, {5, -6, 12, 26, 30}} prin intermediul metodei Gauss, Gauss optimizat,
Gauss-Jordan .
II. Preliminarii
A1
A2
A3
A4
A5
-8
10
11
-2
47
13
25
61
-6
12
26
30
[Link]
Metoda Gauss:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define NMAX 10
int main()
{
int i,j,l,m,n = 4;
double a[NMAX][NMAX+1] = {{-8,7,3,6,10}, {11,4,-2,3,47},
{13,7,25,3,61},{5,-6,12,26,30}};
double x [NMAX];
double suma;
printf("Calcularea matricei prin metoda Gauss\n");
printf ("\n Sistemul initial \n");
for (i = 0 ; i < n ; i++)
{
for ( j = 0; j < n; j++)
printf("%8.3lf ", a[i][j]);
printf(" | %8.3lf \n", a[i][n]);
}
//etapa 1
for ( l = 0; l<n-1; l++)
{
for ( i = l+1; i<n; i++)
for (j = l+1; j <= n; j++)
a [i][j] = a[i][j]- a[i][l]* a[l][j] / a[l][l];
for ( i = l+1; i<n; i++ )
a[i][l] = 0;
printf ("\n Sistemul la pasul %d \n", l+1);
for (i = 0 ; i < n ; i++)
{
for ( j = 0; j < n; j++)
printf("%8.3lf ", a[i][j]);
printf(" | %8.3lf \n", a[i][n]);
}
}
//etapa 2
x[n-1] = a[n-1][n] / a[n-1][n-1];
for ( i = n-2; i >= 0; i--)
{
suma = 0;
for (j = i+1; j < n; j++)
suma = suma + a[i][j] * x[j];
x[i] = ( a[i][n] - suma ) / a[i][i];
}
printf ("\n Solutia sistemului este \n");
for (i = 0 ; i < n ; i++)
printf("%8.3lf ", a[i][j]);
printf(" \n" );
return 0;
}
Rezultatele
Matricea iniial a sistemului
Matricea 1 a sistemului
-8.000 7.000 3.000 6.000
10.000
-8.000 7.000 3.000 6.000
10.000
11.000 4.000 -2.000 3.000
47.000
0.000 13.625 2.125 11.250
60.750
13.000 7.000 25.000 3.000
61.000
0.000 18.375 29.875 12.750
77.250
5.000 -6.000 12.000 26.000
30.000
0.000 -1.625 13.875 29.750
36.250
Matricea 2 a sistemului
Matricea 3 a sistemului
-8.000 7.000 3.000 6.000
10.000
-8.000 7.000 3.000 6.000
10.000
0.000 13.625 2.125 11.250
60.750
0.000 13.625 2.125 11.250
60.750
0.000 0.000 27.009 -2.422
77.250
0.000 0.000 27.009 -2.422
-4.679
0.000 0.000 14.128 31.092
36.250
0.000 0.000 0.000 32.359
45.943
Soluia sistemului este: 10.000 60.750 -4.679 45.943
Metoda Gauss optimizat:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
#define Nmax 10
int main()
{
//clrscr();
int l,i,j,n=4,m,imax,jmax;
double a[Nmax][Nmax+1] = {{-8, 7, 3, 6, 10}, {11, 4, -2,
3, 47}, {13, 7, 25, 3, 61}, {5, -6, 12, 26, 30}} ,
A[Nmax][Nmax], X[Nmax];
int t1;
double sum, R, t;
//printf("Dati rangul sistemului -> "); scanf("%d", &n);
//printf("\nDati elementele matricei sistemului -> \n");
for(i=0;i<n;i++)
for(j=0;j<=n;j++) { //scanf("%lf",&a[i][j]);
A[i][j] = a[i][j];
//clrscr();
printf("\n Matriceainitiala
a sistemului\n");
for(i=0; i<n; i++)
{
for(j=0;j<n;j++)
printf("%8.3lf",a[i][j]);
printf(" %8.3lf \n", a[i][n]);
printf("\n");
for(l=0; l<n; l++)
{
if(a[l][l] == 0)
{
for(m = l+1; m<n; m++)
if(a[m][l] != 0) break;
if(m==n)
{
printf("\n Determinantul si stemului este egal
cu 0");
getch(); exit(-1);
for(j=0;j<=n;j++)
{
t = a[m][j];
a[l][j] = a[l][j]; a[l][j] = t;
}
}
for(j=l+1; j<=n; j++)
a[l][j] = a[l][j]/a[l][l];
a[l][l] = 1;
for(i=l+1; i<n; i++)
for(j=l+1; j<=n; j++)
a[i][j] = a[i][j] - a[i][l]*a[l][j];
for(i=l+1; i<n; i++)
a[i][l] = 0;
printf("\n Matricea %d
a sistemului\n", l+1);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%8.3lf",a[i][j]);
printf("%8.3lf \n",a[i][n]);
}
X[n-1] = a[n-1][n];
for(i=n-2; i>=0; i--)
{
sum = 0;
for(j=i+1; j<n; j++)
sum += a[i][j]*X[j];
X[i] = a[i][n] - sum;
printf(" Solutia sistemului este\n");
for(i=0;i<n;i++)
printf("%8.3lf", a[i] [j]);
printf("\n");
return 0;
}
Rezultatele
Matricea iniial a sistemului
-8.000 7.000 3.000 6.000
10.000
11.000 4.000 -2.000 3.000 47.000
13.000 7.000 25.000 3.000
61.000
5.000 -6.000 12.000 26.000
30.000
Matricea 2 a sistemului
1.000 -0.875 -0.375 0.750
-1.250
Matricea 1 a sistemului
1.000 -0.875 -0.375 0.750
-1.250
0.000 13.625 2.125 11.250
60.750
0.000 18.375 29.875 12.750
77.250
0.000 -1.625 13.875 29.750
36.250
Matricea 3 a sistemului
1.000 -0.875 -0.375 0.750
-1.250
0.000 1.000 0.156 0.826 4.459
0.000 1.000 0.156 0.826 4.459
0.000 0.000 27.009 -2.422 -4.679
0.000 0.000 1.000 -0.090 -0.173
0.000 0.000 14.128 31.092
43.495
0.000 0.000 0.000 32.359
45.943
Matricea 4 a sistemului
1.000 -0.875 -0.375 0.750
-1.250
0.000 1.000 0.156 0.826 4.459
0.000 0.0000 1.000 -0.090 -0.173
0.000 0.000 0.000 1.000 1.420
Metoda Gauss-Jordan:
#include<stdio.h>
#include<stdlib.h>
Soluia sistemului este:
-1.250 4.459 -0.173 1.420
#include<conio.h>
#include<math.h>
#define Nmax 10
int main()
{
//clrscr();
int l,i,j,n=4,m,imax,jmax;
double a[Nmax][Nmax+1] = {{-8, 7, 3, 6, 10}, {11, 4, -2,
3, 47},{13, 7, 25, 3, 61}, {5, -6, 12, 26, 30}} ,
A[Nmax][Nmax], X[Nmax];
int t1;
double R, t;
//printf("Datirangulsistemului -> ");
scanf("%d", &n);
//printf("\nDatielementelematriceisistemului -> \n");
for(i=0;i<n;i++)
for(j=0;j<=n;j++) {
//scanf("%lf",&a[i][j]);
A[i][j] =
a[i][j];
}
//clrscr();
printf("\n Matriceainitiala
a sistemului\n");
for(i=0; i<n; i++)
{
for(j=0;j<n;j++)
printf("%8.3lf",a[i][j]);
printf(" %8.3lf \n", a[i][n]);
printf("\n");
for(l=0; l<n; l++)
{
if(a[l][l] == 0)
{
for(m = l+1; m<n; m++)
if(a[m][l] != 0) break;
if(m==n)
{
printf("\n Determinantul sistemului este egal cu
0");
getch(); exit(-1);
for(j=0;j<=n;j++)
{
}
t = a[m][j];
a[l][j] = a[l][j]; a[l][j] = t;
}
for(i=0; i<n; i++)
if(i != l)
for(j=l+1; j<=n; j++)
a[i][j] = a[i][j] - a[i][l]*a[l][j]/a[l]
[l];
for(i=l+1; i<n; i++)
a[i][l] = 0;
for(i=0; i<l; i++)
a[i][l] = 0;
printf("\n Matricea %d
a sistemului\n", l+1);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%8.3lf",a[i][j]);
printf("%8.3lf \n",a[i][n]);
}
for(i=0;i<n;i++)
X[i] = a[i][n]/a[i][i];
printf(" Solutia este\n");
for(i=0;i<n;i++)
printf("%8.3lf", [i] [j]);
printf("\n");
return 0;
}
Rezultatele
Matricea iniial a sistemului
Matricea 1 a sistemului
-8.000 7.000 3.000 6.000 10.000
-8.000 7.000 3.000 6.000 10.000
11.000 4.000 -2.000 3.000 47.000
13.000 7.000 25.000 3.000 61.000
5.000
30.000
-6.000
12.000
26.000
0.000
60.750
0.000
77.250
0.000
36.250
13.625
18.375
-1.625
2.125
11.250
29.875
12.750
13.875
Matricea 2 a sistemului
Matricea 3 a sistemului
-8.000 0.000 1.908 0.220
-21.211
-8.000 0.000 0.000 0.391
-20.880
0.000 13.625 2.125 11.250
60.750
0.000 13.625 0.000 11.441
61.118
0.000 0.000 27.009 -2.422 -4.679
0.000 0.000 14.128 31.092
43.495
29.750
0.000 0.000 27.009 0.000 -1.240
0.000 0.000 0.000 32.359
45.943
Matricea 4 a sistemului
-8.000 0.000 0.000 0.000
-21.211
0.000 13.625 0.000 0.000 44.875
Soluia sistemului este:
-21.436 44.875 -1.240 45.943
0.000 0.0000 27.009 0.000 -1.240
0.000 0.000 0.000 32.359
45.943
Concluzii:
Metoda Gauss este o metoda directa de rezolvare a sistemelor de ecuatii
liniare. Avantajele acestei metoda sunt ca se poate afla solutiile unor
sisteme de ecualii liniare de dimensiuni mari, mai este numita metoda
eliminarii complete.
Metoda Gauss-Jordan este o metoda de calcul al inverse unei matrici,
care se rezuma la reducerea acesteia la matricea unitate, datorita caruia se
mai numeste si metoda diagonalizarii. Principalul avantaj al acestei
metode este obtinerea valorii determinantului fara calculi suplimentare.
Scopul acesteia este reducerea erorilor de rotunjire recomandindu-se ca la
fiecare pas sa se aduca pe pozitia pivotului elemental de valoare absolut
maxima, procedeu numit pivotare.