Objaśnienia

3. Znaki Specjalne. Ciągi, wektory, macierze i niektóre działania na nich. Rozwiązywanie układu równań liniowych

3.1. Znaki specjalne

znakiObjaśnienie
[ ]w nawiasach prostokątnych umieszcza się wartości elementów macierzy
{ }nawiasy klamrowe są używane przy definiowaniu tzw. macierzy komórkowych
( )nawiasy okrągłe używamy w wyrażeniach oraz dla wskaźników macierzy i argumentów funkcji
:dwukropek ma kilka znaczeń:1) w wyrażeniu złożonym z trzech elementów połączonych dwoma dwukropkami na przykład: 5:2:13 oznacza: "ciąg od 5 z przyrostem 2 do 13"2) w wyrażeniu złożonym z dwu elementów połączonych dwukropkiem: 5:10 oznacza: "ciąg od 5 do 10 domyślnie z przyrostem 1"3) samodzielny dwukropek zamiast wskaźnika lub wskaźników macierzy zastępuje wszystkie wartości wskaźnika lub wskaźników na przykład jeśli macierz A ma wymiary 3x5 to zamiast pisać i=1:3; j=1:5; A(i,j) można napisać:A(:,:) lub A(:)
=przypisuje zmiennej wartość wyrażenia n.p.: x=2*sin(pi/6)
.kropka poprzedza część ułamkową liczby (lub nazwę pola rekordu)
,przecinek rozdziela indeksy, argumenty funkcji lub poszczególne instrukcje (zamiast zmiany linii)
;dajemy po instrukcjach jeśli nie chcemy wyświetlania wyników ich realizacjiw przeciwnym przypadku kończymy instrukcje zmianą linii lub przecinkiem.
%znak procentu poprzedza komentarze w programach (m-plikach)
Pomoc dotyczącą nawiasów można uzyskać wpisując: help paren

3.2. Wprowadzanie i generowanie wektorów i macierzy

Aby wygenerować ciąg (postęp arytmetyczny) trzeba podać informacje w następującej formie:
nazwa_wektora = pierwszy element : przyrost lub ubytek : ostatni element

Na przykład: x = 0:0.2:1
   x =
    0   0.2000   0.4000   0.6000   0.8000   1.0000

Jeśli przyrost ma być równy 1 to można go pominąć w zapisie np.:
i = 1:6
   i =
      1    2    3    4    5    6

Wektory i macierze mogą być wprowadzane przez:

  1. wpisywanie (w oknie komend lub w m-plikach)
  2. generowanie przez operatory, funkcje i komendy Matlab'a:
  3. wczytywanie z pliku dyskowego
ad.1)
Wprowadzanie wektora:

Przykładem wektora (ciągu) wpisanego z klawiatury mogą być wyniki pomiarów napięcia w sieci elektrycznej w ciągu doby:
   U = [220, 221, 220, 218, 218, 219, 220, 221]

Wprowadzanie macierzy:
Aby wpisać macierz w oknie komend należy przecinkiem oddzielać elementy wiersza a średnikiem oddzielać wiersze, np.:
>> A = [1, 2, 3; 7, 8, 9]
daje:
A =
   1   2   3
   7   8   9
ad.2)
Generowanie wektorów i macierzy

Wektor można wygenerować jako postęp arytmetyczny (patrz wyżej)

Do generowania pewnych macierzy można stosować funkcje:

Wiele innych macierzy generuje się przy pomocy programów z użyciem instrukcji FOR i innych.

ad 3) Wczytywanie macierzy z pliku
Załóżmy, że mamy plik tekstowy o nazwie DANE1.TXT a w nim są dwie linie i w każdej po 4 liczby oddzielane odstępami:
2 4 6 8
3 6 9 12
Aby wczytać te liczby do macierzy można napisać następujące instrukcje:
[plik1 info] = fopen('DANE1.TXT');
A = fscanf(plik1, '%f %f %f %f', [4, 2])
close(plik1)
Ale UWAGA: dane czytane są z pliku wierszami ale umieszczane w macierzy kolumnami, dlatego po wczytaniu uzyskamy macierz:
A =
   2   3
   4   6
   6   9
   8   12
