Rozwiazywanie liniowych rownan algebraicznych
Transkrypt
Rozwiazywanie liniowych rownan algebraicznych
% Przyklad 4.2 % Zle uwarunkowane uklady równan - macierz Hilberta clear all warning on % wlaczenie komunikatow ostrzegajacych N=[2 5 10 50]; % dla takich wartosci bedzie realizowana petla for for n=N A=hilb(n) % generacja macierzy Hilberta ws=cond(A); % wyznaczenie wskaznika uwarunkowania mo=norm(A*inv(A)-eye(n)); % czy macierz odwrotna jest dobra ? fprintf(['Rozmiar macierzy = %2i\n'... 'Wskaznik uwarunkowania = %10.4e\n'... '|| A*inv(A)-I || = %10.4e\n'],n,ws,mo) if n<N(length(N)) pause fprintf('kontynuacja - nacisnij klawisz\n') end end % Przyklad 4.3 % Naklad obliczeniowy (flops) zostal zastapiony pomiarem czasu obliczen clear all warning off % wylaczenie komunikatow ostrzegajacych N=(1:20); % dla takich wartosci bedzie realizowana petla for for n=N b=abs(sin(1:n))'; % konstrukcja wektora b A=vander((1:n)'); % konstrukcja macierzy A D=ones(n)+n*eye(n); % konstrukcja macierzy diagonalnie dominujacej czas=0; if n<5, powtorz=1e5; % dobranie liczby powtorzen w zaleznosci od wymiaru elseif n<10, powtorz=5e4; % dla coraz wiekszych ukladów coraz mniej powtorzen elseif n<15, powtorz=1e4; else powtorz=1e3; end tic % wlaczenie stopera (dokladnosc stopera 0.001 sek) for r=1:powtorz % powtarzenie rozwiazania aby dokladniej okreslic czas x=A\b; % rozwiazanie dla wektora b dokladnego end naklad(n)=toc/powtorz; tic; % to samo dla macierzy diagonalnie dominujacej for r=1:powtorz xd=D\b; % rozwiazanie dla wektora b dokladnego end nakladd(n)=toc/powtorz; bzab=b.*(1+(rand(n,1)-0.5)*1e-3); %zaburzenie wektora prawych stron ukladu xzab=A\bzab; % rozwiazanie dla macierzy Vandermonde'a xdzab=D\bzab; % rozwiazanie dla macierzy diagonalnie dominujacej % Wyznaczenie wspolczynnikow przenoszenia bledu T(n)=(norm(xzab-x)/norm(x))/(norm(bzab-b)/norm(b)); % dla macierzy Vandermonde TD(n)=(norm(xdzab-xd)/norm(xd))/(norm(bzab-b)/norm(b)); % dla macierzy diagonalnie end % prezentacja wynikow figure(1) hold off % nastepny wykres wyczysci okno "figure" semilogy(N,T(N),'k') % wykres w skali pollogarytmicznej hold on % nastepny wykres bedzie dorysowany semilogy(N,TD(N),':+r') title('Wspolczynnik przenoszenia bledu T') xlabel('Wymiar macierzy ukladu N') ylabel ('Wspolczynnik przenoszenia bledu T') legend('Macierz Vandermonde''a','Macierz diagonalnie dominujaca'); figure(2) hold off loglog(N,naklad(N),'k') % wykres w skali podwojnie logarytmicznej hold on loglog(N,nakladd(N),':+r') title('Czas rozwiazywania ukladu rownan') xlabel('Wymiar macierzy ukladu') ylabel ('Czas [s]') legend('Macierz Vandermonde''a','Macierz diagonalnie dominujaca'); % Przyklad 4.4 clear all format long warning off A=[ 1 1 1 1 2 3 1.5 2 4]; b=[1 1 1]; [L,U]=lu(A) z=L\b x=U\z % macierz ukladu % wektor prawej strony % rozklad lu macierzy A % rozwiazanie ukladu Lz=b wzgledem wektora z % rozwiazanie ukladu Ux=z wzgledem wektora x % zadanie 4.1 clear all % konstrukcja ukladu równan: 3 równania oczkowe i 2 pradowe % -r1*i(1)+r2*i(2) -r4*i(4) =0 % -r3*i(3)+r4*i(4)+r5*i(5)=0 % r1*i(1) +r3*i(3) =e % i(1) -i(3) -i(4) =0; % i(2) -i(4) -i(5)=0; r1=1; % deklaracja elementów ukladu r2=2; r3=3; r4=0.5; r5=6; e=1; b=[0;0;e;0;0]; % wektor prawych stron A=[-r1 r2 0 -r4 0; % macierz ukladu 0 0 -r3 r4 r5; r1 0 r3 0 0 ; 1 0 -1 -1 0; 0 1 0 -1 -1]; i=A\b % rozwiazanie na podstawie danych dokladnych pause r1=r1*1.01; % zmiana rezystora r1 o 1% A=[-r1 r2 0 -r4 0; % nowa macierz ukladu 0 0 -r3 r4 r5; r1 0 r3 0 0 ; 1 0 -1 -1 0; 0 1 0 -1 -1]; i1=A\b % rozwiazanie dla zmienionego r1 % Wyznaczenie wspolczynnikow przenoszenia bledu rezystancji r1 na: Ti4=(abs(i1(4)-i(4)))/abs(i(4))/0.01 % wzgledna zmiana i4 Ti=(abs(norm(i1)-norm(i)))/norm(i)/0.01 % wzgledna zmiana normy wektora i pause r1=1; % przywrocenie poprawnej wartosci r1 r2=r2*1.01; % zmiana rezystora r2 o 1% % itd. dla kolejnych rezystorów A=[-r1 r2 0 -r4 0; 0 0 -r3 r4 r5; r1 0 r3 0 0 ; 1 0 -1 -1 0; 0 1 0 -1 -1]; i2=A\b Ti4=(abs(i2(4)-i(4)))/abs(i(4))/0.01 Ti=(abs(norm(i2)-norm(i)))/norm(i)/0.01 pause r2=2; r3=r3*1.01; A=[-r1 r2 0 -r4 0; 0 0 -r3 r4 r5; r1 0 r3 0 0 ; 1 0 -1 -1 0; 0 1 0 -1 -1]; i3=A\b Ti4=(abs(i3(4)-i(4)))/abs(i(4))/0.01 Ti=(abs(norm(i3)-norm(i)))/norm(i)/0.01 pause r3=3; r4=r4*1.01; A=[-r1 r2 0 -r4 0; 0 0 -r3 r4 r5; r1 0 r3 0 0 ; 1 0 -1 -1 0; 0 1 0 -1 -1]; i4=A\b Ti4=(abs(i4(4)-i(4)))/abs(i(4))/0.01 Ti=(abs(norm(i4)-norm(i)))/norm(i)/0.01 pause r4=0.5; r5=r5*1.01; A=[-r1 r2 0 -r4 0; 0 0 -r3 r4 r5; r1 0 r3 0 0 ; 1 0 -1 -1 0; 0 1 0 -1 -1]; i5=A\b Ti4=(abs(i5(4)-i(4)))/abs(i(4))/0.01 Ti=(abs(norm(i5)-norm(i)))/norm(i)/0.01 % Przyklad 4.5 clear all L=[]; N=50; % wymiar ukladu rownan D=-4*eye(N); % przekatna macierzy ukladu kolumna=[0;1;1;zeros(N-3,1)]; % pierwsza kolumna dolnej macierzy trojkatnej for i=1:N % w petli dostawiamy kolejne L=[L kolumna]; % modyfikowane kolumny kolumna=[0;kolumna(1:N-1)]; % dodajemy 0 na pierwszym miejscu i nie bierzemy end % ostatniego elementu U=L'; % macierz górna jest transpozycja dolnej A=L+D+U; b=[1;zeros(N-1,1)]; % Metoda Jacobiego uzyta do znalezienia rozwiazania dokladnego B=-inv(D)*(L+U); % komentarz pod wzorem (4.32) c=inv(D)*b; xold=(1:50)'; % punkt startowy rozwiazania i=0; koniec=1; while koniec % petla iteracyjna i=i+1; x=B*xold+c; % wzor iteracyjny (4.32) if all(abs(x-xold)<eps/2) % kryterium konca algorytmu koniec=0; % zmiana rozwiazania mniejsza niz ... end xold=x; end fprintf('Wykonano %i iteracji algorytmu Jacobiego\n',i) fprintf('Norma bledu rozwiazania=%10.4e\n',norm(A*x-b)) x_dokl=x; % metoda Gaussa-Seidla B=-inv(L+D)*U; %komentarz pod wzorem (4.40) c=inv(L+D)*b; x=(1:50)'; % punkt startowy rozwiazania bw_gs(1)=norm(x-x_dokl)/norm(x_dokl); % pierwszy element wektora bledow for loop=2:100 % petla iteracyjna x=B*x+c; % loop-te rozwiazanie bw_gs(loop)=norm(x-x_dokl)/norm(x_dokl); % loop-ty element wektora bledu end figure(1) hold off semilogy((1:100),bw_gs) hold on fprintf('wyniki dla metody Gaussa-Seidla\nkontynuacja - nicisnij klawisz\n') pause % metoda SOR omega=1.7; B=inv(D+omega*L)*((1-omega)*D-omega*U); % komentarz pod c=omega*inv(D+omega*L)*b; % wzorem (4.44) x=(1:N)'; % analogicznie ... bw_sor15(1)=norm(x-x_dokl)/norm(x_dokl); for loop=2:100 x=B*x+c; bw_sor15(loop)=norm(x-x_dokl)/norm(x_dokl); end semilogy((1:100),bw_sor15,':k') fprintf('wyniki dla metody SOR omega=1.7\nkontynuacja - nicisnij klawisz\n') pause omega=1.9; B=inv(D+omega*L)*((1-omega)*D-omega*U); c=omega*inv(D+omega*L)*b; x=(1:50)'; bw_sor19(1)=norm(x-x_dokl)/norm(x_dokl); for loop=2:100 x=B*x+c; bw_sor19(loop)=norm(x-x_dokl)/norm(x_dokl); end semilogy((1:100),bw_sor19,':g') legend('GS','SOR - 1.7','SOR - 1.9') % Przyklad 4.6 clear all format long warning off A=[ 1 1 1 1 2 3 1.5 2 4]; b=[1 1 1]; [Q,R]=qr(A) z=Q'*b x=R\z % macierz ukladu % wektor prawej strony % rozklad QR macierzy A % obliczenie wektora z=Q'*b % rozwiazanie ukladu Rx=z wzgledem wektora x % Przyklad 4.7 clear all warning off A=[1 1 1 % trzy mozliwe uklady wielkosci a1, a2 i a3 (w wierszach) 1 2 1 1 1 3]; b=[1 % wektor prawych stron dla mozliwych ukladów ai 2 3]; x_dokl=[-1 % oraz dokladne wartosci parametrow x1, x2 i x3 1 1]; A_zab=[]; b_zab=[]; zab=0.01; K=30; for loop=1:K % petla wykonywania pomiarow A_zab1=A.*(1+(rand(3,3)-0.5)*zab); % symulacja wartosci zaburzonych A A_zab=[A_zab;A_zab1]; % rozbudowywanie macierzy ukladu nadokreslonego b_zab=[b_zab;b.*(1+(rand(3,1)-0.5)*zab)]; % symulacja wartosci zaburzonych b [Q,R]=qr(A_zab); % rozklad QR macierzy ukladu z=Q'*b_zab; % obliczenie wektora z=Q'*b x=R\z; % rozwiazanie ukladu Rx=z wzgledem wektora x bw(loop)=norm(x-x_dokl)/norm(x_dokl); % znormalizowany blad wzgledny end figure(1) hold off semilogy((3:3:3*K),bw,'*:r')