Последовательное чрезмерное расслабление
В числовой линейной алгебре метод последовательной сверхрелаксации ( SOR ) представляет собой вариант метода Гаусса–Зейделя решения линейной системы уравнений , приводящий к более быстрой сходимости. Подобный метод можно использовать для любого медленно сходящегося итерационного процесса .
Он был разработан одновременно Дэвидом М. Янгом-младшим и Стэнли П. Франкелем в 1950 году с целью автоматического решения линейных систем на цифровых компьютерах. Методы чрезмерной релаксации использовались до работы Янга и Франкеля. Примером может служить метод Льюиса Фрая Ричардсона и методы, разработанные Р. В. Саутвеллом . Однако эти методы были разработаны для вычислений с помощью человеческих калькуляторов , что требовало определенного опыта для обеспечения сходимости к решению, что делало их неприменимыми для программирования на цифровых компьютерах. Эти аспекты обсуждаются в диссертации Дэвида М. Янга-младшего. [1]
Формулировка [ править ]
Дана квадратная система из n линейных уравнений с неизвестным x :
где:
Тогда A можно разложить на диагональную компоненту D и строго нижнюю и верхнюю треугольные компоненты L и U :
где
Систему линейных уравнений можно переписать в виде:
для постоянной ω > 1, называемой фактором релаксации .
Метод последовательного чрезмерного расслабления — это итеративный метод , который решает левую часть этого выражения для x , используя предыдущее значение x в правой части. Аналитически это можно записать так:
где — это k -е приближение или итерация и это следующая или k + 1 итерация . Однако, воспользовавшись треугольной формой ( D + ωL ), элементы x ( к +1) можно вычислить последовательно с помощью прямой замены :
Это снова можно записать аналитически в матрично-векторной форме без необходимости обращения матрицы. : [2]
Конвергенция [ править ]

