선형 시스템에 대한 고전적인 반복 솔버의 수렴은 반복 행렬의 스펙트럼 반경에 의해 결정됩니다. ρ(G). 일반적인 선형 시스템의 경우, 반복 매트릭스의 스펙트럼 반경을 결정하는 데 어려움이 있기 때문에 최적의 (또는 양호한) SOR 파라미터를 결정하는 것이 어렵다. 아래에는 최적의 SOR 가중치가 알려진 실제 문제의 예를 포함하여 많은 추가 세부 정보가 포함되어 있습니다.
스펙트럼 반경 및 수렴
스펙트럼 반경은 최대 크기 고유 값의 절대 값으로 정의됩니다. 방법은ρ<1더 작은 스펙트럼 반경은 더 빠른 수렴을 의미합니다. SOR은 가중치 매개 변수의 선택에 따라 반복 행렬을 도출하는 데 사용되는 행렬 분할을 변경하여 작동합니다.ω결과 반복 행렬의 스펙트럼 반경을 줄이십시오.
매트릭스 분할
아래 논의를 위해, 해결 될 시스템은 다음과 같이 가정합니다.
Ax=b,
형태의 반복
x(k+1)=v+Gx(k),
어디 v 벡터이며 반복 횟수 k 표시되어있다 x(k).
SOR은 이전 반복과 가우스-시델 반복의 가중 평균을 취합니다. Gauss-Seidel 방법은 형태의 행렬 분할에 의존합니다
A=D+L+U
어디 D 대각선이다 A, L 의 모든 요소를 포함하는 하위 삼각 행렬입니다. A 대각선 아래와 R 의 모든 요소를 포함하는 상위 삼각 행렬입니다. A대각선 위에 엄격하게 가우스-시델 반복은 다음과 같이 주어진다.
x(k+1)=(D+L)−1b+GG−Sx(k)
반복 행렬은
GG−S=−(D+L)−1U.
SOR은 다음과 같이 쓸 수 있습니다
x(k+1)=ω(D+ωL)−1b+GSORx(k)
어디
GSOR=(D+ωL)−1((1−ω)D−ωU).
반복 체계의 수렴 속도를 결정하는 것은 실제로 이러한 반복 행렬의 스펙트럼 반경을 결정하는 것으로 요약됩니다. 일반적으로 행렬의 구조에 대해 특정한 것을 알지 않는 한 이것은 어려운 문제입니다. 최적의 가중 계수가 계산 가능한 곳을 알고있는 예는 거의 없습니다. 실제로,ω실행 알고리즘의 관찰 된 (추정 된) 수렴에 따라 즉석에서 결정되어야합니다. 일부 경우에는 작동하지만 다른 경우에는 작동하지 않습니다.
최적의 SOR
최적의 가중 계수가 알려진 현실적인 예는 푸 아송 방정식을 푸는 것과 관련하여 발생합니다.
∇2u=f in Ωu=g on ∂Ω
균일 한 그리드 간격으로 2 차 유한 차분을 사용하여 2D의 정사각형 도메인에서이 시스템을 분리하면 대각선에 4, 대각선 바로 위와 아래에 -1, -1의 거리에서 -1의 두 개의 추가 대역이있는 대칭 띠 행렬이 생성됩니다. 대각선. 경계 조건으로 인해 약간의 차이가 있지만 기본 구조입니다. 이 행렬이 주어지면 SOR 계수에 대한 최적의 선택은 다음과 같습니다.
ω=21+sin(πΔx/L)
어디 Δx 그리드 간격이며 L도메인 크기입니다. 알려진 솔루션이있는 간단한 경우에는이 두 가지 방법에 대해 다음과 같은 오류와 반복 횟수가 나타납니다.
보시다시피, SOR은 약 100 회 반복으로 기계 정밀도에 도달합니다.이 시점에서 Gauss-Seidel은 약 25 배 더 나쁩니다. 이 예제를 사용하려면 아래에서 사용한 MATLAB 코드를 포함 시켰습니다.
clear all
close all
%number of iterations:
niter = 150;
%number of grid points in each direction
N = 16;
% [x y] = ndgrid(linspace(0,1,N),linspace(0,1,N));
[x y] = ndgrid(linspace(-pi,pi,N),linspace(-pi,pi,N));
dx = x(2,1)-x(1,1);
L = x(N,1)-x(1,1);
%desired solution:
U = sin(x/2).*cos(y);
% Right hand side for the Poisson equation (computed from U to produce the
% desired known solution)
Ix = 2:N-1;
Iy = 2:N-1;
f = zeros(size(U));
f(Ix,Iy) = (-4*U(Ix,Iy)+U(Ix-1,Iy)+U(Ix+1,Iy)+U(Ix,Iy-1)+U(Ix,Iy+1));
figure(1)
clf
contourf(x,y,U,50,'linestyle','none')
title('True solution')
%initial guess (must match boundary conditions)
U0 = U;
U0(Ix,Iy) = rand(N-2);
%Gauss-Seidel iteration:
UGS = U0; EGS = zeros(1,niter);
for iter=1:niter
for iy=2:N-1
for ix=2:N-1
UGS(ix,iy) = -1/4*(f(ix,iy)-UGS(ix-1,iy)-UGS(ix+1,iy)-UGS(ix,iy-1)-UGS(ix,iy+1));
end
end
%error:
EGS(iter) = sum(sum((U-UGS).^2))/sum(sum(U.^2));
end
figure(2)
clf
contourf(x,y,UGS,50,'linestyle','none')
title(sprintf('Gauss-Seidel approximate solution, iteration %d', iter))
drawnow
%SOR iteration:
USOR = U0; ESOR = zeros(1,niter);
w = 2/(1+sin(pi*dx/L));
for iter=1:niter
for iy=2:N-1
for ix=2:N-1
USOR(ix,iy) = (1-w)*USOR(ix,iy)-w/4*(f(ix,iy)-USOR(ix-1,iy)-USOR(ix+1,iy)-USOR(ix,iy-1)-USOR(ix,iy+1));
end
end
%error:
ESOR(iter) = sum(sum((U-USOR).^2))/sum(sum(U.^2));
end
figure(4)
clf
contourf(x,y,USOR,50,'linestyle','none')
title(sprintf('Gauss-Seidel approximate solution, iteration %d', iter))
drawnow
figure(5)
clf
semilogy(EGS,'b')
hold on
semilogy(ESOR,'r')
title('L2 relative error')
xlabel('Iteration number')
legend('Gauss-Seidel','SOR','location','southwest')