شما در حال مطالعه نسخه آفلاین یکی از مطالب «مجله فرادرس» هستید. لطفاً توجه داشته باشید، ممکن است برخی از قابلیتهای تعاملی مطالب، مانند امکان پاسخ به پرسشهای چهار گزینهای و مشاهده جواب صحیح آنها، نمایش نتیجه آزمونها، پاسخ تشریحی سوالات، پخش فایلهای صوتی و تصویری و غیره، در این نسخه در دسترس نباشند. برای دسترسی به نسخه آنلاین مطلب، استفاده از کلیه امکانات آن و داشتن تجربه کاربری بهتر اینجا کلیک کنید.
در آموزشهای قبلی مجله فرادرس، با روش ژاکوبی برای حل دستگاه معادلات خطی به فرم Ax=b (A یک ماتریس n×n است) آشنا شدیم. در این آموزش، روش دیگری را معرفی خواهیم کرد که روش گوس سایدل نام دارد و میتوان آن را نسخهای بهبود یافته از روش ژاکوبی در نظر گرفت.
اکنون تقریب نخست x(1) برای جواب دقیق x را با استفاده از روش تکرار گوس سایدل به دست میآوریم. بنابراین، x1(1) را با قرار دادن مقادیر جواب اولیه تقریب x(0) در معادله اول محاسبه میکنیم. سپس تقریب x2(1) را با کمک مقادیر اولیه و x1(1) محاسبه شده به دست میآوریم. به همین صورت، مقادیر جدید را در معادلات جایگذاری کرده و تکرار را ادامه میدهیم:
تقریب x را با این جوابها ادامه میدهیم تا جایی که جواب به یک مقدار درست همگرا شود. بنابراین، برای k≥1 و i=1,2,...,n، نتیجه تکرار kاُم روش گوس سایدل به صورت زیر خواهد بود:
که در آن، x(k) برابر با kاُمین تقریب یا تکرار x، x(k+1) تکرار بعدی یا k+1 برای x است و ماتریس A به ماتریس پایینمثلثی L∗ و ماتریس اکیداً بالامثلثی U تجزیه شده است: A=L∗+U.
برای بررسی جزئیات، A، x و b را با مؤلفههایشان نشان میدهیم:
دستگاه معادلات خطی را میتوان به صورت زیر بازنویسی کرد:
L∗x=b−Ux
در اینجا، با استفاده از روش گوس سایدل، x سمت چپ تساوی بالا را با استفاده از مقدار قبلی x سمت راست، حل میکنیم. این گفته به صورت تحلیلی زیر نوشته میشود:
x(k+1)=L∗−1(b−Ux(k)).
اما با بهرهگیری از فرم مثلثی L∗، میتوان x(k+1) را با استفاده از جانشانی پیشرو (Forward Substitution) محاسبه کرد:
این روند تا جایی ادامه پیدا میکند که تغییرات حاصل از تکرار به مقداری کمتر از یک مقدار مشخص برسد. میبینیم که فرمول روش گوس سایدل بسیار شبیه به روش ژاکوبی است.
در محاسبه x(k+1) از عناصری از x(k+1) که قبلاً محاسبه شدهاند و عناصر x(k) استفاده میشود که در تکرار k+1 هنوز محاسبه نشدهاند. این بدین معنی است که برخلاف روش ژاکوبی، تنها یک بردار ذخیرهسازی لازم است، زیرا وقتی عناصر محاسبه شدند، میتوان آنها را جایگزین کرد. این موضوع، یکی از مزایای مهم روش گوس سایدل برای مسائلی با ابعاد بزرگ است.
البته، برخلاف روش ژاکوبی، محاسبات مربوط به هر مؤلفه را نمیتوان به صورت موازی انجام داد. علاوه بر این، مقادیر هر تکرار به مرتبه معادلات اصلی بستگی دارند.
همگرایی روش گوس سایدل
ویژگیهای همگرایی روش گوس سایدل به ماتریس A وابستهاند. به عبارت دیگر، روش گوس سایدل همگرا است، اگر:
اکنون T و C را داریم و میتوانیم از آنها برای به دست آوردن بردارهای تکرار x استفاده کنیم. ابتدا، x(0) را انتخاب میکنیم. هرچه این حدس اولیه بهتر باشد، الگوریتم سریعتر همگرا خواهد شد.
بنابراین، حدس اولیه را به صورت زیر انتخاب میکنیم:
اکنون T و C را داریم و میتوانیم از آنها برای به دست آوردن بردارهای تکرار x استفاده کنیم. ابتدا، x(0) را انتخاب میکنیم. هرچه این حدس اولیه بهتر باشد، الگوریتم سریعتر همگرا خواهد شد.
بنابراین، حدس اولیه را به صورت زیر انتخاب میکنیم:
اگر همگرایی را آزمایش کنیم، خواهیم دید که الگوریتم واگرا میشود. در واقع، ماتریس A نه قطری غالب است و نه مثبت معین. در نتیجه، همگرایی به جواب دقیق زیر تضمین نشده است و در این حالت رخ نمیدهد:
x=A−1b=[−3829]
مثال ۳
فرض کنید k معادله داریم که xn بردارهایی از این معادلات هستند و x0 نقطه شروع است. از معادله اول x1 را برحسب cn+1، cn+2، ... و xn حل میکنیم. برای معادلات بعدی مقادیر قبلی x را جایگذاری میکنیم.
با استفاده از تقریبهای به دست آمده، روند تکراری تا زمانی ادامه پیدا میکند که دقت مطلوب حاصل شود. جوابهای تقریبی زیر بعد از چهار تکرار به دست آمدهاند.
از آنجایی که عناصری را که قبلاً محاسبه شدهاند میتوان بازنویسی و جایگزین کرد، فقط به یک بردار ذخیرهسازی نیاز است و نمایهسازی بردار حذف میشود. الگوریتم روش گوس سایدل به شرح زیر است:
پیادهسازی روش گوس سایدل در پایتون
برنامه زیر، کد پایتون روش گوس سایدل را نشان میدهد.
برنامه مربوط به فرمول بالا در متلب، به سادگی به صورت زیر نوشته میشود:
1function x =gauss_seidel(A, b, x, iters)2fori=1:iters
3forj=1:size(A,1)4x(j)=(1/A(j,j))*(b(j)-A(j,:)*x +A(j,j)*x(j));5end6end7end
برنامه متلب زیر نیز یک نسخه دیگر از روش گوس سایدل است که در آن، از فرم ماتریسی استفاده شده است:
1% Gauss-Seidel Method in MATLAB2function x =gauss_siedel( A ,B )3disp('Enter the system of linear equations in the form of AX=B')45%Inputting matrix A6A =input('Enter matrix A : \n')7% check if the entered matrix is a square matrix8[na , ma ]=size(A);9if na ~= ma
10disp('ERROR: Matrix A must be a square matrix')11return12end1314% Inputting matrix B15B =input('Enter matrix B : ')16% check if B is a column matrix17[nb , mb ]=size(B);18if nb ~= na || mb~=119disp('ERROR: Matrix B must be a column matrix')20return21end2223% Separation of matrix A into lower triangular and upper triangular matrices24% A = D + L + U25D =diag(diag(A));26L =tril(A)- D;27U =triu(A)- D
2829% check for convergence condition for Gauss-Seidel method30e=max(eig(-inv(D+L)*(U)));31ifabs(e)>=132disp('Since the modulus of the largest Eigen value of iterative matrix is not less than 1')33disp('this process is not convergent.')34return35end3637% initial guess for X..?38% default guess is [ 1 1 .... 1]39r =input('Any initial guess for X? (y/n): ','s');40switch r
41case'y'42% asking for initial guess43 X0 =input('Enter initial guess for X :\n')44% check for initial guess45[nx, mx]=size(X0);46if nx ~= na || mx ~=147disp('ERROR: Check input')48return49end50otherwise51 X0 =ones(na,1);52end5354% allowable error in final answer55t =input('Enter the error allowed in final answer: ');56tol = t*ones(na,1);57k=1;5859X(:,1)= X0;60err=1000000000*rand(na,1);% initial error assumption for looping61whilesum(abs(err)>= tol)~=zeros(na,1)62X(:,k+1)=-inv(D+L)*(U)*X(:,k)+inv(D+L)*B;% Gauss-Seidel formula63 err =X(:,k+1)-X(:, k);% finding error64 k = k +1;6566end6768fprintf('The final answer obtained after %g iterations is \n', k)69X(:,k)
1#include<stdio.h>2#include<math.h>3#defineX24main()5{6float x[X][X+1],a[X], ae, max,t,s,e;7int i,j,r,mxit;8for(i=0;i<X;i++) a[i]=0;9puts(" Eneter the elemrnts of augmented matrix rowwise\n");10for(i=0;i<X;i++)11{12for(j=0;j<X+1;j++)13{14scanf("%f",&x[i][j]);15}16}17printf(" Eneter the allowed error and maximum number of iteration: ");18scanf("%f%d",&ae,&mxit);19printf("Iteration\tx[1]\tx[2]\n");20for(r=1;r<=mxit;r++)21{22 max=0;23for(i=0;i<X;i++)24{25 s=0;26for(j=0;j<X;j++)27if(j!=i) s+=x[i][j]*a[j];28 t=(x[i][X]-s)/x[i][i];29 e=fabs(a[i]-t);30 a[i]=t;31}32printf(" %5d\t",r);33for(i=0;i<X;i++)34printf(" %9.4f\t",a[i]);35printf("\n");36if(max<ae)37{38printf(" Converses in %3d iteration\n", r);39for(i=0;i<X;i++)40printf("a[%3d]=%7.4f\n", i+1,a[i]);41return0;42}4344}45}
خروجی حاصل از اجرای این برنامه به صورت زیر خواهد بود:
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
سید سراج حمیدی دانشآموخته مهندسی برق است و به ریاضیات و زبان و ادبیات فارسی علاقه دارد. او آموزشهای مهندسی برق، ریاضیات و ادبیات مجله فرادرس را مینویسد.
سلام آقای حمیدی وقتتون بخیر امیدوارم حالتون خوب باشه و خدا قوت برای تلاشتون
یک سوال این وسط پیش میاد اگر ما یک ماتریس n×n قطری غالب و مثبت معین داشته باشیم برای n بالای 2000 برای همگرا شدن به جواب ممکنه چند تکرار صورت بگیره
میدونم بستگی به ارور مشخص شده داره ولی ممکنه این تو متلب چقدر طول بکشه ؟
بازم ممنون
زینب حسن پور
به اون آقایی که واسه ژاکوبی تو متلب با مثال روفیلم توضیح میداد بگین واسه گوس سایدل تو متلب هم همینطوری توضیح بدن ممنون☹️?
شما در حال مطالعه نسخه آفلاین یکی از مطالب «مجله فرادرس» هستید. لطفاً توجه داشته باشید، ممکن است برخی از قابلیتهای تعاملی مطالب، مانند امکان پاسخ به پرسشهای چهار گزینهای و مشاهده جواب صحیح آنها، نمایش نتیجه آزمونها، پاسخ تشریحی سوالات، پخش فایلهای صوتی و تصویری و غیره، در این نسخه در دسترس نباشند. برای دسترسی به نسخه آنلاین مطلب، استفاده از کلیه امکانات آن و داشتن تجربه کاربری بهتر اینجا کلیک کنید.
سلام آقای حمیدی وقتتون بخیر امیدوارم حالتون خوب باشه و خدا قوت برای تلاشتون
یک سوال این وسط پیش میاد اگر ما یک ماتریس n×n قطری غالب و مثبت معین داشته باشیم برای n بالای 2000 برای همگرا شدن به جواب ممکنه چند تکرار صورت بگیره
میدونم بستگی به ارور مشخص شده داره ولی ممکنه این تو متلب چقدر طول بکشه ؟
بازم ممنون
به اون آقایی که واسه ژاکوبی تو متلب با مثال روفیلم توضیح میداد بگین واسه گوس سایدل تو متلب هم همینطوری توضیح بدن ممنون☹️?
خیلی عالی و مفید. خسته نباشید.