1. Tema
Rezolvarea numerică a sistemelor algebrice liniare prin metoda Jacobi.
Un sistem de n ecuații liniare cu n necunoscute are forma Ax=b, unde A este o matrice pătrată, nesingulară, de dimensiune nxn, iar x și b sunt vectori coloană de dimensiune n.
2. Metoda
Considerăm aproximația inițială un element din Rn, unde indicele superior reprezintă etapa.
Construim șirul definit prin formula de recurență:
Utilizăm verificarea condiției
pentru convergența șirului.
3. Exemplu
Să se rezolve folosind metoda iterativă Jacobi, sistemul:
Rezolvare
Matricea A asociată sistemului (în etapa 1) și vectorul termenilor liberi b sunt:
Șirul de recurențe pentru soluție este:
4. Algoritmul
Algoritmul asociat metodei Jacobi este:
Intrări:
- n = numărul de ecuații și necunoscute ale sistemului
- A = matricea sistemului
- b = vectorul termenilor liberi
- y = aproximația anterioară a soluției
- ε = precizia
Ieșiri:
- x = aproximația soluției
5. Implementare
// Metoda Jacobi pentru rezolvarea sistemelor #include "stdafx.h" #include using namespace std; #define max 10 void main(void) { float s, s1, eps; float a[max + 1][max + 1], b[max + 1], x[max + 1], y[max + 1]; int n, i, j; cout << "dati numarul de ecuatii si necunoscute " << endl; cin >> n; cout << "dati matricea sistemului " << endl; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) { cout << "a[" << i << j << "]="; cin >> a[i][j]; } cout << endl; cout << "dati vectorul termenilor liberi " << endl; for (i = 1; i <= n; i++) { cout << "b[" << i << "]="; cin >> b[i]; } cout << endl; cout << "dati aproximatia initiala a solutiei " << endl; for (i = 1; i <= n; i++) { cout << "x[" << i << "]="; cin >> y[i]; } cout << endl; cout << "dati eroarea " << endl; cin >> eps; cout << endl; s = eps + 1; while (s >= eps) { for (i = 1; i <= n; i++) { s1 = 0; for (j = 1; j <= n; j++) if (j != i)s1 = s1 + a[i][j] * y[j]; x[i] = (b[i] - s1) / a[i][i]; } s = 0; for (i = 1; i <= n; i++) s = s + abs(x[i] - y[i]); for (i = 1; i <= n; i++) y[i] = x[i]; } cout << "Solutia aproximativa este " << endl; for (i = 1; i <= n; i++) cout << x[i] << endl; system("pause"); }
Rezultat