การบรรจบกันของตัวแก้แบบวนซ้ำคลาสสิกสำหรับระบบเชิงเส้นถูกกำหนดโดยรัศมีสเปกตรัมของเมทริกซ์การวนซ้ำ ρ ( G ). สำหรับระบบเชิงเส้นทั่วไปมันเป็นเรื่องยากที่จะกำหนดพารามิเตอร์ SOR ที่ดีที่สุด (หรือดีกว่า) เนื่องจากความยากลำบากในการกำหนดรัศมีสเปกตรัมของเมทริกซ์การวนซ้ำ ด้านล่างฉันได้รวมรายละเอียดเพิ่มเติมมากมายรวมถึงตัวอย่างของปัญหาจริงที่ทราบน้ำหนัก SOR ที่เหมาะสม
รัศมีสเปกตรัมและการลู่เข้า
รัศมีสเปกตรัมถูกกำหนดให้เป็นค่าสัมบูรณ์ของค่าลักษณะเฉพาะขนาดใหญ่ที่สุด วิธีการจะบรรจบกันถ้าρ < 1และรัศมีสเปกตรัมที่เล็กลงหมายถึงการลู่เข้าที่เร็วขึ้น SOR ทำงานโดยการแก้ไขการแยกเมทริกซ์ที่ใช้ในการรับเมทริกซ์การวนซ้ำตามทางเลือกของพารามิเตอร์การถ่วงน้ำหนักωหวังว่าจะลดรัศมีสเปกตรัมของเมทริกซ์การวนซ้ำที่เกิดขึ้น
การแยกเมทริกซ์
สำหรับการอภิปรายด้านล่างฉันจะสมมติว่าระบบได้รับการแก้ไขโดย
A x=b ,
ด้วยการซ้ำของแบบฟอร์ม
x( k + 1 )= v + Gx( k ),
ที่ไหน โวลต์ เป็นเวกเตอร์และหมายเลขซ้ำ k ถูกเขียนแทน x( k ).
SOR ใช้ค่าเฉลี่ยถ่วงน้ำหนักของการทำซ้ำเก่าและการทำซ้ำ Gauss-Seidel วิธี Gauss-Seidel อาศัยการแยกเมทริกซ์ของแบบฟอร์ม
A = D + L + U
ที่ไหน D เป็นเส้นทแยงมุมของ A, L เป็นเมทริกซ์สามเหลี่ยมด้านล่างที่มีองค์ประกอบทั้งหมดของ A อย่างเคร่งครัดด้านล่างเส้นทแยงมุมและ R เป็นเมทริกซ์สามเหลี่ยมด้านบนที่มีองค์ประกอบทั้งหมดของ Aเหนือแนวทแยงอย่างเคร่งครัด Gauss-Seidel ซ้ำแล้วซ้ำอีกโดย
x( k + 1 )= ( D + L)- 1b +Gจี- เอสx( k )
และเมทริกซ์การวนซ้ำคือ
Gจี- เอส= - ( D + L)- 1อืม
SOR สามารถเขียนเป็น
x( k + 1 )= ω ( D + ω L)- 1b +GS O Rx( k )
ที่ไหน
GS O R= ( D + ω L)- 1( ( 1 - ω ) D - ω U )
การกำหนดอัตราการบรรจบกันของรูปแบบการวนซ้ำนั้นจริง ๆ แล้วลดต่ำลงเพื่อกำหนดรัศมีสเปกตรัมของเมทริกซ์การทำซ้ำเหล่านี้ โดยทั่วไปแล้วนี่เป็นปัญหาที่ยากยกเว้นว่าคุณจะรู้อะไรที่เฉพาะเจาะจงเกี่ยวกับโครงสร้างของเมทริกซ์ มีตัวอย่างน้อยมากที่ฉันรู้ว่าการคำนวณสัมประสิทธิ์การถ่วงน้ำหนักที่เหมาะสมที่สุดนั้นเป็นอย่างไร ในทางปฏิบัติωจะต้องพิจารณาจากการบินบนพื้นฐานของการลู่เข้าหา (สันนิษฐาน) ของอัลกอริทึมที่ใช้งาน วิธีนี้ใช้ได้ผลในบางกรณี แต่ล้มเหลวในบางกรณี
SOR ที่ดีที่สุด
ตัวอย่างจริงหนึ่งตัวอย่างที่ทราบว่าสัมประสิทธิ์การถ่วงน้ำหนักที่เหมาะสมเกิดขึ้นในบริบทของการแก้สมการปัวซอง:
∇2u = f ฉันn Ω u = g o n ∂ Ω
การแยกระบบนี้ในโดเมนสแควร์ใน 2D โดยใช้ความแตกต่างอัน จำกัด ลำดับที่สองกับการเว้นวรรคกริดแบบสม่ำเสมอทำให้เกิดเมทริกซ์แบนด์แบบสมมาตรที่มี 4 บนเส้นทแยงมุม, -1 เหนือและใต้เส้นทแยงมุมทันที เส้นทแยงมุม มีความแตกต่างเนื่องจากเงื่อนไขขอบเขต แต่นั่นคือโครงสร้างพื้นฐาน กำหนดให้เมทริกซ์นี้เป็นทางเลือกที่ดีที่สุดที่พิสูจน์ได้สำหรับสัมประสิทธิ์ SOR
ω =21 + บาป( πΔ 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')