เรียงลำดับของปัญหาที่ SOR เร็วกว่า Gauss-Seidel หรือไม่


9

มีกฎง่ายๆที่จะบอกว่ามันคุ้มค่าที่จะทำ SOR แทน Gauss-Seidel หรือไม่? (และวิธีที่เป็นไปได้วิธีการประเมินพารามิเตอร์ realxationω)

ฉันหมายถึงแค่มองดูเมทริกซ์หรือความรู้เกี่ยวกับปัญหาเฉพาะเมทริกซ์แทน?

ฉันกำลังอ่านคำตอบสำหรับคำถามนี้: มีฮิวริสติกใดบ้างสำหรับการปรับวิธีการผ่อนคลายแบบต่อเนื่อง (SOR) ให้เหมาะสมหรือไม่? แต่มันซับซ้อนเกินไป ฉันไม่เห็นฮิวริสติกแบบง่าย ๆ ว่าจะประมาณรัศมีสเปกตรัมแค่มองที่เมทริกซ์ (หรือปัญหาที่มันแทน)

ฉันต้องการสิ่งที่ง่ายกว่ามาก - เพียงไม่กี่ตัวอย่างของเมทริกซ์ (ปัญหา) ที่ SOR มาบรรจบกันเร็วขึ้น


ฉันกำลังทดลองกับ SOR สำหรับเมทริกซ์ของกษัตริย์องค์นี้: A=ผม++R ที่ไหน ผม เมทริกซ์เอกลักษณ์คือ ผมJ= ผม,J และ RผมJs เป็นตัวเลขสุ่มจากการแจกแจงแบบ Unifrom เช่นนั้น |RผมJ|<R. ฉันคิดว่าจะมีการพึ่งพาที่ดีที่สุดω เกี่ยวกับพารามิเตอร์ ,R.

แก้ไข: ฉันใช้น้อยมาก ,R เพื่อให้แน่ใจว่าท่า Aมีความโดดเด่นในแนวทแยงมุมอย่างยิ่ง (||<0.1, R<2||สำหรับเมทริกซ์ของมิติ 5-10) ฉันควรจะบอกว่าสิ่งเหล่านี้A เป็นจริงและสมมาตร

อย่างไรก็ตามฉันพบว่า Gauss-Seidel (ω=1) อยู่เกือบตลอดเวลาที่ดีที่สุด (?) นี่หมายความว่าจะต้องมีความสัมพันธ์ระหว่างกันมากขึ้นAผมJได้รับประโยชน์จาก SOR? หรือฉันทำอะไรผิดพลาด?


ฉันรู้ว่า SOR ไม่ใช่นักแก้ปัญหาที่มีประสิทธิภาพมากที่สุด (เทียบกับ CG, GMRES ... ) แต่มันง่ายที่จะติดตั้งและแยกส่วนและแก้ไขสำหรับปัญหาเฉพาะ ดีแน่นอนสำหรับการสร้างต้นแบบ

คำตอบ:


5

การบรรจบกันของตัวแก้แบบวนซ้ำคลาสสิกสำหรับระบบเชิงเส้นถูกกำหนดโดยรัศมีสเปกตรัมของเมทริกซ์การวนซ้ำ ρ(G). สำหรับระบบเชิงเส้นทั่วไปมันเป็นเรื่องยากที่จะกำหนดพารามิเตอร์ SOR ที่ดีที่สุด (หรือดีกว่า) เนื่องจากความยากลำบากในการกำหนดรัศมีสเปกตรัมของเมทริกซ์การวนซ้ำ ด้านล่างฉันได้รวมรายละเอียดเพิ่มเติมมากมายรวมถึงตัวอย่างของปัญหาจริงที่ทราบน้ำหนัก SOR ที่เหมาะสม

รัศมีสเปกตรัมและการลู่เข้า

รัศมีสเปกตรัมถูกกำหนดให้เป็นค่าสัมบูรณ์ของค่าลักษณะเฉพาะขนาดใหญ่ที่สุด วิธีการจะบรรจบกันถ้าρ<1และรัศมีสเปกตรัมที่เล็กลงหมายถึงการลู่เข้าที่เร็วขึ้น SOR ทำงานโดยการแก้ไขการแยกเมทริกซ์ที่ใช้ในการรับเมทริกซ์การวนซ้ำตามทางเลือกของพารามิเตอร์การถ่วงน้ำหนักωหวังว่าจะลดรัศมีสเปกตรัมของเมทริกซ์การวนซ้ำที่เกิดขึ้น

การแยกเมทริกซ์

สำหรับการอภิปรายด้านล่างฉันจะสมมติว่าระบบได้รับการแก้ไขโดย

Ax=,

ด้วยการซ้ำของแบบฟอร์ม

x(k+1)=โวลต์+Gx(k),

ที่ไหน โวลต์ เป็นเวกเตอร์และหมายเลขซ้ำ k ถูกเขียนแทน x(k).

SOR ใช้ค่าเฉลี่ยถ่วงน้ำหนักของการทำซ้ำเก่าและการทำซ้ำ Gauss-Seidel วิธี Gauss-Seidel อาศัยการแยกเมทริกซ์ของแบบฟอร์ม

A=D+L+ยู

ที่ไหน D เป็นเส้นทแยงมุมของ A, L เป็นเมทริกซ์สามเหลี่ยมด้านล่างที่มีองค์ประกอบทั้งหมดของ A อย่างเคร่งครัดด้านล่างเส้นทแยงมุมและ R เป็นเมทริกซ์สามเหลี่ยมด้านบนที่มีองค์ประกอบทั้งหมดของ Aเหนือแนวทแยงอย่างเคร่งครัด Gauss-Seidel ซ้ำแล้วซ้ำอีกโดย