Выбор коэффициента релаксации ω не всегда прост и зависит от свойств матрицы коэффициентов. В 1947 году Островский доказал, что если симметричен , и положительно определен то для . Таким образом, следует сходимость итерационного процесса, но нас обычно интересует более быстрая сходимость, а не просто сходимость.
Скорость конвергенции [ править ]
Скорость сходимости для метода SOR можно определить аналитически. Нужно предположить следующее [3] [4]
- параметр релаксации подходит:
- Якоби Итерационная матрица имеет только действительные собственные значения
- Метод Якоби сходится:
- матричное разложение удовлетворяет свойству, которое для любого и .
Тогда скорость сходимости можно выразить как
где оптимальный параметр релаксации определяется выражением
В частности, для ( Гаусса-Зейделя ) считается, что . Для оптимального мы получаем , который показывает, что SOR примерно в четыре раза эффективнее, чем метод Гаусса – Зейделя.
Последнее предположение выполнено для трехдиагональных матриц, поскольку для диагонали с записями и .
Алгоритм [ править ]
Поскольку элементы могут быть перезаписаны во время их вычисления в этом алгоритме, требуется только один вектор хранения, а индексирование вектора опускается. Алгоритм следующий:
Inputs: A, b, ω Output: φ Choose an initial guess φ to the solution repeat until convergence for i from 1 until n do set σ to 0 for j from 1 until n do if j ≠ i then set σ to σ + aij φj end if end (j-loop) set φi to (1 − ω)φi + ω(bi − σ) / aii end (i-loop) check if convergence is reached end (repeat)
- Примечание
- также можно написать , тем самым сохраняя одно умножение на каждой итерации внешнего цикла for .
Пример [ править ]
Нам представлена линейная система
Для решения уравнений выберем коэффициент релаксации и исходный вектор предположения . В соответствии с алгоритмом последовательного сверхрелаксации получается следующая таблица, представляющая примерную итерацию с приближениями, которая в идеале, но не обязательно, находит точное решение (3, −2, 2, 1) за 38 шагов.
Итерация | ||||
---|---|---|---|---|
1 | 0.25 | −2.78125 | 1.6289062 | 0.5152344 |
2 | 1.2490234 | −2.2448974 | 1.9687712 | 0.9108547 |
3 | 2.070478 | −1.6696789 | 1.5904881 | 0.76172125 |
... | ... | ... | ... | ... |
37 | 2.9999998 | −2.0 | 2.0 | 1.0 |
38 | 3.0 | −2.0 | 2.0 | 1.0 |
Ниже предлагается простая реализация алгоритма на Common Lisp.
;; Set the default floating-point format to "long-float" in order to
;; ensure correct operation on a wider range of numbers.
(setf *read-default-float-format* 'long-float)
(defparameter +MAXIMUM-NUMBER-OF-ITERATIONS+ 100
"The number of iterations beyond which the algorithm should cease its
operation, regardless of its current solution. A higher number of
iterations might provide a more accurate result, but imposes higher
performance requirements.")
(declaim (type (integer 0 *) +MAXIMUM-NUMBER-OF-ITERATIONS+))
(defun get-errors (computed-solution exact-solution)
"For each component of the COMPUTED-SOLUTION vector, retrieves its
error with respect to the expected EXACT-SOLUTION vector, returning a
vector of error values.
---
While both input vectors should be equal in size, this condition is
not checked and the shortest of the twain determines the output
vector's number of elements.
---
The established formula is the following:
Let resultVectorSize = min(computedSolution.length, exactSolution.length)
Let resultVector = new vector of resultVectorSize
For i from 0 to (resultVectorSize - 1)
resultVector[i] = exactSolution[i] - computedSolution[i]
Return resultVector"
(declare (type (vector number *) computed-solution))
(declare (type (vector number *) exact-solution))
(map '(vector number *) #'- exact-solution computed-solution))
(defun is-convergent (errors &key (error-tolerance 0.001))
"Checks whether the convergence is reached with respect to the
ERRORS vector which registers the discrepancy betwixt the computed
and the exact solution vector.
---
The convergence is fulfilled if and only if each absolute error
component is less than or equal to the ERROR-TOLERANCE, that is:
For all e in ERRORS, it holds: abs(e) <= errorTolerance."
(declare (type (vector number *) errors))
(declare (type number error-tolerance))
(flet ((error-is-acceptable (error)
(declare (type number error))
(<= (abs error) error-tolerance)))
(every #'error-is-acceptable errors)))
(defun make-zero-vector (size)
"Creates and returns a vector of the SIZE with all elements set to 0."
(declare (type (integer 0 *) size))
(make-array size :initial-element 0.0 :element-type 'number))
(defun successive-over-relaxation (A b omega
&key (phi (make-zero-vector (length b)))
(convergence-check
#'(lambda (iteration phi)
(declare (ignore phi))
(>= iteration +MAXIMUM-NUMBER-OF-ITERATIONS+))))
"Implements the successive over-relaxation (SOR) method, applied upon
the linear equations defined by the matrix A and the right-hand side
vector B, employing the relaxation factor OMEGA, returning the
calculated solution vector.
---
The first algorithm step, the choice of an initial guess PHI, is
represented by the optional keyword parameter PHI, which defaults
to a zero-vector of the same structure as B. If supplied, this
vector will be destructively modified. In any case, the PHI vector
constitutes the function's result value.
---
The terminating condition is implemented by the CONVERGENCE-CHECK,
an optional predicate
lambda(iteration phi) => generalized-boolean
which returns T, signifying the immediate termination, upon achieving
convergence, or NIL, signaling continuant operation, otherwise. In
its default configuration, the CONVERGENCE-CHECK simply abides the
iteration's ascension to the ``+MAXIMUM-NUMBER-OF-ITERATIONS+'',
ignoring the achieved accuracy of the vector PHI."
(declare (type (array number (* *)) A))
(declare (type (vector number *) b))
(declare (type number omega))
(declare (type (vector number *) phi))
(declare (type (function ((integer 1 *)
(vector number *))
*)
convergence-check))
(let ((n (array-dimension A 0)))
(declare (type (integer 0 *) n))
(loop for iteration from 1 by 1 do
(loop for i from 0 below n by 1 do
(let ((rho 0))
(declare (type number rho))
(loop for j from 0 below n by 1 do
(when (/= j i)
(let ((a[ij] (aref A i j))
(phi[j] (aref phi j)))
(incf rho (* a[ij] phi[j])))))
(setf (aref phi i)
(+ (* (- 1 omega)
(aref phi i))
(* (/ omega (aref A i i))
(- (aref b i) rho))))))
(format T "~&~d. solution = ~a" iteration phi)
;; Check if convergence is reached.
(when (funcall convergence-check iteration phi)
(return))))
(the (vector number *) phi))
;; Summon the function with the exemplary parameters.
(let ((A (make-array (list 4 4)
:initial-contents
'(( 4 -1 -6 0 )
( -5 -4 10 8 )
( 0 9 4 -2 )
( 1 0 -7 5 ))))
(b (vector 2 21 -12 -6))
(omega 0.5)
(exact-solution (vector 3 -2 2 1)))
(successive-over-relaxation
A b omega
:convergence-check
#'(lambda (iteration phi)
(declare (type (integer 0 *) iteration))
(declare (type (vector number *) phi))
(let ((errors (get-errors phi exact-solution)))
(declare (type (vector number *) errors))
(format T "~&~d. errors = ~a" iteration errors)
(or (is-convergent errors :error-tolerance 0.0)
(>= iteration +MAXIMUM-NUMBER-OF-ITERATIONS+))))))
Простая реализация псевдокода, представленного выше, на Python.
import numpy as np
from scipy import linalg
def sor_solver(A, b, omega, initial_guess, convergence_criteria):
"""
This is an implementation of the pseudo-code provided in the Wikipedia article.
Arguments:
A: nxn numpy matrix.
b: n dimensional numpy vector.
omega: relaxation factor.
initial_guess: An initial solution guess for the solver to start with.
convergence_criteria: The maximum discrepancy acceptable to regard the current solution as fitting.
Returns:
phi: solution vector of dimension n.
"""
step = 0
phi = initial_guess[:]
residual = linalg.norm(A @ phi - b) # Initial residual
while residual > convergence_criteria:
for i in range(A.shape[0]):
sigma = 0
for j in range(A.shape[1]):
if j != i:
sigma += A[i, j] * phi[j]
phi[i] = (1 - omega) * phi[i] + (omega / A[i, i]) * (b[i] - sigma)
residual = linalg.norm(A @ phi - b)
step += 1
print("Step {} Residual: {:10.6g}".format(step, residual))
return phi
# An example case that mirrors the one in the Wikipedia article
residual_convergence = 1e-8
omega = 0.5 # Relaxation factor
A = np.array([[4, -1, -6, 0],
[-5, -4, 10, 8],
[0, 9, 4, -2],
[1, 0, -7, 5]])
b = np.array([2, 21, -12, -6])
initial_guess = np.zeros(4)
phi = sor_solver(A, b, omega, initial_guess, residual_convergence)
print(phi)
чрезмерное расслабление последовательное Симметричное
Версия для симметричных матриц A , в которой
называется симметричной последовательной чрезмерной релаксацией или ( SSOR ), при которой
и итерационный метод
Авторство методов SOR и SSOR принадлежит Дэвиду М. Янгу-младшему.
Другие применения метода [ править ]
Подобный метод можно использовать для любого итерационного метода. Если исходная итерация имела форму
тогда модифицированная версия будет использовать
Однако представленная выше формулировка, используемая для решения систем линейных уравнений, не является частным случаем этой формулировки, если x считать полным вектором. Если вместо этого использовать эту формулировку, уравнение для расчета следующего вектора будет выглядеть так:
где . Ценности используются для ускорения сходимости медленно сходящегося процесса, а значения часто используются, чтобы помочь установить сходимость расходящегося итерационного процесса или ускорить сходимость процесса, проходящего через перерегулирование .
Существуют различные методы, адаптивно устанавливающие параметр релаксации. на основе наблюдаемого поведения сходящегося процесса. Обычно они помогают достичь суперлинейной сходимости для некоторых задач, но терпят неудачу в решении других.
См. также [ править ]
Примечания [ править ]
- ^ Янг, Дэвид М. (1 мая 1950 г.), Итеративные методы решения уравнений в частных разностях эллиптического типа (PDF) , докторская диссертация, Гарвардский университет , получено 15 июня 2009 г.
- ^ Тёрниг, Вилли. Вычислительная математика для инженеров и физиков (1-е изд.). Шпрингер Берлин, Гейдельберг. п. 180. ИСБН 978-3-642-96508-1 . Проверено 20 мая 2024 г.
- ^ Хакбуш, Вольфганг (2016). «4.6.2». Итерационное решение больших разреженных систем уравнений | СпрингерЛинк . Прикладные математические науки. Том. 95. дои : 10.1007/978-3-319-28483-5 . ISBN 978-3-319-28481-1 .
- ^ Гринбаум, Энн (1997). «10.1». Итерационные методы решения линейных систем . Границы прикладной математики. Том. 17. дои : 10.1137/1.9781611970937 . ISBN 978-0-89871-396-1 .
Ссылки [ править ]
- Эта статья включает текст из статьи Successive_over-relaxation_method__-_SOR на CFD-Wiki , которая находится под лицензией GFDL .
- Авраам Берман, Роберт Дж. Племмонс , Неотрицательные матрицы в математических науках , 1994, SIAM. ISBN 0-89871-321-8 .
- Блэк, Ноэль и Мур, Ширли. «Метод последовательной сверхрелаксации» . Математический мир .
- А. Хаджидимос, Последовательная чрезмерная релаксация (SOR) и родственные методы , Журнал вычислительной и прикладной математики 123 (2000), 177–199.
- Юсеф Саад , Итеративные методы для разреженных линейных систем , 1-е издание, PWS, 1996.
- Копия Netlib «Шаблоны для решения линейных систем» Барретта и др.
- Ричард С. Варга. , 2002 г. Матричный итеративный анализ , Второе изд. (издание Prentice Hall 1962 года), Springer-Verlag.
- Дэвид М. Янг-младший. Итеративное решение больших линейных систем , Academic Press, 1971. (перепечатано Dover, 2003).
Внешние ссылки [ править ]
- Модуль для метода SOR
- Решатель трехдиагональной линейной системы на основе SOR на C++