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')