Метод Гаусса—Зейделя[1] является классическим итерационным методом решения системы линейных уравнений.
Содержание |
Возьмём систему: , где
Или
И покажем, как её можно решить с использованием метода Гаусса-Зейделя.
Чтобы пояснить суть метода, перепишем задачу в виде:
Здесь в -м уравнении мы перенесли в правую часть все члены, содержащие , для . Эта запись может быть представлена:
где в принятых обозначениях D означает матрицу, у которой на главной диагонали стоят соответствующие элементы матрицы A, а все остальные нули; тогда как матрицы U и L содержат верхнюю и нижнюю треугольные части A, на главной диагонали которых нули.
Итерационный процесс в методе Гаусса-Зейделя строится по формуле после выбора соответствующего начального приближения .
Метод Гаусса-Зейделя можно рассматривать как модификацию метода Якоби. Основная идея модификации состоит в том, что новые значения используются здесь сразу же по мере получения, в то время как в методе Якоби они не используются до следующей итерации:
где
Таким образом i-тая компонента -го приближения вычисляется по формуле:
Приведём достаточное условие сходимости метода.
Теорема. Пусть , где – матрица, обратная к . Тогда при любом выборе начального приближения :
|
Условие окончания итерационного процесса Зейделя при достижении точности в упрощённой форме имеет вид:
Более точное условие окончания итерационного процесса имеет вид
и требует больше вычислений. Хорошо подходит для разреженных матриц.
// Условие сходимости bool converge(double *xk, double *xkp) { for (int i = 0; i < n; i++) { if (fabs(xk[i] - xkp[i]) >= eps) return false; } return true; } /* Ход метода, где: a[n][n] - Матрица коэффициентов x[n], p[n] - Текущее и предыдущее решения */ do { for (int i = 0; i < n; i++) { double var = 0; for (int j = 0; j < n; j++) if (j != i) var += (a[i][j] * x[j]); p[i] = x[i]; x[i] = (b[i] - var) / a[i][i]; } } while (!converge(x, p));
type ar2d=array[1..50,1..50] of double; ar1d=array[1..50] of double; procedure seidel(n:byte;e:extended;a:ar2d;b:ar1d;x:ar1d); var i,j:longint; s,v,m:double; begin // проверка на совместность for i:=1 to n do begin s:=0; for j:=1 to n do if j<>i then s:=s+abs(a[i,j]); if s>=abs(a[i,i]) then begin writeln('SLAE is uncompactible'); exit end; end; // Сам алгоритм repeat m:=0; for i:=1 to n do begin s:=0; for j:=1 to n do if i<>j then s:=s+a[i,j]*x[j]; v:=x[i]; x[i]:=(b[i]-s)/a[i,i]; if abs(v-x[i])>m then m:=abs(v-x[i]); end; until m<e; // OUTPUTTING writeln('roots: '); for i:=1 to n do writeln('x[',i,']= ',x[i]:0:4); end;
Метод покоординатного спуска относится к, метод покоординатного спуска что это, метод покоординатного спуска геометрическая интерпретация.