Sắp xếp các vấn đề trong đó SOR nhanh hơn Gauss-Seidel?


9

quy tắc đơn giản nào để nói nếu nó đáng để làm SOR thay vì Gauss-Seidel không? (và cách có thể để ước tính tham số realxation )ω

Ý tôi là chỉ bằng cách nhìn vào ma trận , hoặc kiến ​​thức về vấn đề cụ thể mà ma trận đại diện?

Tôi đã đọc câu trả lời cho câu hỏi này: Có phương pháp phỏng đoán nào để tối ưu hóa phương pháp thư giãn quá mức (SOR) liên tiếp không? nhưng nó hơi phức tạp một chút Tôi không thấy các phương pháp phỏng đoán đơn giản làm thế nào để ước tính bán kính quang phổ chỉ nhìn vào ma trận (hoặc vấn đề mà nó đại diện).

Tôi muốn một cái gì đó đơn giản hơn nhiều - chỉ một vài ví dụ về ma trận (các vấn đề) mà SOR hội tụ nhanh hơn.


Tôi đã thử nghiệm với SOR cho ma trận của vua này: nơi tôi là ma trận sắc, C i j = c i , jR i j s là những con số ngẫu nhiên từ phân phối unifrom như vậy | R i j | < r . Tôi đã nghĩ rằng sẽ có một số sự phụ thuộc của tối ưu ω vào các tham số c , r .A=I+C+RICij=c i,jRij|Rij|<rωc,r

EDIT: Tôi đã sử dụng rất nhỏ để đảm bảo tha A chiếm ưu thế theo đường chéo. ( | c | < 0,1 , r < 2 | c | cho ma trận có kích thước 5-10). Tôi cũng nên nói rằng những chữ A này là có thật và đối xứng.c,rA|c|<0.1r<2|c|A

Tuy nhiên, tôi thấy rằng Gauss-Seidel ( ) là hầu như luôn luôn là tốt nhất (?)ω=1 . Điều này có nghĩa là phải có thêm một số mối tương quan giữa s để có được lợi thế của SOR? Hay tôi đã làm gì sai? Aij


Tôi biết, SOR không phải là người giải quyết hiệu quả nhất (so với CG, GMRES ...) nhưng thật đơn giản để thực hiện và diễn giải, và sửa đổi cho vấn đề cụ thể. Chắc chắn tốt cho tạo mẫu.

Câu trả lời:


5

ρ(G)

Bán kính quang phổ và hội tụ

ρ<1ω

Ma trận tách

Đối với các cuộc thảo luận dưới đây, tôi sẽ giả định rằng hệ thống được giải quyết được đưa ra bởi

Ax=b,

với một lần lặp của mẫu

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

vkx(k)

SOR lấy trung bình trọng số của phép lặp cũ và phép lặp Gauss-Seidel. Phương thức Gauss-Seidel dựa trên sự phân tách ma trận của biểu mẫu

A=D+L+U

DALARA

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

và ma trận lặp là

GGS=(D+L)1U.

SOR sau đó có thể được viết là

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

Ở đâu

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

ω

SOR tối ưu

Một ví dụ thực tế trong đó hệ số trọng số tối ưu được biết đến phát sinh trong bối cảnh giải phương trình Poisson:

2u=f in Ωu=g on Ω

Phân biệt hệ thống này trên một miền vuông trong 2D bằng cách sử dụng các khác biệt hữu hạn bậc hai với khoảng cách lưới đồng nhất dẫn đến một ma trận dải đối xứng với 4 trên đường chéo, -1 ngay trên và dưới đường chéo và thêm hai dải -1 khoảng cách đường chéo. Có một số khác biệt do điều kiện biên, nhưng đó là cấu trúc cơ bản. Với ma trận này, sự lựa chọn tối ưu có thể chứng minh cho hệ số SOR được đưa ra bởi

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

ΔxL

Lỗi Gauss-Seidel và SOR

Như bạn có thể thấy, SOR đạt độ chính xác của máy trong khoảng 100 lần lặp mà tại đó Gauss-Seidel kém hơn khoảng 25 bậc. Nếu bạn muốn chơi xung quanh với ví dụ này, tôi đã bao gồm mã MATLAB tôi đã sử dụng bên dưới.

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

Bạn có biết bất kỳ kỹ thuật tốt / nổi tiếng nào được sử dụng để tính toán tham số SOR khi đang bay không? Tôi đã nghe nói rằng các kỹ thuật này sử dụng các ước tính về bán kính quang phổ - bạn có thể giải thích cách chúng sử dụng bán kính quang phổ hay cung cấp một tài liệu tham khảo tốt?
nukeguy

Ồ, tôi thấy rằng điều này được giải quyết trong câu hỏi được liên kết scicomp.stackexchange.com/questions/851/ . Đừng bận tâm đến câu hỏi của tôi, nhưng nếu bạn có thêm thông tin, xin vui lòng làm như vậy.
nukeguy

@Doug Lipinski Tôi nghĩ rằng f nên được nhân với dx * dy. Yếu tố này đến từ đạo hàm thứ hai rời rạc (xem ví dụ ở đây ). Btw, khi tôi làm điều đó thì thuật toán không hoạt động đúng. Bạn có biết tại sao?
shamalaia

0

Mặt này của mọi thứ không thực sự là chuyên môn của tôi, nhưng tôi không nghĩ rằng đây là một thử nghiệm siêu công bằng cho nhiều ứng dụng thực tế.

Tôi không chắc chắn những giá trị bạn đang sử dụng cho cr , nhưng tôi nghi ngờ bạn đang làm việc với ma trận cực kỳ tồi tệ. (Dưới đây là một số mã Python cho thấy đây có thể không phải là ma trận khả nghịch nhất.)

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

Nếu bạn thực sự cần phải đảo ngược ma trận điều hòa này, bạn sẽ a) sử dụng một phương pháp chuyên dụng và b) có lẽ chỉ nên đi tìm một lĩnh vực mới

Đối với ma trận được điều hòa tốt ở bất kỳ kích thước nào, SOR có thể sẽ nhanh hơn. Đối với các vấn đề thực sự về tốc độ, rất hiếm khi sử dụng SOR - về mặt tinh vi, ngày nay tốt hơn nhiều; về mặt chậm nhưng đáng tin cậy, SOR không phải là điều tốt nhất bạn có thể làm.


0.01<|c|<0.1r<2|c|

Tôi sẽ nói mạnh mẽ vượt trội theo đường chéo.
meawoppl

0

OK, vì vậy đối với ma trận đối xứng của vị vua này:

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 

ttt

ti=c+random(r,r)

tc=0,r=0.1t

(Đây chỉ là quan sát emperical, không có gì nghiêm ngặt)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.