%% Przestrzenie i przekształcenia liniowe
%% Przykład 1. Podprzestrzeń przestrzeni R^n można zapisać za pomocą jednorodnego układu równań liniowych.
% Zdefiniujemy podprzestrzeń przestrzeni R^4 jako zbiór rozwiązań układu dwóch równań.
%

syms x y z t % zmienne w przestrzeni R^4
eqns=[2*x+z-2*t==0, x-y+z==0] % opis podprzestrzeni

%
% Bazę tej podprzestrzeni możemy  wyznaczyć za pomocą polecenia null.
% Wektory z bazy zapisane są w kolumnach otrzymanej macierzy.

A=equationsToMatrix(eqns,x,y,z,t) % macierz współczynników układu jednorodnego
X=null(A) % to polecenie wyznacza bazę przestrzeni rozwiązan
wymiarX=rank(X) % liczba liniowo niezależnych kolumn macierzy X, czyli wymiar przestrzeni X
X1=X(:,1)' % pierwszy wektor bazy, stosujemy operator ' czyli transpozycję, gdy chcemy wektor zapisać wierszowo
X2=X(:,2)' % drugi wektor bazy

% Podprzestrzeń X=Lin{X1,X2}, baza przestrzeni X to np. układ wektorów (X1,X2)
%
%% Przykład 2. Podprzestrzeń przestrzeni R^n można zdefiniować podając zbiór jej generatorów (V=Lin{v1,v2,...vk}).

% Definiujemy układ wektorów A=(v1,v2,v3,v4,v5)

v1=sym([1 3 0 0])    % wektory zapisane jako wiersze 
v2=sym([1 0 5 4])
v3=sym([3 6 5 4])
v4=sym([0 1 -2 7])
v5=sym([2 1 8 15])

%
% Zapiszemy macierz układu A w bazie kanonicznej E4:  M_{\textrm{E4}} \left(A\right)

MA=[v1' v2' v3' v4' v5'] % macierz układu A w bazie kanonicznej E4
% wektory zapisane jako kolejne kolumny macierzy

%

wymiarV=rank(MA)  % wymiar przestrzeni V to rząd macierzy układu A

%
% Przestrzen ma wymiar 3, jej bazę otrzymamy np. wybierając liniowo niezależny uklad trzech wektorów z A.
% Wybieram trzy pierwsze wektory

BV=[v1' v2' v3']
rank(BV) % sprawdzam wymiar przestrzeni generowanej przez te 3 wektory

%
% Niestety wymiar jest za mały, wybrany uklad wektorów nie jest liniowo niezależny, sprawdzimy inny.

CV=[v2' v3' v4']
rank(CV)

% Teraz wymiar jest odpowiedni. Układ (v2,v3,v4) jest bazą przestrzeni V.
%
% Inny sposób wyznaczenia bazy przestrzeni V - za pomocą polecenia colspace

 MB=colspace(MA)
 % operacja colspace(M) zwraca w kolumnach wynikowej macierzy bazę przestrzeni generowanej przez kolumny macierzy M
w1=MB(:,1) %  1. kolumna
w2=MB(:,2) %  2. kolumna
w3=MB(:,3) %  3. kolumna

% Układ (w1,w2,w3) to inna baza tej samej przestrzeni V.
%
% Sprawdzimy, że np. wektor v1 jest kombinacją liniową wektorów bazy MB=(w1,w2,w3)

komb=linsolve(MB,v1') 

% Wekor komb zawiera współrzedne wektora v1 w bazie (w1,w2,w3).
% Z uzyskanego wyniku mamy:    v1=1*w1+3*w2+0*w3.
%
% Sprawdzenie:

v1'==w1+3*w2

%
%% Przykład 3. Zajmiemy się przekształceniem liniowym f:R^3 \longrightarrow R^3 ,\;f\left(x,y,z\right)=\left(x-2y,0,x+z\right)
% Wyznaczymy jądro i obraz tego przekształcenia.

syms x y z
f1=x-2*y % pierwsza współrzędna wektora wartości
f2=0 % druga współrzędna wektora wartości
f3=x+z % trzecia współrzędna wektora wartości

%

Mf=equationsToMatrix(f1,f2,f3,x,y,z) % tak tworzymy macierz przeksztalcenia f w bazach kanonicznych

%
% Wyznaczymy jądro przeksztalcenia czyli Ker(f)

kerf=null(Mf)

% Ker(f) jest jednowymiarową podprzestrzenią w R^3. Baza tej podprzestrzeni składa się z jednego wektora.
%
% Wyznaczymy obraz przekształcenia czyli Im(f)

imf=colspace(Mf) % baza przestrzeni Im(f) to baza przestrzeni generowanej przez kolumny macierzy przekształcenia
wymiar_imf=rank(Mf) % wymiar przestrzeni Im(f) czyli rząd przekształcenia f

%
% Obraz przeksztalcenia f jest dwuwymiarową podprzestrzenią przestrzeni R^3.
% Baza przestrzeni Im(f) to np. układ (w1,w2) wektorów zapisanych w kolumnach macierzy imf.

w1=imf(:,1)'
w2=imf(:,2)'

%
%% Przykład 4. Wyznaczymy wzór przekształcenia  f\left(x,y,z,t\right),
%% gdzie f:R^4 \longrightarrow R^2, M_B^A \left(f\right)=\left\lbrack \begin{array}{cccc}
% 3 & 0 & -2 & 5\\
% 2 & 3 & 0 & -1
% \end{array}\right\rbrack,
%% bazy:  A=((1,2,1,2),(1,2,1,3),(1,1,1,1),(1,2,0,0)),  B=((5,4),(6,5)).
%
%% Wzór przekształcenia wyznaczymy na podstawie macierzy przekształcenia w bazach kanonicznych.
%% Wykorzystamy równość  M_{\textrm{E2}}^{\textrm{E4}} \left(f\right)=M_{\textrm{E2}}^B \left(\textrm{id}\right)\cdot M_B^A \left(f\right)\cdot M_A^{\textrm{E4}} \left(\textrm{id}\right).
% Wprowadźmy oznaczenia: {F=M}_{\textrm{E2}}^{\textrm{E4}} \left(f\right),\;B=M_{\textrm{E2}}^B \left(\textrm{id}\right),\;\textrm{FAB}=M_B^A \left(f\right),\;A=M_{\textrm{E4}}^A \left(\textrm{id}\right),\textrm{odwrA}=A^{-1} =M_A^{\textrm{E4}} \left(\textrm{id}\right)

FAB=sym([3 0 -2 5; 2 3 0 -1])
B=sym([5 4;6 5]') % wektory bazy B zapisane są wierszowo, ale potem macierz jest transponowana, aby były w kolumnach
A=sym([1 2 1 2;1 2 1 3;1 1 1 1;1 2 0 0]') % podobnie zapisujemy wektory bazy A 
odwrA=inv(A)

%

F=B*FAB*odwrA % F - macierz przekształcenia f w bazach kanonicznych 

%

syms x y z t
f(x,y,z,t)=F*[x; y; z; t] % wzór przekształcenia f, 
% dla przejrzystosci wyniku kolejne współrzędne wynikowego wektora mamy zapisane w kolejnych wierszach

%
% Możemy obliczyć wartość przekształcenia np. dla wektora (1,2,3,4)

f(1,2,3,4)