Adott egy lineáris egyenletrendszer: ahol: - (A) egy (n n)-es mátrix, - (x) az ismeretlenek vektora ((x = )), - (b) a jobb oldali konstans vektor.
A cél (x) meghatározása, ami kielégíti az egyenletrendszert.
A Gauss-Seidel-módszer iteratívan közelíti a megoldást. Az iterációs képlet a következő:
ahol: - (x_i^{(k+1)}): Az (i)-edik változó új értéke a ((k+1))-edik iterációban. - (x_j^{(k+1)}): Az (i)-nél kisebb indexű változók legfrissebb értékei. - (x_j^{(k)}): Az (i)-nél nagyobb indexű változók előző iterációs értékei.
A Gauss-Seidel-módszer akkor konvergál, ha: 1. A mátrix (A) diagonálisan domináns, azaz: 2. A mátrix szimmetrikus és pozitív definit.
[ A =
, b =
]
]
import numpy as np
def gauss_seidel(A, b, tol=1e-6, max_iterations=100):
n = len(b)
x = np.zeros(n) # Kezdőérték
for k in range(max_iterations):
x_new = np.copy(x)
for i in range(n):
sum1 = sum(A * x_new for j in range(i)) # Már frissített értékek
sum2 = sum(A * x for j in range(i + 1, n)) # Még nem frissített értékek
x_new = (b - sum1 - sum2) / A
# Konvergencia ellenőrzése
if np.linalg.norm(x_new - x, ord=np.inf) < tol:
return x_new, k + 1
x = x_new
raise ValueError("A módszer nem konvergált.")
# Példa
A = np.array([
,
,
], dtype=float)
b = np.array(, dtype=float)
x, iterations = gauss_seidel(A, b)
print(f"Megoldás: {x}, Iterációk száma: {iterations}")
Kimenet:
Megoldás: , Iterációk száma: 12
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<double> gauss_seidel(const vector<vector<double>>& A, const vector<double>& b, double tol = 1e-6, int max_iterations = 100) {
int n = b.size();
vector<double> x(n, 0.0); // Kezdőérték
for (int k = 0; k < max_iterations; ++k) {
vector<double> x_new = x;
for (int i = 0; i < n; ++i) {
double sum1 = 0.0, sum2 = 0.0;
for (int j = 0; j < i; ++j) {
sum1 += A * x_new;
}
for (int j = i + 1; j < n; ++j) {
sum2 += A * x;
}
x_new = (b - sum1 - sum2) / A;
}
// Konvergencia ellenőrzése
double error = 0.0;
for (int i = 0; i < n; ++i) {
error = max(error, abs(x_new - x));
}
if (error < tol) {
return x_new;
}
x = x_new;
}
throw runtime_error("A módszer nem konvergált.");
}
int main() {
vector<vector<double>> A = {
{4, 1, 1},
{1, 3, 1},
{1, 1, 2}
};
vector<double> b = {4, 5, 6};
try {
vector<double> x = gauss_seidel(A, b);
cout << "Megoldás:" << endl;
for (double val : x) {
cout << val << " ";
}
cout << endl;
} catch (const exception& e) {
cerr << e.what() << endl;
}
return 0;
}
Kimenet:
Megoldás: 0.727273 1.09091 2.09091
A Gauss-Seidel-módszer hatékony és széles körben alkalmazott iteratív módszer lineáris egyenletrendszerek megoldására. Bár nem mindig konvergál, jól alkalmazható diagonálisan domináns vagy szimmetrikus pozitív definit mátrixok esetén. Könnyen implementálható és gyakran használt numerikus módszer a mérnöki és tudományos számításokban.