PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA w CHEŁMIE
INSTYTUT NAUK TECHNICZNYCH
Elektrotechnika
LABORATORIUM METOD NUMERYCZNYCH W TECHNICE Prowadzący: dr inż. E. Żak |
|||
Piotr Dyjak |
Temat: Matlab 7.6.0 Algebra liniowa |
||
Data wykonania ćwiczenia:
|
Grupa A
|
Ćwiczenie nr 2 |
Podpis |
Cel ćwiczenia
Celem ćwiczenia było zapoznanie się z programem MATLAB oraz wykorzystanie go do obliczania podstawowych zagadnień. Nazwa programu pochodzi od angielskich słów MATrix LABoratory, gdyż środowisko to służy do operacji numerycznych macierzowych. MATLAB najczęściej wykorzystuje normę euklidesową.
Wykonanie ćwiczenia
Przykład1 , 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.).
Przykład 2 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
Macierz rozszerzona b. Aby rozwiązać równania za pomocą rref, wpisywaliśmy polecenia:
c = [A b];
cr = rref(c);
kolumna Cr jest rozwiązaniem x.
Przykład 3 szukanie miejsc zerowych. Napisaliśmy n-plik skryptowy wyznaczający miejsca zerowe funkcji sinus oraz wyznaczający pierwiastki równania trzeciego rzędu, równanie nieliniowe.
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ć.
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=fzero(`sin', 10);
>> m=fminbnd(`sin',10,11);
>> p=[3, -2, 4, 1];
>> r=roots(p);
>> w=polyval(p 2);
Przykład 4.
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 A 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;
x=A\b
x=pinv(A)*b
Kolejny zrzut ekranu przedstawia działania:
x=inv(A)*b;
Następnie przedstawione jest poniższe wykonane działania w Matlabie:
det(A);
p=pinv(A)
cond(Ax=p*b
[L, U]=lu(A)
x= U \ L \ b
istnieją 3 podstawowe metody rozwiązywania układów równań: wzorami Cramera (ok. 1012 wykonanych działań), metodą Gaussa (około 1300 działań) oraz metodą Gaussa-Jordana (ok. 2000 działań). MATLAB domyślnie posługuje się metodą Gaussa. Mając podane równanie, np:
x+2y-z=3
3x-4y+2x=-5
5x-2y+3z=2
możemy zapisać równoznacznie w postaci macierzowej A*x=B, gdzie:
A=[1,2,-1 ; 3,-4,2 ; 5,-2,3]
x=[x;y;z]
B=[3;-5;2]
rozwiązaniem tego równania będzie odnalezienie macierzy x. Rozwiązanie
przyjmuje postać: x=inv(A)*B, np:
>>x=inv(A)*B
>>x=inv(Y)*Z
Wnioski:
MATLAB jest bardzo rozbudowanym środowiskiem, który dobrze radzi sobie z
większością wymaganych od niego operacji. Jest przydatny zarówno jako środowisko programistyczne jak i program do wykonywania skomplikowanych operacji. Przy działaniach na dużych macierzach wkradają się jednak drobne błędy, które jednak można bardzo prosto „wyłapać”. Dodatkowo porozumiewanie się z użytkownikiem wychodzi wyjątkowo dobrze. Zwraca uwagę na konkretne błędy i informuje o nich, przez co praca jest zadziwiająco łatwa. Sam zapis komend nie różni się wiele od znanych do tej pory języków programowania jak C++ czy Java, jednak sama struktura wydaje się odrobinę czytelniejsza. Należy pamiętać o „drobnostkach” typu wstawienie w odpowiednie miejsce kropki, by działanie wykonane zostało poprawnie, lub o wstawienie średnika pod koniec wiersza, gdy nie chcemy wyświetlania wartości. Z podstawową znajomością operacji macierzowych i algebry liniowej nie ma większego trudu z opanowaniem programu.