Aby uzyskać to samo co w pliku trzeba macierz transponować (jak niżej)

3.3. Podstawowe operacje na macierzach

Rozmiary czyli liczbę wierszy i kolumn macierzy można sprawdzić funkcją size: [Liczba_wierszy Liczba_kolumn] = size(Macierz)
Długość wektora (czyli liczbę jego składowych) można sprawdzić funkcją length(wektor).

3.3.1. Transponowanie
- to operacja polegająca na zamianie wierszy macierzy na kolumny. Operatorem transponowania jest w Matlabie apostrof ['].

Przykładowo jeśli:
A =
     2   3
     4   6
     6   9
     8   12
to macierz transponowana:
A' =
     2   4   6   8
    3   6   9   12

3.3.2. Suma i różnica
Dla sumowania oraz odejmowania macierze muszą mieć jednakowe wymiary, sumowane są elementy o tych numerach.
A=[4, 2, 3; 3, 6, 1 ], B=[5, 3, 8; 4, 1, 2]
A =
    4   2   3
    3   6   1
B =
    5   3   8
    4   1   2

C=A+B
C =
    9   5   11
    7   7   3

3.3.3. Mnożenie macierzy lub ich elementów Rozróżniane jest mnożenie macierzowe (*) oraz tablicowe (.*)
W mnożeniu macierzowym każdy element macierzy wynikowej powstaje przez pomnożenie odpowiedniego wiersza pierwszej macierzy przez kolumnę drugiej i zsumowaniu iloczynów par wyrazów. Wynika z tego warunek aby liczba elementów wiersza macierzy pierwszej była równa liczbie elementów w kolumnie macierzy drugiej. Dletego dla naszych macierzy A i B zostanie zasygnalizowany błąd:
>> A*B
??? Error using ==> *
Inner matrix dimensions must agree.


Natomiast wykonalne będzie to działanie gdy macierz B transponujemy:
>> A*B'
ans =
    50   24
    41   20
Bez transponowania można wykonać tak zwane mnożenie tablicowe (operator: kropka i gwiazdka). W tym mnożeniu element macierzy wynikowej C(w,k) jest po prostu iloczynem pary elementów A(w,k)*B(w,k). Na przykład:
>> A.*B
ans =
    20   6   24
    12   6   2

3.4 Układ równań liniowych. Odwracanie oraz dzielenie macierzy

Załóżmy że układ równań liniowych doprowadziliśmy do postaci macierzowej zapisanej (w opisie a nie w Matlabie) jako: A*X=B
gdzie:
    A=macierz współczynników przy niewiadomych,
    X=wektor niewiadomych,
    B= wektor wyrazów wolnych
Wtedy rozwiązanie czyli wektor niewiadomych X wyznaczamy przez lewostronne pomnożenie obu stron równania przez macierz odwrotną do A zapisywaną w Matlabie jako inv(A):
inv(A)*A*X= inv(A)*B
a ponieważ iloczyn macierzy danej i odwrotnej jest macierzą jednostkową która mozna pominąć więc rozwiązanie dowolnego ukladu równań liniowych otrzymamy przy pomocy jednego wzoru:
X=inv(A)*B
Jednakże Matlab nie zaleca stosowania funkcji inv(..) a zamiast niej poleca dzielenie lewostronne macierzy (operator "\" w odróżnieniu od dzielenia prawostronnego "/") jako mniej pracochłonne dla komputera i mogące w większości przypadków zastąpić odwracanie macierzy. W szczególności dla naszego układu równań liniowych stosując lewostronne dzielenie mamy (w opisie): A\A*X=A\B co po uproszczeniu trzeba zapisać w Matlabie jako
X=A\B
Matlab stosuje wówczas wydajniejszą metodę eliminacji Gauss'a zamiast pracochłonnego odwracania macierzy, co skraca czas obliczeń 2 do 3 razy i poprawia dokładność.