SPRAWOZDANIE
PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA W CHEŁMIE Instytut Nauk Technicznych i Lotnictwa Kierunek: Elektrotechnika II rok III semestr |
|||
LABORATORIUM METOD NUMERYCZNYCH W TECHNICE |
|||
Imię i nazwisko:
|
Temat ćwiczenia: Matlab 7.6.0 Algebra liniowa |
Nr ćwiczenia: 2 |
|
Data: |
Grupa A |
Rok akademicki 2012/2013 |
Ocena / podpis |
1. Cel ćwiczenia
Celem ćwiczenia zapoznanie się z podstawowymi funkcjami zastosowania algebry liniowej, a także zapoznanie się z funkcjami i skryptami w MATLAB'ie.
2. Wykonanie ćwiczenia
Dowolne sekwencje instrukcji Matlab'a można zapisać w pliku tekstowym z rozszerzeniem „.m”. Powstaje w ten sposób tak zwany M-skrypt. Wpisanie w linii poleceń nazwy pliku (bez rozszerzenia) powoduje wczytanie pliku i wykonanie zawartych w nim instrukcji. Operują one zawsze na głównej przestrzeni roboczej Matlab'a i ich efekt jest identyczny, jakby wprowadzono je ręcznie z linii poleceń.
Użycie M-skryptów bywa wygodne, ale w przypadku wielokrotnie używanych w różnych okolicznościach sekwencji instrukcji należy rozważyć nadanie jej postaci funkcji użytkownika, tak zwanej M-funkcji.
Taki nagłówek powoduje odmienne potraktowanie pliku. Wystąpienie nazwy pliku po raz pierwszy powoduje jego wczytanie do pamięci, a w razie wykrycia nagłówka funkcji zamianę zawartości na tak zwany p-kod, który pozostaje w pamięci aż do jawnego usunięcia poleceniem clc.
Jeśli użyto nazwy funkcji, która została już przekształcona do p-kodu, sprawdzone zostaje, czy lista parametrów aktualnych jest zgodna z lista parametrów formalnych. Następnie parametry aktualne wiązane są z formalnymi i wykonywany jest p-kod. W stosunku do M-skryptu różnica polega na tym, ze M-funkcja ma własna przestrzeń robocza, a zmienne z głównej przestrzeni roboczej są dostępne tylko pod warunkiem jawnego zadeklarowania jako globalnych zarówno w głównej przestrzeni, jak i wewnątrz funkcji. Poza tym wszystkie zmienne maja charakter lokalny i przekazywanie wyników może odbyć się tylko poprzez parametry wyjściowe.
Już pierwsza wersja Matlab'a obok rozwiązywania układów równań liniowych udostępniała szereg zaawansowanych operacji na wektorach i macierzach oferowanych przez biblioteki LINPACK i EISPACK. W najnowszej wersji przepisane w języku C procedury z tych bibliotek zastąpiono biblioteką LAPACK - najobszerniejszym niekomercyjnym zestawem procedur z dziedziny algebry liniowej. Stad obok operatorów arytmetycznych, „/” oraz „n” dostępnych jest szereg procedur, z których najważniejsze to lu, chol, inv, rcond, cond, pinv, qr, eig, schur, svd, expm. Ponadto polecenie gallery daje dostęp do szerokiego repertuaru funkcji generujących różnorodne specjalne macierze dogodne do testowania algorytmów tworzonych przez użytkownika.
Macierz posiada elementy z ciała liczb zespolonych C. Poszczególne elementy w wierszu oddzielamy przecinkami lub spacjami, wiersze natomiast oddzielamy średnikami. Do odwoływania się do większej ilości elementów możemy użyć operatora : (dwukropek). Użyty sam, oznacza cały dostępny zakres, użyty w formie n:m wskazuje na elementy od n-tego do m-tego, uzyty w formie n:p:m oznacza elementy z przedziału od n-tego do m-tego co p-ty element, przy czym n,m, p należy do N.
Możemy wykonywać operacje na macierzach, np.: dodawać +, odejmować -, mnożyć *, dzielić lewostronnie \ lub prawostronnie /, wyznaczać odwrotność (polecenie inv()), itd. Możemy także scalać macierze o odpowiednich wymiarach.
Podstawowym narzędziem do rozwiązywania układów równań liniowych jest w Matlab'ie operator „n”. Rozwiązuje on równanie: Ax = B gdzie A jest macierzą kwadratowa (powiedzmy nxn), zaś B macierzą o n wierszach. Wynik jest macierzą o wymiarach nxm, chociaż w rzeczywistości stosowana jest zazwyczaj metoda eliminacji Gaussa z częściowym wyborem elementów głównych w kolumnie. W pewnych przypadkach szczególnych stosowane są inne algorytmy: jeśli na przykład macierz A jest symetryczna, to dokonuje się sprawdzenia, czy jest dodatnio określoną, a jeśli test wypadnie pomyślnie stosowany jest rozkład Choleskiego. Specjalne algorytmy stosowane są, gdy macierz A jest rzadka. Operator działa tez wtedy, gdy macierz A jest prostokątną, a w konsekwencji układ równań jest niedookreślony (k > n), albo nadokreślony (k < n). Wtedy stosowany jest rozkład QR z zamiana kolejności wierszy. Należy zwrócić uwagę, ze jeśli A ma niepełny rząd, to A\B nie jest tym samym co pomnożenie B przez macierz pseudoodwrotna do A.
Operator „/” działa podobnie - konstrukcja B / A jest równoważna (A'\B')', a w większości wypadków odpowiada obliczeniu BA-1.
W przykładzie 1, w trakcie zajęć, należało napisać plik skryptowy rozwiązujący układ równań liniowych dla parametru R i obliczający wartość wyznacznika macierzy.
Aby zapisać równanie w postaci macierzy [A]{x} = {b}, gdzie {x} jest wektorem niewiadomych, musisz umieścić niewiadome w wektorze x, współczynniki niewiadomych w macierzy A, zaś wartości stałe, przeniesione na prawą stronę, w wektorze b.
Wyznaczyliśmy macierz, gdzie:
macierz współczynników: A = wektor stałych: b = wektor niewiadomych x =
5 2r r 2 x1
3 6 2r-1 3 x2
2 r-1 3r 5 x3
Zapisaliśmy wykonane czynności jako plik funkcyjny a później skryptowy.
Wprowadzamy macierz A oraz wektor b i znajdujemy rozwiązanie dla wektora x przez x=A\b. Wyliczamt także wyznacznik det(A).
Można tu użyć funkcji linsolve, która rozwiązuje układy liniowe, o ile macierz A ma strukturę zdatną do wykorzystania (np. trójkątną, dodatnio określoną itd.).
W przykładzie 2 do przećwiczenia na zajęciach było rozwiązanie układu równań metodą eliminacji Gaussa. Należało wyliczyć x: x = A\b oraz wyznacznik det(A).
A = b =
5 -3 2 10
3 8 4 20
2 4 -9 9
Metoda eliminacji Gaussa to technika, która wymaga uformowania prostokątnej macierzy, zawierającej macierz współczynników A oraz wektor znanych wartości b w macierzy rozszerzonej. Za pomocą procedury eliminacji Gaussa-Jordana macierz ta jest przekształcana do postaci normalnej. MATLAB zawiera wbudowaną funkcję rref, która zadanie to wykonuje bardzo precyzyjnie, przekształcając macierz do postaci normalnej.
Należało uformować macierz rozszerzoną b. Aby rozwiązać równania za pomocą rref, wpisywaliśmy polecenia:
c = [A b]; % formuje macierz rozszerzoną
cr = rref(c); % redukcja wierszowa macierzy rozszerzonej
Ostatnia kolumna Cr jest rozwiązaniem x.
Następne ćwiczenie (przykład 3) polegało na szukaniu miejsc zerowych. Należało napisać n-plik skryptowy wyznaczający miejsca zerowe funkcji sinus oraz wyznaczający pierwiastki równania trzeciego rzędu (równanie nieliniowe).
Przy rozwiązywaniu równa, poszukujemy pierwiastków równa,, maksimów i minimów funkcji. Pierwiastki rzeczywiste równania, (czyli miejsca zerowe) -> f(x)=0. W Matlabie funkcja fzero wyszukuje pierwiastek równania w pobliżu zadanej wartości zmiennej. Czyli do znalezienia wszystkich pierwiastków równania trzeba podać okolice gdzie ma on występować.
Minimum lokalne funkcji poszukuje się analogicznie do pierwiastków przy pomocy funkcji fminbnd. Maximum lokalne funkcji poszukuje się przez poszukiwanie minimum funkcji odwrotnej do danej, czyli -> -f(x).
W przypadku wielomianów wartości funkcji wyszukuje się przez funkcje roots(c), gdzie c jest wektorem współczynników wielomianu. Pierwiastek n-tego stopnia z danej liczby to rozwiązanie równania: x^n = r. Funkcja roots liczy wszystkie pierwiastki wielomianu p będącego jej argumentem. W matlabie wielomian konstruuje się podając współczynniki stojące przy kolejnych potęgach x, poczynając od n-tej, a kończąc na zerowej.
W celu obliczenia wartości wielomianu korzystamy z funkcji polyval(c,x), gdzie x jest liczbą, wektorem lub macierzą dla której liczymy wartości wielomianu.
Przykład z zajęć:
>> z=fzero(`sin', 10); % szuka miejsca zerowego funkcji sinus w okolicach 10
>> m=fminbnd(`sin',10,11); % szuka najmniejszej warto_ci funkcji sinus w przedziale (10,11)
>> p=[3, -2, 4, 1]; % definicja wielomianu p=3x^3-2x^2+4x+1
>> r=roots(p); % zwraca pierwiastki równania
>> w=polyval(p 2); % zwraca wartość wielomianu 3*2^3-2*2^2+4*x+1
Przykład 4.
Matlab ma bardzo rozwinięte algorytmy rozwiązywania równa, liniowych. W zależności od potrzeb można używać metod zaawansowanych (Matlab stara się dobrać metodę w tle) lub ręcznie przez Metodę Gaussa, uzyskiwanie rozkładu macierzy na macierze trójkątne itd.) Układ równań linowych można zapisać wektorowo w postaci: A*x=b, gdzie A macierz współczynników, x - wektor zmiennych [x1...xn].
Z rozwiązaniem układu równań nie ma problemu pod warunkiem, że układ nie jest sprzeczny, jest dobrze określony, i jest liniowo niezależny. W przeciwnym wypadku trzeba stosować bardziej zaawansowane metody obliczeń. Do sprawdzania uwarunkowania macierzy służy funkcja cond(a). Duże wartości funkcji cond świadczą o złym uwarunkowaniu - to wpływa na dokładność obliczeń numerycznych.
Mając dane z zajęć: A (macierz współczynników) i b wprowadzić działania z algebry liniowej:
x=A\b x=pinv(A)*b
lu x=inv(A)*b;
A*x=b;
cond(A); p=pinv(A)
det(A) x=p*b
A = b =
1 0 0 1
1 0.0001 0 1
1 1 9999 10000
Na poniższym zdjęciu pokazana jest macierz A, b, a także:
A*x=b; % równanie x=b/A daje wynik rozwiązania układu równa, w postaci x*A=b
x=A\b; % operator dzielenia lewostronnego. Stosuje się tu metodę eliminacji Gaussa z częściowym wyborem elementu głównego
x=pinv(A)*b
Kolejny zrzut ekranu przedstawia działania:
x=inv(A)*b; % metoda obliczania układu równań przez mnożenie wektora wynikowego przez macierz odwrotna współczynników; rozwiązanie metodą odwrócenia macierzy
Następnie przedstawiłam poniższe wykonane działania w Matlabie:
det(A); % wyznacznik
p=pinv(A)
cond(A); % funkcja do sprawdzania uwarunkowania macierzy
x=p*b
Wykonałam także działania:
[L, U]=lu(A)
x= U \ L \ b
Podstawową metodą rozwiązywania układów liniowych jest metoda eliminacji Gaussa - tzw. rozkład LU. Polega on na znalezieniu macierzy L i U takich, że A=L*U, gdzie U jest macierzą trójkątną górną, a L macierzą trójkątną dolną.
W Matlabie eliminację Gausa przeprowadza funkcja lu. Przy wywołaniu [L,U]=lu(A), U jest macierzą trójkątną górną, ale L nie zawsze będzie macierzą trójkątną dolną. Natomiast przy wywołaniu [L,U, P]=lu(A) U jest macierzą trójkątną górną, L nie zawsze będzie macierzą trójkątną dolną, a P macierzą permutacji (zmienia kolejność wierszy w macierzy A). Zachodzi tu zależność L*U=P*A.