SOR'un Gauss-Seidel'den daha hızlı olduğu bir çeşit problem?


9

Gauss-Seidel yerine SOR yapmaya değip değmeyeceğini söylemek için basit bir kural var mı ? (ve rexation parametresini tahmin etmenin olası yoluω)

Demek istediğim, sadece matrise veya matrisin temsil ettiği belirli bir problem bilgisine bakarak ?

Bu soruların cevabını okuyordum: Ardışık aşırı gevşeme (SOR) yöntemini optimize etmek için herhangi bir buluşsal yöntem var mı? ama biraz fazla karmaşık. Ben sadece matris (ya da temsil ettiği sorun) bakarak spektral yarıçapı tahmin etmek için basit sezgisel tarama görmüyorum.

Çok daha basit bir şey istiyorum - SOR'un daha hızlı birleştiği matrislerin (problemlerin) sadece birkaç örneği .


Bu kralın matrisi için SOR ile deney yapıyordum: A=I+C+R nerede I kimlik matrisi, Cij=c i,j ve Rijs unifrom dağılımından rastgele sayılardır, öyle ki |Rij|<r. İdeal olanın bazı bağımlılıkları olacağını düşünüyordumω parametrelerde c,r.

EDIT: Çok küçük kullandım c,r emin olmak için Açaprazlama kuvvetle baskındır. (|c|<0.1, r<2|c|boyut 5-10 matrisi için). Ayrıca şunu söylemeliyim ki bunlarA gerçek ve simetrikti.

Ancak, Gauss-Seidel (ω=1) neredeyse her zaman en iyisidir (?) . Bu, daha fazla korelasyon olması gerektiği anlamına mı geliyor?AijSOR yararlanmak için? Yoksa yanlış bir şey mi yaptım?


