Académique Documents
Professionnel Documents
Culture Documents
Roberto Basili
University of Rome Tor Vergata,
Department of Computer Science, Systems and Production,
00133 Roma (Italy),
basili@info.uniroma2.it
Motivazioni
La seguente dispensa introduce i principi alla base della soluzione con metodi diretti per
la soluzione dei sistemi lineari di n equazioni in n incognite. Inoltre essa fornisce alcune
indicazioni ed esempi per la loro implementazione.
Per una trattazione piu completa degli aspetti analitici di tali metodi si rimanda al
testo Introduzione al Calcolo Numerico, R. Bevilacqua, O. Menchi, ETS, Pisa, 191980.
Per approfondire aspetti algoritmici del problema si consiglia il testo Introduction to
Algorithms, T.H. Cormen, C. E. Leiserson, R.L. Rivest, MIT Press, 1990.
Ax = b (1)
con A = (aij ) i, j = 1, ..., n (detta matrice dei coefficenti ), b = (b1 , ..., bn ) (detto vettore
dei termini noti ) ed x = (x1 , ..., xn ) detto vettore delle soluzioni.
aij = 0 j < i
una soluzione diretta alla (1) e data dal vettore x definito nel seguente modo:
xn = bn annP
(2)
xi = (bi nk=i+1 aik xk )/aii , i = n 1, n 2, ..., 2, 1
1
b = b(1) b(2) ... b(n1) b(n) = b0
tali che:
A(k) x = b(k) k = 1, ..., n
main()
{
double A[MAX_DIM][MAX_DIM], // matrice coefficenti
B[MAX_DIM], // matrice termini noti
X[MAX_DIM]; // vettore soluzioni
2
1.2.2 Calcolo delle soluzioni allindietro
temp = b[i];
for( k=i+1; k<dim; k++)
temp=temp-A[i][k]*sol[k];
x[i] = temp/A[i][i];
3
1.2.3 Struttura del programma principale
main()
{
double A[MAX_DIM][MAX_DIM], // matrice coefficenti
B[MAX_DIM], // matrice termini noti
X[MAX_DIM]; // vettore soluzioni
do{
system("cls"); cout << "\n\n\n";
// leggi matrice ingresso
leggi(A, dim);
//stampa il sistema
stampa(A,B,dim);
cout << "\n\n ======== ? Vuoi continuare (y/n) ? >>> "; cin >> resp;
} while( resp == y || resp == Y );
} // main()
4
// combinazione lineare delle righe al di sotto della i-esima
for( i=j+1;i<dim; i++) {
// sottrazione
for( k=j; k<dim; k++)
coef_mat[i][k]=coef_mat[i][k]-alfa*coef_mat[j][k];
return(0);
}// gauss()
5
// cerco il primo elemento non nullo
k=j;
while( k<dim && matr[k][j]==0 ) ++k;
if( k!=j ) {
cout << "Scambio Riga " << j << " con " << k << "\n";
// scambio righe
for( r=j; r<dim; r++ )
{
temp = matr[j][r];
matr[j][r] = matr[k][r];
matr[k][r] = temp;
}
temp = tn[j];
tn[j] = tn[k];
tn[k] = temp;
}
return(0);
} // pivot()
| 1 1 1 1 |
| 1 2 1 1 |
A = | 1 1 3 1 |
| 1 1 1 4 |
| 1 |
b = | 2 |
| 3 |
| 4 |
6
a(2,1)=0 a(2,2)=1 a(2,3)=0 a(2,4)=0
a(3,1)=0 a(3,2)=0 a(3,3)=2 a(3,4)=0
a(4,1)=0 a(4,2)=0 a(4,3)=0 a(4,4)=3
7
A Programma completo per lapplicazione del metodo di
Gauss
per la soluzione dei sistemi lineari
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#include <stdlib.h>
// struct matrix {
// combinazione lineare
for( i=j+1;i<dim; i++) {
// calcolo del coefficente della combinazione lineare
alfa = coef_mat[i][j]/piv;
// sottrazione
for( k=j; k<dim; k++)
coef_mat[i][k]=coef_mat[i][k]-alfa*coef_mat[j][k];
// termini noti
term_noti[i]=term_noti[i]-alfa*term_noti[j];
} // for su righe i da j+1 a n
// Check su determinante
if( coef_mat[dim-1][dim-1] == 0) {
cout << "Righe linearmente dipendenti. Soluzioni infinite\n\n";
return(1);
}
8
sol[dim]=term_noti[dim]/coef_mat[dim][dim];
for(i=dim-1; i>=0; i--) {
temp = term_noti[i];
for( k=i+1; k<dim; k++)
temp=temp-coef_mat[i][k]*sol[k];
sol[i] = temp/coef_mat[i][i];
} // for sulle righe n-1,n-2, ..., 1
return(0);
}// gauss()
if( k!=j ) {
cout << "Scambio Riga " << j << " con " << k << "\n";
// scambio righe
for( r=j; r<dim; r++ )
{
temp = matr[j][r];
matr[j][r] = matr[k][r];
matr[k][r] = temp;
}
temp = tn[j];
tn[j] = tn[k];
tn[k] = temp;
}
return(0);
} // pivot()
9
void leggi( double matr[MAX_DIM][MAX_DIM], int &dim)
{
int i,j;
main()
{
double A[MAX_DIM][MAX_DIM], // matrice coefficenti
B[MAX_DIM], // matrice termini noti
X[MAX_DIM]; // vettore soluzioni
10
do{
system("cls"); cout << "\n\n\n";
// leggi matrice ingresso
leggi(A, dim);
//stampa il sistema
stampa(A,B,dim);
// stampa()
if ( success==0 ) {
cout << "\n\nLa Matrice Triangolare superiore e:\n";
stampa(A,B,dim);
cout << "\n\nIl vettore delle soluzioni e:\n";
stampa_sol(X,dim);
} else cout << "Il sistema e indeterminato.\n\n";
cout << "\n\n ======== ? Vuoi continuare (y/n) ? >>> "; cin >> resp;
} while( resp == y || resp == Y );
} // main()
11