ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΕΦΑΡΜΟΣΜΕΝΩΝ ΜΑΘΗΜΑΤΙΚΩΝ ΚΑΙ ΦΥΣΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΜΑΘΗΜΑ: ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ ΚΑΙ ΕΡΓΑΣΤΗΡΙΟ Ι Ιστοσελίδα : http://www.math.ntua.gr/~fargyriou Εργαστήριο 2 - Απαντήσεις Επίλυση Γραμμικών Συστημάτων ΟΝΟΜΑ gauss.m declu.m solvelu.m invlu.m jacobi.m gseidel.m ovrel.m ΠΕΡΙΓΡΑΦΗ Επίλυση συστήματος με άμεση μέθοδος απαλοιφής Gauss Παραγοντοποίηση πίνακα LU Επίλυση συστήματος με παραγοντοποίηση LU Αντιστροφή πίνακα με LU Επίλυση συστήματος με επαναληπτική μέθοδο Jacobi Επίλυση συστήματος με επαναληπτική μέθοδο Gauss-Seidel Επίλυση συστήματος με επαναληπτική μέθοδο SOR Στο εργαστήριο αυτό θα χρησιμοποιήσουμε τα παραπάνω αρχεία για να εφαρμόσουμε τις διαδικασίες που ακολουθούν. Για κάθε μέθοδο θα φτιάξετε ένα πρόγραμμα εντολών (script) που θα την υλοποιεί και θα κρατήσετε σημειώσεις και παρατηρήσεις για τα αποτελέσματά τους. 1. Δημιουργήστε ένα φάκελο εργασίας με το όνομα lab3 και αποθηκεύστε τον στην Επιφάνεια Εργασίας. 2. Κάντε ενεργό το φάκελο στο MATLAB. 3. Χρησιμοποιείστε τη μέθοδο Gauss για να επιλύσετε το σύστημα: 1 1 2 1 x 8 2 2 3 3 y 20 = 1 1 1 0 z 2 1 1 4 3 w 4 1
q3.m A=[1,-1,2,-1;2,-2,3,-3;1,1,1,0;1,-1,4,3] b=[-8;-20;-2;4] x=gauss(a,b) error_system=max(abs(a*x-b)) 4. Χρησιμοποιείστε τη μέθοδο παραγοντοποίησης LU για να επιλύσετε το σύστημα: 3 1 2 x 12 1 2 3 y 11 = 2 2 1 z 2 5. Υπολογίστε τον αντίστροφο για τον πίνακα του συστήματος του Ερωτήματος 2. q4_5.m A=[3,-1,2;1,2,3;2,-2,-1] b=[12;11;2] x=solvelu(a,b) error_system=max(abs(a*x.'-b)) inv_a=invlu(a) error_inv=max(max(abs(a*inv_a-eye(3)))) 6. Χρησιμοποιείστε τη μέθοδο παραγοντοποίησης LU για να λύσετε το σύστημα του Ερωτήματος 1. 2
q6.m A=[1,-1,2,-1;2,-2,3,-3;1,1,1,0;1,-1,4,3] b=[-8;-20;-2;4] [l,u]=declu(a) x=solvelu(a,b) error_system=max(abs(a*x.'-b)) 7. Χρησιμοποιείστε τη μέθοδο απαλοιφή Gauss για να επιλύσετε το σύστημα: 1 1 2 1 x 8 2 2 3 3 y 20 = 1 1 1 0 z 2 2 2 4 2 w 16 q7.m A=[1,-1,2,-1;2,-2,3,-3;1,1,1,0;2,-2,4,-2] b=[-8;-20;-2;16] x=gauss(a,b) error_system=max(abs(a*x-b)) 8. Χρησιμοποιείστε την επαναληπτική μέθοδο Jacobi για να επιλύσετε το ακόλουθο σύστημα, για δύο τιμές της παραμέτρου ανοχής TOL 1e 6και 1e 8, και οποιοδήποτε αρχικό διάνυσμα x 0 (γιατί;): 10 1 2 0 x 6 1 11 1 3 y 25 = 2 1 10 1z 11 0 3 1 8 w 15 3
q8.m A=[10,-1,2,0;-1,11,-1,3;2,-1,10,-1;0,3,-1,8] b=[6;25;-11;15] x0=[1;0;0;1]; [x_1,k_1]=jacobi(a,b,x0,10^(-6)) error_system_1=max(abs(a*x_1-b)) [x_2,k_2]=jacobi(a,b,x0,10^(-9)) error_system_2=max(abs(a*x_2-b)) 9. Επαναλάβετε για την επαναληπτική μέθοδο Gauss-Seidel. q9.m A=[10,-1,2,0;-1,11,-1,3;2,-1,10,-1;0,3,-1,8] b=[6;25;-11;15] x0=[1;0;0;1]; [x_1,k_1]=gseidel(a,b,x0,10^(-6)) error_system_1=max(abs(a*x_1-b)) [x_2,k_2]=gseidel(a,b,x0,10^(-9)) error_system_2=max(abs(a*x_2-b)) 10. Επαναλάβετε για την επαναληπτική μέθοδο SOR για ω= 1.25και ω= 1. Τι παρατηρείτε; q10.m A=[10,-1,2,0;-1,11,-1,3;2,-1,10,-1;0,3,-1,8] b=[6;25;-11;15] x0=[1;0;0;1]; tol=10^(-6); [x_1,k_1]=ovrel(a,b,x0,tol,1.25) 4
error_system_1=max(abs(a*x_1-b)) [x_2,k_2]=ovrel(a,b,x0,tol,1) error_system_2=max(abs(a*x_2-b)) 11. Με τη χρήση επαναληπτικής διαδικασίας for, παρουσιάστε γραφικά τον αριθμό των επαναλήψεων που κάνει η SOR για να επιλύσει το σύστημα όταν το ω μεταβάλλεται από 0.1 έως 0.9, με βήμα 0.1 (TOL 1e 5). q11.m close all; A=[10,-1,2,0;-1,11,-1,3;2,-1,10,-1;0,3,-1,8] b=[6;25;-11;15] D=diag(diag(A)) L=tril(A,-1) U=triu(A,+1) x0=[1;0;0;1]; tol=10^(-5); w=0.1:0.1:1.9; for i=1:19 [x,k(i)]=ovrel(a,b,x0,tol,w(i)); error_system(i)=max(abs(a*x-b)); rho(i)=max(abs(eig((1-w(i))*eye(4)+(w(i)*inv(d-l)*u)))); end plot(w,k,'b-*') plot(w,log10(error_system),'r-') plot(w,rho,'g-o') 12. Επαναλάβετε το Ερώτημα 11 για το παρακάτω σύστημα: 5
4 1 1 1 1 1 4 1 1 1 x= 1 1 4 1 1 1 1 1 4 1 q12.m close all; A=[-4,1,1,1;1,-4,1,1;1,1,-4,1;1,1,1,-4] b=[1;1;1;1] D=diag(diag(A)) L=tril(A,-1) U=triu(A,+1) x0=[1;0;0;1]; tol=10^(-5); w=0.1:0.1:1.8; for i=1:18 [x,k(i)]=ovrel(a,b,x0,tol,w(i)); error_system(i)=max(abs(a*x-b)); rho(i)=max(abs(eig((1-w(i))*eye(4)+(w(i)*inv(d-l)*u)))); end plot(w,k,'b-*') plot(w,log10(error_system),'r-') plot(w,rho,'g-o') Δοθέντες συναρτήσεις: gauss.m function x=gauss(a,b); % solving ax=b, where a in R^nxn, x,b in R^n n=length(b); 6
for i=1:n-1, [amax,imax]=max(abs(a(i:n,i))); if amax<eps disp(' Singular Matrix'); break; end imax=imax+i-1; if imax~=i, sa=a(imax,i:n);sb=b(imax); a(imax,i:n)=a(i,i:n); b(imax)=b(i);a(i,i:n)=sa;b(i)=sb; end b(i+1:n)=b(i+1:n)-b(i)*a(i+1:n,i)/a(i,i); a(i+1:n,1:n)=a(i+1:n,1:n)-a(i+1:n,i)*a(i,1:n)/a(i,i); if abs(a(n,n))<eps, disp(' Singular Matrix');return;end % back up substitution x(n,1)=b(n)/a(n,n); for i=n-1:-1:1, x(i,1)=(b(i)-a(i,i+1:n)*x(i+1:n,1))/a(i,i); declu.m function [l,u]=declu(a); % decomplses l*u=a n=length(a(1,:)); l=zeros(n);u=zeros(n); u(1,1:n)=a(1,1:n); l(2:n,1)=a(2:n,1)/u(1,1); for i=1:n,l(i,i)=1; for i=2:n-1 u(i,i:n)=a(i,i:n)-l(i,1:i-1)*u(1:i-1,i:n); l(i+1:n,i)=(a(i+1:n,i)-l(i+1:n,1:i-1)*u(1:i-1,i))/u(i,i); u(n,n)=a(n,n)-l(n,1:n-1)*u(1:n-1,n); 7
solvelu.m function x=solvelu(a,b); % solves a system using LU n=length(a(1,:)); [l,u]=declu(a) % 1st back up substitution y(1)=b(1); for i=2:n,y(i)=b(i)-l(i,1:i-1)*y(1:i-1)'; % 2nd back up substitution x(n)=y(n)/u(n,n); for i=n-1:-1:1,x(i)=(y(i)-u(i,i+1:n)*x(i+1:n)')/u(i,i); invlu.m function x=invlu(a); % Invertion of a, using LU decomposition n=length(a(1,:)); [l,u]=declu(a); e=eye(n); for k=1:n, % 1st back up substitution y(1)=e(k,1); for i=2:n,y(i)=e(k,i)-l(i,1:i-1)*y(1:i-1)'; % 2nd back up substitution x(n,k)=y(n)/u(n,n); for i=n-1:-1:1,x(i,k)=(y(i)-u(i,i+1:n)*x(i+1:n,k))/u(i,i); jacobi.m function [x,k]=jacobi(a,b,x0,tol); % method of Jacobi, for solution of sparse linear system a*x=b n=length(b); l=-tril(a);for i=1:n,l(i,i)=0; u=-triu(a);for i=1:n,u(i,i)=0; 8
d=a+u+l; for i=1:n;d(i,i)=1/d(i,i); g=d*(l+u); gg=d*b; x=rand(n,1);xnew=x0;k=0; if nargin==2,tol=1.0e-6;xnew=rand(n,1); % maximum number of iterations 2000 while max(abs(xnew-x))>tol & k <2000, x=xnew;k=k+1; xnew=g*x+gg; x=xnew; gseidel.m function [x,k]=gseidel(a,b,x0,tol); % method of SOR, for solution of sparce linear system a*x=b n=length(b); l=-tril(a);for i=1:n,l(i,i)=0; u=-triu(a);for i=1:n,u(i,i)=0; d=a+u+l; g=inv(d-l); gg=g*b;g=g*u; x=rand(n,1);xnew=x0;k=0; if nargin==2,tol=1.0e-6;xnew=rand(n,1); % maximum number of iterations 2000 while max(abs(xnew-x))>tol & k <2000, x=xnew;k=k+1; xnew=g*x+gg; x=xnew; ovrel.m function [x,k]=ovrel(a,b,x0,tol,w); % method of SOR, for solution of sparce linear system a*x=b if nargin==2,tol=1.0e-6;w=1; if nargin==3,w=1; 9
n=length(b); l=-tril(a);for i=1:n,l(i,i)=0; u=-triu(a);for i=1:n,u(i,i)=0; d=a+u+l; g=inv(d-l); gg=w*g*b;g=(1-w)*eye(n)+w*g*u; x=rand(n,1);xnew=x0;k=0; % maximum number of iterations 2000 while max(abs(xnew-x))>tol & k <2000, x=xnew;k=k+1; xnew=g*x+gg; x=xnew; 10