Biliyorum ki, SOR en etkili çözücü değildir (CG, GMRES'e kıyasla ...), ancak belirli bir problem için uygulanması ve paralize edilmesi ve değiştirilmesi basittir. Prototipleme için iyi.

Yanıtlar:


5

Klasik yinelemeli çözücülerin doğrusal sistemler için yakınsaklığı, yineleme matrisinin spektral yarıçapı ile belirlenir, ρ(G). Genel bir lineer sistem için, yineleme matrisinin spektral yarıçapını belirlemedeki zorluk nedeniyle optimal (hatta iyi) bir SOR parametresi belirlemek zordur. Aşağıda, optimal SOR ağırlığının bilindiği gerçek bir sorun örneği de dahil olmak üzere birçok ek ayrıntı ekledim.

Spektral yarıçap ve yakınsaklık

Spektral yarıçap, en büyük büyüklük özdeğerinin mutlak değeri olarak tanımlanır. Bir yöntem,ρ<1ve daha küçük bir spektral yarıçap daha hızlı yakınsama anlamına gelir. SOR, bir ağırlıklandırma parametresi seçimine dayanarak yineleme matrisini türetmek için kullanılan matris bölünmesini değiştirerek çalışırωumarım elde edilen iterasyon matrisinin spektral yarıçapını azaltır.

Matris bölme

Aşağıdaki tartışma için, çözülecek sistemin

Ax=b,

formun tekrarı ile

x(k+1)=v+Gx(k),

nerede v bir vektör ve yineleme sayısıdır k belirtildi x(k).

SOR, eski yinelemenin ve Gauss-Seidel yinelemesinin ağırlıklı bir ortalamasını alır. Gauss-Seidel yöntemi, formun bir matris bölünmesine dayanır

A=D+L+U

nerede D köşegenidir A, L 'nin tüm elemanlarını içeren alt üçgen bir matristir A kesinlikle diyagonalin altında ve R 'nin tüm elemanlarını içeren bir üst üçgen matristir Akesinlikle diyagonalin üzerinde. Sonra Gauss-Seidel yinelemesi

x(k+1)=(D+L)1b+GGSx(k)

ve yineleme matrisi

GGS=(D+L)1U.

SOR daha sonra şu şekilde yazılabilir:

x(k+1)=ω(D+ωL)1b+GSORx(k)

nerede

GSOR=(D+ωL)1((1ω)DωU).

Yinelemeli şemanın yakınsama hızının belirlenmesi gerçekten bu yineleme matrislerinin spektral yarıçapının belirlenmesine bağlıdır. Genel olarak, matrisin yapısı hakkında spesifik bir şey bilmediğiniz sürece bu zor bir sorundur. Optimal ağırlık katsayısının nerede hesaplanabileceğinin farkında olduğum çok az örnek var. Uygulamada,ωçalışan algoritmanın gözlemlenen (varsayılan) yakınsamasına göre anında belirlenmelidir. Bu bazı durumlarda işe yarar, ancak diğerlerinde başarısız olur.

Optimal SOR

Optimal ağırlık katsayısının bilindiği gerçekçi bir örnek, bir Poisson denkleminin çözülmesi bağlamında ortaya çıkar:

2u=f in Ωu=g on Ω

Düzgün ızgara aralığı ile ikinci dereceden sonlu farklar kullanılarak bu sistemin 2D'deki kare bir alan üzerinde ayrıklaştırılması, diyagonalde 4, diyagonalin hemen üstünde ve altında -1 ve -1'den iki bant daha uzakta olan simetrik bantlı bir matris ile sonuçlanır. diyagonal. Sınır koşulları nedeniyle bazı farklılıklar vardır, ancak temel yapı budur. Bu matris göz önüne alındığında, SOR katsayısı için en uygun seçenek şu şekilde verilir:

ω=21+sin(πΔx/L)

nerede Δx ızgara aralığı ve Letki alanı boyutudur. Bilinen bir çözümle basit bir durum için bunu yapmak, bu iki yöntem için yineleme sayısına karşı aşağıdaki hatayı verir:

Gauss-Seidel ve SOR hatası

Gördüğünüz gibi, SOR yaklaşık 100 yinelemede makine hassasiyetine ulaşır, bu noktada Gauss-Seidel yaklaşık 25 derece daha büyüktür. Bu örnekle oynamak istiyorsanız, aşağıda kullandığım MATLAB kodunu ekledim.

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 parametresini anında hesaplamak için kullanılan iyi / iyi bilinen teknikler biliyor musunuz? Bu tekniklerin spektral yarıçap tahminlerini kullandığını daha önce duymuştum - spektral yarıçapı nasıl kullandıklarını açıklayabilir veya iyi bir referans sağlayabilir misiniz?
nukeguy

Oh, bunun bağlantılı soru scicomp.stackexchange.com/questions/851/… adresinde ele alındığını görüyorum . Sorularıma aldırma, ancak eklemek için daha fazlasına sahipseniz, lütfen çekinmeyin.
nukeguy

@ Doug Lipinski f'nin dx * dy ile çarpılması gerektiğini düşündüm. Bu faktör ayrık ikinci türevden gelir ( örneğin buraya bakınız ). BTW, bunu yaptığımda algoritma düzgün çalışmıyor. Neden biliyor musun?
shamalaia

0

İşlerin bu tarafı benim uzmanlık alanım değil, ama bunun birçok gerçekçi uygulama için süper adil bir test olduğunu düşünmüyorum.

C ve r için hangi değerleri kullandığınızdan emin değilim , ama son derece kötü koşullu matrislerle çalıştığınızdan şüpheleniyorum. (Aşağıda, bunların en ters çevrilebilir matrisler olmadığını gösteren bazı Python kodları bulunmaktadır.)

>>> 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

Bu kötü koşullu matrisleri tersine çevirmeniz gerekiyorsa, a) özel bir yöntem kullanırsınız ve b) muhtemelen yeni bir alan bulmaya çalışmalısınız 😉

Her boyuttaki iyi koşullandırılmış matrisler için SOR'un daha hızlı olması muhtemeldir. Hızın önemli olduğu gerçek problemler için, SOR kullanmak nadirdir - sofistike tarafta, bu günlerde çok daha iyi var; yavaş ama güvenilir tarafta, SOR yapabileceğiniz en iyi şey değildir.


merhaba, "testimin" adil olduğunu söylemiyorum. Bunun bir test olduğunu bile söyleyemem, sadece benim naieve girişimim, SOR ve Gauss-Seidel'in deneysel olarak nasıl davrandığını anlamaya çalışmak. Bu alanda tam bir çaylak olduğumu varsayın. Parametrelerim aralıktaydı0.01<|c|<0.1 ve r<2|c|. Matrisin çapraz olarak domiannt olduğundan emin olmak için (~ 10 boyutlu daha küçük matrisler kullandım)
Prokop Hapala

Çapraz olarak baskın diyecektim.
meawoppl

0

Tamam, bu kralın simetrik matrisleri için:

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'den daha hızlı birleşiyorsa tHer satırdaki s küçüktür (A boyutundan çok daha küçüktür) ts benzerdir. KullanıyordumtBu şekilde üretilir:

ti=c+random(r,r)

Eğer ts çok değişiklik gösterir ve 0 ( c=0,r=0.1) Gauss-Seidel'den daha hızlıdır. Gauss-Seidel, her bir satırın yarısından fazlası tarafından doldurulursa daha hızlıdırts. Bu aynı zamanda SOR'un çok büyük ve çok seyrek matrisler için daha iyi olduğu anlamına gelir.

(Bu sadece duygusal gözlem, titiz bir şey değil)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.