x(k+1)=(D+L)-1+GG-Sx(k)

และเมทริกซ์การวนซ้ำคือ

GG-S=-(D+L)-1ยู.

SOR สามารถเขียนเป็น

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

ที่ไหน

GSOR=(D+ωL)-1((1-ω)D-ωยู).

การกำหนดอัตราการบรรจบกันของรูปแบบการวนซ้ำนั้นจริง ๆ แล้วลดต่ำลงเพื่อกำหนดรัศมีสเปกตรัมของเมทริกซ์การทำซ้ำเหล่านี้ โดยทั่วไปแล้วนี่เป็นปัญหาที่ยากยกเว้นว่าคุณจะรู้อะไรที่เฉพาะเจาะจงเกี่ยวกับโครงสร้างของเมทริกซ์ มีตัวอย่างน้อยมากที่ฉันรู้ว่าการคำนวณสัมประสิทธิ์การถ่วงน้ำหนักที่เหมาะสมที่สุดนั้นเป็นอย่างไร ในทางปฏิบัติωจะต้องพิจารณาจากการบินบนพื้นฐานของการลู่เข้าหา (สันนิษฐาน) ของอัลกอริทึมที่ใช้งาน วิธีนี้ใช้ได้ผลในบางกรณี แต่ล้มเหลวในบางกรณี

SOR ที่ดีที่สุด

ตัวอย่างจริงหนึ่งตัวอย่างที่ทราบว่าสัมประสิทธิ์การถ่วงน้ำหนักที่เหมาะสมเกิดขึ้นในบริบทของการแก้สมการปัวซอง:

2ยู= ผมn Ωยู=ก. โอn Ω

การแยกระบบนี้ในโดเมนสแควร์ใน 2D โดยใช้ความแตกต่างอัน จำกัด ลำดับที่สองกับการเว้นวรรคกริดแบบสม่ำเสมอทำให้เกิดเมทริกซ์แบนด์แบบสมมาตรที่มี 4 บนเส้นทแยงมุม, -1 เหนือและใต้เส้นทแยงมุมทันที เส้นทแยงมุม มีความแตกต่างเนื่องจากเงื่อนไขขอบเขต แต่นั่นคือโครงสร้างพื้นฐาน กำหนดให้เมทริกซ์นี้เป็นทางเลือกที่ดีที่สุดที่พิสูจน์ได้สำหรับสัมประสิทธิ์ SOR

ω=21+บาป(πΔx/L)

ที่ไหน Δx เป็นระยะห่างกริดและ Lคือขนาดโดเมน การทำเช่นนั้นสำหรับกรณีง่าย ๆ ที่มีวิธีแก้ปัญหาที่ทราบจะให้ข้อผิดพลาดต่อไปนี้กับหมายเลขการวนซ้ำสำหรับสองวิธีนี้

ข้อผิดพลาดของ Gauss-Seidel และ 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

โอ้ฉันเห็นว่านี้เป็น addressed ในคำถามที่เชื่อมโยงscicomp.stackexchange.com/questions/851/... ไม่เป็นไรคำถามของฉัน แต่ถ้าคุณมีมากกว่าที่จะเพิ่มโปรดอย่าลังเลที่จะทำ
nukeguy

@Doug Lipinski ฉันคิดว่า f ควรคูณด้วย dx * dy ปัจจัยนี้มาจากอนุพันธ์อันดับสองที่ไม่ต่อเนื่อง (ดูตัวอย่างที่นี่ ) Btw เมื่อฉันทำอัลกอริทึมทำงานไม่ถูกต้อง คุณรู้ไหมว่าทำไม?
shamalaia

0

ด้านนี้ไม่ใช่สิ่งที่พิเศษของฉัน แต่ฉันไม่คิดว่านี่เป็นการทดสอบที่ยอดเยี่ยมสำหรับการใช้งานจริง ๆ

ฉันไม่แน่ใจว่าคุณใช้ค่าอะไรสำหรับcและrแต่ฉันคิดว่าคุณกำลังทำงานกับเมทริกซ์ที่มีสภาพแย่มาก (ด้านล่างคือโค้ด Python บางอันที่แสดงว่าสิ่งเหล่านี้อาจไม่ใช่เมทริกซ์ที่กลับด้านได้)

>>> 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 มีพฤติกรรมอย่างไร สมมติว่าฉันเป็น noob ที่สมบูรณ์ในสาขานี้ พารามิเตอร์ของฉันอยู่ในช่วง0.01<||<0.1 และ R<2||. เพื่อให้แน่ใจว่าเมทริกซ์เป็นเส้นทแยงมุมอย่างยิ่ง domiannt (ฉันใช้เมทริกซ์ขนาดเล็ก ~ 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 ถ้าจำนวน เสื้อs ในแต่ละแถวมีขนาดเล็ก (เล็กกว่ามิติของ A มาก) และหากทั้งหมด เสื้อมีความคล้ายคลึงกัน ฉันกำลังใช้เสื้อสร้างแล้วเช่นนี้:

เสื้อผม=+Randโอม.(-R,R)

ถ้า เสื้อแตกต่างกันมากและเป็นศูนย์กลาง arround 0 ( =0,R=0.1) กว่า Gauss-Seidel เร็วกว่า Gauss-Seidel ก็เร็วขึ้นเช่นกันถ้าแต่ละแถวเต็มไปกว่าครึ่งเสื้อs นี่ก็หมายความว่า SOR นั้นดีกว่าสำหรับเมทริกซ์ที่ใหญ่และเบาบางมาก

(นี่เป็นเพียงการสังเกตอารมณ์ไม่มีอะไรเข้มงวด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.