Metoda Jacobi

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ă metoda jacobi1 un element din Rn, unde indicele superior reprezintă etapa.

Construim șirul metoda jacobi2 definit prin formula de recurență:

metoda jacobi3

Utilizăm verificarea condiției

metoda jacobi4

pentru convergența șirului.

3. Exemplu

Să se rezolve folosind metoda iterativă Jacobi, sistemul:

metoda eliminarii lui Gauss3

Rezolvare

Matricea A asociată sistemului (în etapa 1) și vectorul termenilor liberi b sunt:

metoda eliminarii lui Gauss4

Șirul de recurențe pentru soluție este:

metoda jacobi5

metoda jacobi6

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

metoda jacobi7

5. Implementare

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

metoda jacobi rezultat

Leave a comment