रैखिक प्रणालियों के लिए शास्त्रीय पुनरावृत्त सॉल्वर के अभिसरण को पुनरावृत्ति मैट्रिक्स के वर्णक्रमीय त्रिज्या द्वारा निर्धारित किया जाता है, ρ ( जी )। सामान्य रैखिक प्रणाली के लिए, पुनरावृत्ति मैट्रिक्स के वर्णक्रमीय त्रिज्या को निर्धारित करने में कठिनाई के कारण एक इष्टतम (या यहां तक कि अच्छा) एसओआर पैरामीटर निर्धारित करना मुश्किल है। नीचे मैंने कई अतिरिक्त विवरण शामिल किए हैं, जिसमें एक वास्तविक समस्या का उदाहरण शामिल है जहां इष्टतम एसओआर वजन जाना जाता है।
स्पेक्ट्रम त्रिज्या और अभिसरण
वर्णक्रमीय त्रिज्या को सबसे बड़े परिमाण eigenvalue के निरपेक्ष मान के रूप में परिभाषित किया गया है। एक विधि अभिसरण होगी यदिρ < १और एक छोटे वर्णक्रमीय त्रिज्या का अर्थ है तेजी से अभिसरण। SOR वेटिंग पैरामीटर की पसंद के आधार पर पुनरावृत्ति मैट्रिक्स को प्राप्त करने के लिए उपयोग किए गए मैट्रिक्स विभाजन को बदलकर काम करता हैω, उम्मीद है कि परिणामी मैट्रिक्स के वर्णक्रमीय त्रिज्या को कम करना।
मैट्रिक्स विभाजन
नीचे चर्चा के लिए, मैं मानूंगा कि हल की जाने वाली प्रणाली द्वारा दी गई है
एक एक्स=बी,
फार्म की एक पुनरावृत्ति के साथ
एक्स( k + 1 )= वी + जीएक्स( के ),
कहाँ पे v एक सदिश, और पुनरावृति संख्या है क निरूपित किया जाता है एक्स( के )।
SOR पुराने पुनरावृत्ति और गॉस-सेडेल पुनरावृत्ति का भारित औसत लेता है। गॉस-सेडेल विधि फार्म के एक मैट्रिक्स विभाजन पर निर्भर करती है
ए = डी + एल + यू
कहाँ पे डी का विकर्ण है ए, एल एक कम त्रिकोणीय मैट्रिक्स है जिसमें सभी तत्व होते हैं ए विकर्ण के नीचे सख्ती से और आर एक ऊपरी त्रिकोणीय मैट्रिक्स है जिसमें सभी तत्व होते हैं एविकर्ण के ऊपर सख्ती से। गॉस-सीडल पुनरावृति तब द्वारा दी गई है
एक्स( k + 1 )= ( डी + एल)- 1बी +जीजी - एसएक्स( के )
और पुनरावृति मैट्रिक्स है
जीजी - एस= - ( डी + एल)- 1यू ।
SOR को तब लिखा जा सकता है
एक्स( k + 1 )= Ω ( डी + ω एल)- 1बी +जीएस ओ आरएक्स( के )
कहाँ पे
जीएस ओ आर= ( डी + ω एल)- 1( ( 1 - ω ) डी - ω यू ) ।
पुनरावृति योजना के अभिसरण दर का निर्धारण वास्तव में इन पुनरावृत्तियों के वर्णक्रमीय त्रिज्या का निर्धारण करने के लिए होता है। सामान्य तौर पर, यह एक कठिन समस्या है जब तक कि आप मैट्रिक्स की संरचना के बारे में कुछ विशिष्ट नहीं जानते हैं। बहुत कम उदाहरण हैं कि मुझे पता है कि इष्टतम भारांक गुणांक कहां है। प्रयोग में,ωचल एल्गोरिथ्म के प्रेक्षित (प्रकल्पित) अभिसरण के आधार पर मक्खी पर निर्धारित किया जाना चाहिए। यह कुछ मामलों में काम करता है, लेकिन दूसरों में विफल रहता है।
इष्टतम एसओआर
एक वास्तविक उदाहरण जहां इष्टतम भारांक गुणांक ज्ञात है, एक पॉइसन समीकरण को हल करने के संदर्भ में उत्पन्न होता है:
∇2उ = च मैं n Ω यू = जी ओ एन ∂ Ω
2 डी में एक वर्ग डोमेन पर इस प्रणाली को अलग करना, समान ग्रिड अंतर के साथ दूसरे क्रम परिमित अंतर का उपयोग करते हुए विकर्ण में 4 के साथ एक सममित बैंडिंग मैट्रिक्स में, -1 विकर्ण के ठीक ऊपर और नीचे, और -1 के दो और बैंड -1 से कुछ दूरी पर विकर्ण। सीमा की स्थितियों के कारण कुछ अंतर हैं, लेकिन यह मूल संरचना है। इस मैट्रिक्स को देखते हुए, SOR गुणांक के लिए सबसे उपयुक्त विकल्प दिया गया है
ω =21 + पाप( πΔ एक्स / एल )
कहाँ पे Δ x ग्रिड रिक्ति है और एलडोमेन का आकार है। एक ज्ञात समाधान के साथ एक साधारण मामले के लिए ऐसा करना इन दो तरीकों के लिए निम्न त्रुटि बनाम पुनरावृत्ति संख्या देता है:
जैसा कि आप देख सकते हैं, एसओआर लगभग 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')