SOR이 Gauss-Seidel보다 빠른 문제는?


9

Gauss-Seidel 대신 SOR을 수행 할 가치 가 있는지에 대한 간단한 경험 법칙이 있습니까? (및 Realxation 매개 변수를 추정하는 가능한 방법ω)

나는 매트릭스 를 보거나 매트릭스가 나타내는 특정 문제에 대한 지식 만으로 의미 합니까?

나는이 질문들에 대한 답을 읽고 있었다 : 연속적인 이완법 (SOR) 방법을 최적화하기위한 휴리스틱이 있습니까? 하지만 너무 정교합니다. 매트릭스를 보는 것만으로 스펙트럼 반경을 추정하는 방법 (또는 그것이 나타내는 문제)에 대한 간단한 휴리스틱을 볼 수 없습니다.

SOR이 더 빨리 수렴하는 행렬 (문제)의 몇 가지 예만 훨씬 더 간단 합니다.


나는이 왕의 행렬에 대해 SOR을 실험하고있었습니다. A=I+C+R 어디 I 항등 행렬입니다. Cij=c i,jRijs는 unifrom 분포의 난수입니다. |Rij|<r. 나는 최적의 의존성이있을 것이라고 생각했다ω 매개 변수 c,r.

편집 : 나는 매우 작은 사용 c,r 그쪽으로 확인 A대각선으로 지배적입니다. (|c|<0.1, r<2|c|차원 5-10의 행렬을 위해). 나는 또한 이것들을 말해야한다A 실제적이고 대칭 적이었습니다.

그러나 Gauss-Seidel (ω=1)는 거의 항상 최고 (?) 입니다. 이것은 더 많은 상관 관계가 있어야 함을 의미합니까?AijSOR을 활용하기 위해? 아니면 내가 잘못 했어?


SOR은 (CG, GMRES ...와 비교하여) 가장 효율적인 솔버는 아니지만 특정 문제를 구현하고 매개 변수화하고 수정하는 것은 간단합니다. 프로토 타이핑에 좋습니다.

답변:


5

선형 시스템에 대한 고전적인 반복 솔버의 수렴은 반복 행렬의 스펙트럼 반경에 의해 결정됩니다. ρ(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+GGSx(k)

반복 행렬은

GGS=(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 오류

보시다시피, 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')

SOR 매개 변수를 즉시 계산하는 데 사용되는 잘 알려져 있거나 잘 알려진 기술에 대해 알고 있습니까? 이 기술이 스펙트럼 반경의 추정치를 사용한다고 들었습니다. 스펙트럼 반경을 어떻게 사용하는지 설명하거나 좋은 참조를 제공 할 수 있습니까?
nukeguy

아, 이것이 링크 된 질문 scicomp.stackexchange.com/questions/851/… 에서 다루는 것을 알았습니다 . 내 질문은 신경 쓰지 말고 추가해야 할 내용이 있으면 언제든지 추가하십시오.
nukeguy

@ Doug Lipinski f에 dx * dy를 곱해야한다고 생각했습니다. 이 요소는 이산 이차 미분에서 비롯됩니다 ( 예를 들어 여기 참조 ). Btw, 내가 할 때 알고리즘이 제대로 작동하지 않습니다. 왜 그런지 아십니까?
shamalaia

0

이 부분은 실제로 내 전문은 아니지만 많은 현실적인 응용 프로그램에 대한 공정한 테스트라고 생각하지 않습니다.

cr에 어떤 값을 사용했는지 잘 모르겠지만 조건이 매우 좋지 않은 행렬로 작업하고 있다고 생각합니다. (아래는 가장 비가 역적 매트릭스가 아닐 수도 있음을 보여주는 일부 파이썬 코드입니다.)

>>> import numpy
>>> for n in [100, 1000]:
...     for c in [.1, 1, 10]:
...         for r in [.1, 1, 10]:
...             print numpy.linalg.cond(
...                 numpy.eye(n) + 
...                 c * numpy.ones((n, n)) + 
...                 r * numpy.random.random((n, n))
...             )
... 
25.491634739
2034.47889101
2016.33059429
168.220149133
27340.0090644
5532.81258852
1617.33518781
42490.4410689
5326.3865534
6212.01580004
91910.8386417
50543.9269739
24737.6648458
271579.469212
208913.592289
275153.967337
17021788.5576
117365.924601

실제로이 잘못된 조건으로 행렬을 반전시켜야하는 경우 a) 특수한 방법을 사용하고 b) 아마도 새로운 필드를 찾아야합니다.

모든 크기의 조건이 좋은 행렬의 경우 SOR이 더 빠를 수 있습니다. 속도가 중요한 실제 문제의 경우 SOR을 사용하는 경우는 거의 없습니다. 복잡한 측면에서는 요즘 훨씬 더 좋습니다. 느리지 만 안정적인 측면에서 SOR은 최선의 방법이 아닙니다.


안녕하세요, 저는 "테스트"가 공정하다고 말하지 않습니다. 나는 그것이 시험이라고 말하지 않을 것입니다 .SOR과 Gauss-Seidel이 실험적으로 어떻게 행동하는지에 대한 아이디어를 얻는 것은 저의 단순한 시도입니다. 이 분야에서 완전한 멍청한 사람이라고 가정하십시오. 내 매개 변수가 범위 내에있었습니다0.01<|c|<0.1r<2|c|. 행렬이 대각선 방향으로 강인한 지 확인하기 위해 (~ 10의 작은 행렬을 사용했습니다)
Prokop Hapala

나는 대각선으로 지배적이라고 강력하게 말할 것입니다.
meawoppl

0

이 왕의 대칭 행렬의 경우 :

1 t 0 0 0 0 t t 0 0 
t 1 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 t 0 t 
0 0 0 1 0 0 0 0 0 t 
0 0 0 0 1 t 0 0 0 0 
0 0 0 0 t 1 0 t 0 0 
t 0 0 0 0 0 1 0 0 0 
t 0 t 0 0 t 0 1 0 0 
0 0 0 0 0 0 0 0 1 t 
0 0 t t 0 0 0 0 t 1 

SOR은 Gauss-Seidel보다 수렴이 빠르면 수렴합니다. t각 행의 s는 작고 (A의 차원보다 훨씬 작음) 모두 ts도 비슷합니다. 나는 사용하고 있었다t다음과 같이 생성됩니다.

ti=c+random(r,r)

만약 ts는 매우 다양하며 중앙에 위치합니다. c=0,r=0.1) 가우스-시델보다 빠릅니다. Gauss-Seidel은 각 행이 절반 이상 채워져 있으면 더 빠릅니다.t에스. 이것은 또한 SOR이 매우 크고 희소 행렬에 더 좋다는 것을 의미합니다.

(이것은 단지 제국 주의적 관찰이며 엄격한 것은 아닙니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.