Metoda Gauss-Seidel

1. Tema

Rezolvarea numerică a sistemelor algebrice liniare prin metoda Gauss-Seidel.

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 gauss-siedel1

Utilizăm verificarea condiției

metoda jacobi4

pentru convergența șirului.

3. Exemplu

Să se rezolve, folosind metoda Gauss-Seidel, următorul sistem:

metoda gauss-siedel2

Rezolvare:

metoda gauss-siedel3

metoda gauss-siedel4

4. Algoritmul

Algoritmul asociat metodei Gauss-Seidel 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 gauss-siedel5

5. Implementare

Visual_C++_Icon
Cod Sursa C++
// Metoda Gauss-Seidel 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 >> x[i]; 
		y[i] = x[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] * x[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 gauss-siedel rezultat

Leave a comment