가우스-자이델 방법
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
가우스-자이델 방법은 선형 연립 방정식을 풀기 위한 반복적인 수치 해석 방법이다. 이 방법은 주어진 선형 방정식 시스템의 해를 반복적으로 근사하며, 각 반복에서 이전 반복에서 계산된 값을 사용하여 변수를 업데이트한다. 가우스-자이델 방법은 일반적으로 야코비 방법보다 빠르게 수렴하지만, 각 변수를 순차적으로 업데이트해야 하므로 병렬 처리가 어렵다는 단점이 있다. 이 방법은 행렬이 대각 지배적이거나 대칭 양의 정부호 행렬일 때 수렴이 보장된다.
가우스-자이델 방법은 다음과 같은 n개의 선형 방정식 시스템을 반복적으로 풀어 해를 근사하는 방법이다.
가우스-자이델 방법의 수렴성은 행렬 의 특성에 따라 결정된다. 다음 조건 중 하나라도 만족하면 수렴이 보장된다.
2. 설명
:
여기서 A와 b가 주어져 있고 x가 미지수일 때, 가우스-자이델 방법을 사용하여 x를 반복적으로 근사할 수 있다. 벡터 x(0)은 x의 초기 추측값을 나타내며, 종종 i=1,2,...,n에 대해 x(0)i=0으로 설정한다. x(k)는 x의 k번째 근사값 또는 반복을 나타내고, x(k+1)는 다음 (k+1번째) 반복에서 x의 근사값을 나타낸다.
n차 정사각 행렬 A는 상삼각 행렬 U, 하삼각 행렬 L, 대각 행렬 D의 합으로 표현할 수 있다. (A = L + D + U) 이를 이용하면 다음과 같은 변형이 가능하다.
:
이 식을 만족하는 x를 구한다. 초기값 x(0)에 대해, k번째 반복에서 얻어진 x1의 값을 x1(k)라고 하면, 다음과 같은 반복법의 점화식을 얻을 수 있다.
:
이 식은 다음과 같이 변형할 수 있다.
:
만약 해가 수렴하는 경우, x1(k+1)와 x1(k)는 공통 값 x1(*)을 가지게 된다. 이때,
:
가 되어, 원래의 연립방정식 형태로 돌아간다. 따라서 가우스-자이델 방법으로 해가 수렴하는 경우, 그 해는 연립방정식의 해가 된다.
가우스-자이델 방법은 각 성분마다 다음과 같은 식으로 표현할 수 있으며, 수치 해석에서 주로 사용된다.
:
SOR 방법은 야코비 방법과 가우스-자이델 방법을 가속하는 방법으로 알려져 있다.
2. 1. 행렬 기반 공식
가우스-자이델 방법은 주어진 선형 방정식 에서 행렬 를 하삼각 행렬 과 상삼각 행렬 로 분해하여 해를 반복적으로 구하는 방법이다. 즉, 일 때,[4] 다음 식을 이용하여 반복 계산을 수행한다.
:
여기서 는 의 번째 근사값 또는 반복을 나타내고, 는 다음 (번째) 반복에서 의 근사값을 나타낸다.
차 정사각 행렬 를 상삼각 행렬 , 하삼각 행렬 , 대각 행렬 로 나타내면, ''A=L+D+U''로 쓸 수 있다. 이를 이용해 다음과 같이 변형 가능하다.
:
:
위 식을 만족하는 ''x''를 구하기 위해, 초기값 에 대해 번째 반복에서 얻어진 의 값을 라고 하면, 다음과 같은 반복법의 점화식을 얻을 수 있다.
:
이 식은 다음과 같이 변형할 수 있다.
:
만약 해가 수렴하는 경우, 와 는 공통 값 을 갖게 된다. 이때,
:
가 성립하며, 이를 변형하면 원래의 연립방정식 형태로 돌아간다. 따라서 가우스-자이델 방법으로 해가 수렴하는 경우, 그 해는 연립방정식의 해가 된다.
가우스-자이델 방법의 식은 벡터 의 각 성분마다 다음과 같은 식으로 쓸 수 있으며, 수치 해석에서는 이 식을 사용한다.
:
SOR 방법은 가우스-자이델 방법과 야코비 방법을 가속하는 방법으로 알려져 있다.
2. 1. 1. 행렬 기반 공식의 원리
하삼각 행렬 성분 과 상삼각 행렬 성분 로 분해되는 행렬 는 를 만족한다.[4] 를 과 로 분해하면 다음과 같다.
:
선형 방정식 시스템은 다음과 같이 다시 쓸 수 있다.
:
가우스-자이델 방법은 위 식의 좌변을 ''''''에 대해 풀고, 우변에서는 ''''''의 이전 값을 사용한다. 이를 분석적으로 표현하면 다음과 같다.
차 정사각 행렬 를 상삼각 행렬 , 하삼각 행렬 , 대각 행렬 로 나타내면, ''A=L+D+U''와 같이 쓸 수 있다. 이를 이용해 다음과 같은 변형이 가능하다.
위 식을 만족하는 ''x''를 구하기 위해, 초기값 에 대해 번째 반복에서 얻어진 의 값을 라고 하면, 다음과 같은 반복법의 점화식을 얻을 수 있다.
이 식은 다음과 같이 변형할 수 있다.
만약 해가 수렴하면, 와 는 공통 값 을 갖게 된다. 이때,
가 성립하며, 이를 변형하면 원래의 연립방정식 형태로 돌아간다. 따라서 가우스-자이델 방법으로 해가 수렴하는 경우, 그 해는 연립방정식의 해가 된다.
가우스-자이델 방법의 식은 벡터 의 각 성분마다 다음과 같은 식으로 쓸 수 있으며, 수치 해석에서는 이 식을 사용한다.
2. 2. 원소별 공식
각 행 *i*에 대해 전진 대입법을 사용하여 의 원소를 순차적으로 계산한다.[5]
:
이 공식은 반복마다 두 개의 합을 사용하며, 의 가장 최근에 계산된 반복을 사용하는 하나의 합 로 표현할 수 있다.
가우스-자이델 방법의 식은 벡터 의 각 성분마다 다음과 같은 식으로 쓸 수 있으며, 수치 해석에서는 이 식을 사용한다.
:
3원 연립 일차 방정식의 경우,
:
를 푸는 것을 생각한다. *k*번째 반복에서 얻어진 의 값을 로 쓴다. 초기값 는, 적당한 값, 예를 들어 영벡터라도 상관없다.
:
:
:
위의 식을 반복한다. 여기서, 두 번째 식에서 이 사용되고 있다는 것에 주의한다. 연달아 새로운 을 구해서, 다음 식에서 사용한다.
2. 3. 논의
가우스-자이델 방법은 야코비 방법과 유사하지만, 몇 가지 중요한 차이점이 있다. 가우스-자이델 방법에서는 을 계산할 때 이미 계산된 의 원소를 사용하고, 아직 계산되지 않은 의 원소만 사용하여, 계산된 최신 원소를 즉시 사용한다.
이러한 특징 덕분에 야코비 방법과 달리 하나의 저장 벡터만 필요하며, 이는 매우 큰 문제에서 유리할 수 있다. 또한, 일반적으로 야코비 방법보다 수렴 속도가 빠르다.
하지만, 야코비 방법과 달리 각 원소의 계산은 원래 방정식의 순서에 따라 달라지며, 병렬 알고리즘으로 구현하기 어렵다. 각 원소 계산이 매우 긴 임계 경로를 가질 수 있기 때문에, 희소 행렬에 가장 적합하다.
가우스-자이델 방법은 일 때 연속 과잉 완화(SOR)와 동일하다.
3. 수렴성
이러한 조건이 충족되지 않더라도 가우스-자이델 방법이 수렴하는 경우도 있다.
골럽(Golub)과 반 로언(Van Loan)은 를 두 부분으로 나누는 알고리즘에 대한 정리를 제시했다. 가 비특이 행렬이라고 가정하고, 을 의 스펙트럼 반경이라고 하자. 그러면 로 정의된 반복 는 이 비특이 행렬이고 이면 어떤 시작 벡터 에 대해서도 로 수렴한다.[8]
가우스-자이델 방법은 계수 행렬이 양의 정부호 대칭 행렬이면 수렴한다.
또한, 계수 행렬의 각 행에서 비대각 성분의 절대값의 합이 대각 성분의 절대값보다 작으면 수렴한다(이는 야코비 방법도 마찬가지이다). 즉, 대각 우세 행렬이면 수렴한다.
:
계수 행렬이 양의 정부호 대칭인 경우, 가우스-자이델 방법의 수렴성을 이용하여 대신 동치인 를 푸는 방법이 고려될 수 있다. 이 방법은 의 각 요소를 갱신할 때마다 잔차가 감소하지만, 조건수가 원래 행렬 의 조건수의 제곱이 되어 수렴 속도가 느려질 수 있다.
대신 를 푸는 방법은 비대칭, 비정부호 행렬을 공액 기울기법으로 풀 때도 사용된다. 그러나 공액 기울기법(CG법)에서도 조건수가 증가하여 수렴성이 나빠진다.
4. 알고리즘
가우스-자이델 방법은 반복적인 방법으로 선형 방정식의 해를 구하는 알고리즘이다. 알고리즘의 과정은 다음과 같다.
입력: A (n x n 정방 행렬), b (상수 벡터)
출력: φ (해 벡터)
1. 초기 추측값 φ를 선택한다. (보통 0으로 설정)
2. 수렴할 때까지 다음을 반복한다:
- i = 1부터 n까지 반복:
- σ = 0
- j = 1부터 n까지 반복:
- j ≠ i 이면, σ = σ + aijφj
- φi = (bi - σ) / aii
- 수렴 여부 확인 (변화량이 허용 오차보다 작으면 수렴)
이 알고리즘은 계산되는 즉시 원소를 덮어쓰므로, 저장 벡터는 하나만 필요하며 벡터 인덱싱은 생략 가능하다.
5. 예제
가우스-자이델 방법의 적용 과정을 보여주는 예제들이다.
- 행렬 버전 예제: 주어진 행렬 방정식에 대해 가우스-자이델 방법을 적용하여 해를 구하는 과정을 단계별로 보여준다. 초기 추정값에서 시작하여 반복적으로 해를 업데이트하며, 최종적으로 수렴하는 해를 제시한다.
- 방정식 버전 예제: 주어진 연립 방정식에 대해 가우스-자이델 방법을 적용하여 해를 구하는 과정을 보여준다. 각 변수에 대한 식을 유도하고, 초기값에서 시작하여 반복적으로 근사해를 계산한다. 반복 결과와 정확한 해를 표로 비교하여 보여준다.
```python
import numpy as np
ITERATION_LIMIT = 1000
# 행렬 초기화
A = np.array(
[
[10.0, -1.0, 2.0, 0.0],
[-1.0, 11.0, -1.0, 3.0],
[2.0, -1.0, 10.0, -1.0],
[0.0, 3.0, -1.0, 8.0],
]
)
# b 벡터 초기화
b = np.array([6.0, 25.0, -11.0, 15.0])
print("연립 방정식:")
for i in range(A.shape[0]):
row = [f"{A[i,j]:3g}*x{j+1}" for j in range(A.shape[1])]
print("[{0}] = [{1:3g}]".format(" + ".join(row), b[i]))
x = np.zeros_like(b, np.float_)
for it_count in range(1, ITERATION_LIMIT):
x_new = np.zeros_like(x, dtype=np.float_)
print(f"반복 {it_count}: {x}")
for i in range(A.shape[0]):
s1 = np.dot(A[i, :i], x_new[:i])
s2 = np.dot(A[i, i + 1 :], x[i + 1 :])
x_new[i] = (b[i] - s1 - s2) / A[i, i]
if np.allclose(x, x_new, rtol=1e-8):
break
x = x_new
print(f"해: {x}")
error = np.dot(A, x) - b
print(f"오차: {error}")
```
위 코드는 가우스-자이델 방법을 사용하여 선형 연립 방정식의 해를 구하는 파이썬 및 NumPy 예제이다. 초기화, 반복, 결과 출력을 단계별로 수행하며, 각 단계에 대한 설명을 포함하고 있다.
5. 1. 행렬 버전 예제
선형 시스템 가 다음과 같이 주어졌다고 하자.이때, 다음 식을 사용한다.
이는 다음과 같이 표현할 수 있다.
여기서 이고 이다.
를 하부 삼각 성분 과 엄격한 상부 삼각 성분 의 합으로 분해하면 다음과 같다.
의 역행렬은 다음과 같다.
이제 와 를 구하면 다음과 같다.
와 를 사용하여 벡터 를 반복적으로 구할 수 있다. 우선, 초기 추정값 을 선택한다. 예를 들어, 로 설정한다. 추정값이 최종 해에 가까울수록 알고리즘에 필요한 반복 횟수가 줄어든다.
그 후, 다음을 계산한다.
예상대로, 이 알고리즘은 다음 해로 수렴한다.
.
행렬 는 엄격하게 대각 지배적이지만, 양의 정부호는 아니다.[4]
5. 2. 방정식 버전 예제
주어진 선형 방정식 시스템에 대해 가우스-자이델 방법을 적용하는 구체적인 예시를 살펴보자.다음과 같은 연립 방정식이 주어졌다고 가정한다.
:
각 변수에 대해 풀면 다음과 같이 표현할 수 있다.
:
초기값 (0, 0, 0, 0)에서 시작하여 반복을 진행하면 다음과 같은 근사해를 얻을 수 있다.[5]
:
이후 반복을 계속하면 다음 표와 같은 결과를 얻는다.
0.6 | 2.32727 | -0.987273 | 0.878864 |
1.03018 | 2.03694 | -1.01446 | 0.984341 |
1.00659 | 2.00356 | -1.00253 | 0.998351 |
1.00086 | 2.0003 | -1.00031 | 0.99985 |
이 시스템의 정확한 해는 (1, 2, -1, 1)이다.
일반적으로, 개의 방정식과 시작점 이 주어졌을 때, 가우스-자이델 방법의 각 단계는 다음과 같이 진행된다.[5]
:
위 식은 반복마다 두 개의 합을 사용하며, 의 가장 최근에 계산된 반복을 사용하는 하나의 합 로 표현할 수 있다. 이 절차는 일반적으로 반복에 의해 이루어진 변화가 충분히 작은 잔차와 같은 어떤 허용 오차보다 작아질 때까지 계속된다.
3원 연립 일차 방정식의 경우,
:
번째 반복에서 얻어진 의 값을 로 쓰고, 초기값 를 적당한 값(예: 영벡터)으로 설정하면, 다음과 같은 반복을 통해 해를 구할 수 있다.
:
:
:
여기서 두 번째 식에서 이 사용되는 것에 주의해야 한다. 즉, 새로운 을 구해서 다음 식에서 사용한다. 이 때문에 가우스-자이델 방법은 병렬 계산이 불가능하며, 병렬 계산을 위해서는 야코비 방법을 사용해야 한다. 야코비 방법은 직렬 계산에서는 가우스-자이델 방법보다 느리지만, 쉽게 병렬 계산을 할 수 있다.
5. 3. 파이썬 및 NumPy 예제
pythonimport numpy as np
ITERATION_LIMIT = 1000
# 행렬 초기화
A = np.array(
[
[10.0, -1.0, 2.0, 0.0],
[-1.0, 11.0, -1.0, 3.0],
[2.0, -1.0, 10.0, -1.0],
[0.0, 3.0, -1.0, 8.0],
]
)
# b 벡터 초기화
b = np.array([6.0, 25.0, -11.0, 15.0])
print("연립 방정식:")
for i in range(A.shape[0]):
row = [f"{A[i,j]:3g}*x{j+1}" for j in range(A.shape[1])]
print("[{0}] = [{1:3g}]".format(" + ".join(row), b[i]))
x = np.zeros_like(b, np.float_)
for it_count in range(1, ITERATION_LIMIT):
x_new = np.zeros_like(x, dtype=np.float_)
print(f"반복 {it_count}: {x}")
for i in range(A.shape[0]):
s1 = np.dot(A[i, :i], x_new[:i])
s2 = np.dot(A[i, i + 1 :], x[i + 1 :])
x_new[i] = (b[i] - s1 - s2) / A[i, i]
if np.allclose(x, x_new, rtol=1e-8):
break
x = x_new
print(f"해: {x}")
error = np.dot(A, x) - b
print(f"오차: {error}")
```
위 코드는 가우스-자이델 방법을 사용하여 선형 연립 방정식의 해를 구하는 파이썬 및 NumPy 예제이다.
코드 설명:1. 초기화:
- `A`: 계수 행렬
- `b`: 상수 벡터
- `ITERATION_LIMIT`: 최대 반복 횟수
- `x`: 초기 해 벡터 (0으로 초기화)
2. 반복:
- `for` 루프를 사용하여 최대 `ITERATION_LIMIT` 횟수만큼 반복
- `x_new`: 새로운 해 벡터 (0으로 초기화)
- `for` 루프를 사용하여 각 방정식에 대해 가우스-자이델 공식 적용
- `s1`: 현재 방정식의 이전 변수들에 대한 항들의 합
- `s2`: 현재 방정식의 이후 변수들에 대한 항들의 합
- `x_new[i]`: 현재 방정식의 새로운 해 계산
- `np.allclose()`: 이전 해 `x`와 새로운 해 `x_new`를 비교하여 수렴 여부 확인 (상대 오차 `rtol=1e-8` 이내)
- 수렴하면 반복 종료
- `x = x_new`: 해 업데이트
3. 결과 출력:
- `print()`를 사용하여 연립 방정식, 각 반복 단계에서의 해, 최종 해, 오차를 출력
실행 결과:```
연립 방정식:
[ 10*x1 + -1*x2 + 2*x3 + 0*x4] = [ 6]
[ -1*x1 + 11*x2 + -1*x3 + 3*x4] = [ 25]
[ 2*x1 + -1*x2 + 10*x3 + -1*x4] = [-11]
[ 0*x1 + 3*x2 + -1*x3 + 8*x4] = [ 15]
반복 1: [ 0. 0. 0. 0.]
반복 2: [ 0.6 2.32727273 -0.98727273 0.87886364]
반복 3: [ 1.03018182 2.03693802 -1.0144562 0.98434122]
반복 4: [ 1.00658504 2.00355502 -1.00252738 0.99835095]
반복 5: [ 1.00086098 2.00029825 -1.00030728 0.99984975]
반복 6: [ 1.00009128 2.00002134 -1.00003115 0.9999881 ]
반복 7: [ 1.00000836 2.00000117 -1.00000275 0.99999922]
반복 8: [ 1.00000067 2.00000002 -1.00000021 0.99999996]
반복 9: [ 1.00000004 1.99999999 -1.00000001 1. ]
반복 10: [ 1. 2. -1. 1.]
해: [ 1. 2. -1. 1.]
오차: [ 2.06480930e-08 -1.25551054e-08 3.61417563e-11 0.00000000e+00]
6. 가속 방법 (SOR 방법)
야코비 방법과 가우스-자이델 방법은 SOR(Successive Over-Relaxation) 방법을 통해 가속할 수 있다.
7. 구체적인 예 (3원 연립 일차 방정식)
3원 연립 일차 방정식, 즉
:
를 푸는 것을 생각한다. 번째 반복에서 얻어진 의 값을 로 쓴다. 초기값 는 적당한 값, 예를 들어 영벡터라도 상관없다.
반복식은 다음과 같다.
:
:
:
위 식을 반복해 가며 해를 구한다. 여기서 두 번째 식에서 이 사용되고 있다는 것에 주의한다. 연달아 새로운 을 구해서, 다음 식에서 사용한다. 이 때문에 가우스-자이델 방법은 이대로는 병렬 계산할 수 없다.
따라서 병렬 계산을 위해서는 위의 반복식 우변의 대신에 를 사용하는 야코비 방법을 사용한다. 즉, 새로운 를 다른 장소에 기억해 두고, 일제히 를 갱신한다.
야코비 방법은 직렬 계산에서는 가우스-자이델 방법보다 느리지만, 쉽게 병렬 계산할 수 있다.
참조
[1]
서적
Numerical Analysis
Pearson Education, Inc.
[2]
기타
http://gdz.sub.uni-g[...]
[3]
논문
Über ein Verfahren, die Gleichungen, auf welche die Methode der kleinsten Quadrate führt, sowie lineäre Gleichungen überhaupt, durch successive Annäherung aufzulösen
https://www.biodiver[...]
1874
[4]
기타
[5]
기타
[6]
기타
[7]
논문
A Unified Proof for the Convergence of Jacobi and Gauss-Seidel Methods
1995-03
[8]
기타
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com