Metoda Jacobi (VVP)

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

vvp1

3. Exemplu

Să se determine valorile și vectorii proprii pentru matricea următoare, folosind metoda lui Jacobi.

vvp2

Î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.

vvp3

vvp4

5. Implementare

Visual_C++_Icon
Cod Sursa C++
#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:

vvp rezultat

Leave a comment