1. Tema
Determinarea valorilor și vectorilor proprii ale unei matrici reale și simetrice prin metoda Jacobi. O problemă algebrică de valori și vectori proprii se exprimă prin relația: Ax=λx, unde A este o matrice pătratică de ordin n, x un vector (nenul) care se numește vector propriu (la dreapta), iar λ un număr care se numește valoare proprie.
2. Metoda
3. Exemplu
Să se determine valorile și vectorii proprii pentru matricea următoare, folosind metoda lui Jacobi.
În momentul îndeplinirii condiției de oprire în algoritm, valorile proprii sunt elementele de pe diagonala principală și vectorii proprii sunt coloanele matricei.
4. Algoritmul
Algoritmul asociat metodei Jacobi este:
Intrări:
- n = ordinul matricei sistemului
- A = matricea sistemului
- ε = precizia
Ieșiri:
- B = matricea ce are pe diagonala principală valorile proprii și ale cărei coloane sunt vectorii proprii.
5. Implementare
#include "stdafx.h" #include using namespace std; #define max 10 void main(void) { float s, max1, t, eps; float a[max + 1][max + 1], b[max + 1][max + 1]; int n, i, j, p, q; cout << "dati dimensiunea matricii" << endl; cin >> n; cout << "dati matricea" << 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 eroarea in forma: 1.0e-k, unde k este natural fara 0" << endl; cin >> eps; cout << endl; s = eps; while (s >= eps) { for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) b[i][j] = a[i][j]; max1 = abs(b[1][2]); p = 1; q = 2; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) { if (i != j) if (abs(b[i][j])>max1) { max1 = abs(b[i][j]); p = i; q = j; } } t = 0.5* atan(2 * b[p][q] / (b[p][p] - b[q][q])); a[p][p] = b[p][p] * cos(t)*cos(t) + b[q][q] * sin(t)*sin(t) + 2 * b[p][q] * sin(t)*cos(t); a[q][q] = b[p][p] * sin(t)*sin(t) + b[q][q] * cos(t)*cos(t) - 2 * b[p][q] * sin(t)*cos(t); a[p][q] = 0; a[q][p] = 0; for (i = 1; i <= n; i++) { if ((i != p) && (i != q)) { a[i][p] = b[i][p] * cos(t) + b[i][q] * sin(t); a[i][q] = -b[i][p] * sin(t) + b[i][q] * cos(t); a[p][i] = a[i][p]; a[q][i] = a[i][q]; for (j = 1; j <= n; j++) { if ((j != p) && (j != q)) { a[i][j] = b[i][j]; a[j][i] = a[i][j]; } } } } s = 0; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) if (j != i) s = s + a[i][j] * a[i][j]; } cout << "Val. proprii sunt:" << endl; for (i = 1; i <= n; i++) cout << a[i][i] << ' '; cout << endl; cout << "Vect. proprii sunt:" << endl; for (j = 1; j <= n; j++) { cout << "Vect. propriu " << j << " este "; for (i = 1; i <= n; i++) cout << a[i][j] << ' '; cout << endl; } system("pause"); }
Rezultat: