Сортування проблем, де SOR швидше, ніж Гаусс-Сейдель?


9

Чи є якесь просте правило, щоб сказати, чи варто робити SOR замість Гаусса-Сейделя? (і можливий спосіб оцінити параметр реакції )ω

Я маю на увазі просто дивлячись на матрицю чи знання конкретної проблеми, яку представляє матриця?

Я читав відповідь на це питання: Чи є евристика для оптимізації послідовного методу надмірного релаксації (SOR)? але це занадто витончено. Я не бачу простої евристики, як оцінити спектральний радіус, просто дивлячись на матрицю (або проблему, яку вона представляє).

Я хотів би щось набагато простіше - лише кілька прикладів матриць (проблем), для яких SOR швидше сходиться.


Я експериментував з SOR для матриці цього короля: де - матриця ідентичності, і s - випадкові числа з розподілу unifrom, такі, що . Я думав, що буде якась залежність оптимальної від параметрів .А=Я+С+RЯСij=c i,jRij|Rij|<rωc,r

EDIT: Я використовував дуже маленький щоб переконатися, що сильно діагонально домінує. ( , для матриці розмірності 5-10). Я також повинен сказати, що ці були справжніми та симетричними.c,rА|c|<0,1r<2|c|А

Однак я виявив, що Гаусс-Сейдель ( ) майже завжди найкращий (?)ω=1 . Чи означає це, що між s має бути деяка кореляція, щоб отримати перевагу SOR? Або я щось неправильно зробив? Аij


Я знаю, що SOR не є найефективнішим вирішувачем (порівняно з CG, GMRES ...), але це просто реалізувати та параелізувати та змінити для конкретної проблеми. Звичайно добре для прототипування.

Відповіді:


5

Конвергенція класичних ітеративних розв'язків для лінійних систем визначається спектральним радіусом ітераційної матриці . Для загальної лінійної системи важко визначити оптимальний (або навіть хороший) параметр SOR через труднощі визначення спектрального радіусу ітераційної матриці. Нижче я включив багато додаткових деталей, включаючи приклад реальної проблеми, коли відома оптимальна вага SOR.ρ(Г)

Спектральний радіус і конвергенція

Спектральний радіус визначається як абсолютне значення власного значення найбільшої величини. Метод буде сходитися, якщо а менший спектральний радіус означає швидше конвергенцію. SOR працює, змінюючи розбиття матриці, що використовується для отримання ітераційної матриці на основі вибору параметра зважування , сподіваючись зменшуючи спектральний радіус отриманої ітераційної матриці.ρ<1ω

Матричне розщеплення

Для обговорення нижче, я припускаю, що система, яку потрібно вирішити, задана

Ах=б,

з ітерацією форми

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

де - вектор, позначається число ітераціїvkx(k).

SOR приймає середньозважене значення серед старої ітерації та ітерації Гаусса-Сейделя. Метод Гаусса-Сейделя спирається на матричне розщеплення форми

A=D+L+U

де D є діагоналлю A, L являє собою нижню трикутну матрицю, що містить усі елементи A строго нижче діагоналі і R являє собою верхню трикутну матрицю, що містить усі елементи Aстрого вище діагоналі. Потім ітерація Гаусса-Сейделя задана

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

і матриця ітерації є

ГГ-S=-(D+L)-1U.

Тоді SOR можна записати як

х(к+1)=ω(D+ωL)-1б+ГSОRх(к)

де

ГSОR=(D+ωL)-1((1-ω)D-ωU).

Визначення швидкості конвергенції ітераційної схеми дійсно зводиться до визначення спектрального радіуса цих ітераційних матриць. Взагалі, це складна проблема, якщо ви не знаєте чогось конкретного щодо структури матриці. Дуже мало прикладів, з яких я знаю, де обчислюється оптимальний коефіцієнт зважування. На практиці,ωповинні визначатися на ходу на основі спостережуваного (припущенного) зближення алгоритму, що працює. У деяких випадках це працює, але в інших не вдається.

Оптимальний SOR

Один реалістичний приклад, коли відомий оптимальний коефіцієнт зважування, виникає в контексті розв’язання рівняння Пуассона:

2у=f iн Ωу=г он Ω

Дискретизація даної системи на квадратній області в 2D з використанням кінцевих відмінностей другого порядку з рівномірним міжрядковим інтервалом призводить до отримання симетричної смугової матриці з 4 по діагоналі, -1 безпосередньо вище та нижче діагоналі, та ще двох смуг -1 на деякій відстані від відстані діагональна. Існують деякі відмінності через граничні умови, але це основна структура. Враховуючи цю матрицю, виправдано оптимальний вибір коефіцієнта СОР задається методом

ω=21+гріх(πΔх/L)

де Δх - інтервал між сітками та L- розмір домену. Зробити це для простого випадку з відомим рішенням, надається наступна помилка проти ітераційного числа для цих двох методів:

Помилка Гаусса-Сейделя та SOR

Як бачимо, SOR досягає машинної точності приблизно в 100 ітераціях, при цьому Гаусс-Сейдель на 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. Цей фактор, що походить від дискретної другої похідної (див. Тут, наприклад). До речі, коли я це роблю, алгоритм не працює належним чином. Ти знаєш чому?
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) скористалися спеціалізованим методом; і б), мабуть, слід просто знайти нове поле 😉

Для добре кондиціонованих матриць будь-якого розміру SOR, швидше за все, буде швидшим. Для справжніх проблем, де важлива швидкість, рідко буде використовувати SOR - на складній стороні в наші дні набагато краще; на повільній, але надійній стороні SOR - це не найкраще, що можна зробити.


привіт, я не кажу, що мій "тест" справедливий. Я б навіть не сказав, що це випробування, це просто моя наївна спроба зрозуміти, як експериментально поводиться SOR та Гаусс-Сейдель. Припустимо, що я повна нобі в цій галузі. Мої параметри були в діапазоні0,01<|c|<0,1 і r<2|c|. Щоб переконатися, що матриця є сильно діагонально домінантою (я використовував менші матриці розмірності ~ 10)
Прокоп Хапала

Я збирався сказати сильно по діагоналі домінуючим.
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 зближується швидше, ніж Гаусс-Сейдель, якщо число тs у кожному ряду невеликий (набагато менший за розмір А) і, якщо всі тs подібні. Я використовувавтs генерується так:

тi=c+rангом(-r,r)

Якщо тs сильно відрізняються і розташовуються в центрі навколо 0 ( c=0,r=0,1) чим швидше Гаусс-Сейдель. Гаусс-Сейдель також швидший, якщо кожен рядок заповнений більш ніж наполовинутс. Це також означає, що SOR краще для дуже великих і дуже рідких матриць.

(Це просто емпіричне спостереження, нічого суворого)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.