%% Interaktyvus pratimas nr. 9. Matricos ir determinantai. Tiesiniai operatoriai
% Paskaitos metu kalbėjome apie geometrinę matricų interpretaciją. Šiame interaktyviame pratime nagrinėsime posūkio bei atspingžio tiesinius operatorius ir pavaizduosime juos matriciniu pavidalu. Taip pat išsiaiškinsime matricos determinanto geometrinę prasmę. Tam tikslui nagrinėsime vienetinio kvadrato, pavaizduoto žemiau, kelias transformacijas. Trečioje dalyje panagrinėsime tikrinių reikšmių ir vektorių sąvokas.
%% I dalis. Posūkio ir atspindžio tiesiniai operatoriai
% Tarkime, kad turime vienetinį kvadratą

Vir_x = [0 0 1 1 0];
Vir_y = [0 1 1 0 0];

newplot
hold on;
plot(Vir_x,Vir_y);
grid on
axis([-2, 2, -2, 2]);
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
hold off

%
% Pradėsime nuo posūkio operatoriaus, t.y. pasuksime šį kvadratą kampu \alpha \;. Galite keisti kampą \alpha (laipsniais) ir stebėti, kaip keičiasi posūkio matrica, kuri atrodo taip:
% A=\left\lbrack \begin{array}{cc}
% \cos \;\alpha  & -\sin \;\alpha \\
% \sin \;\alpha  & \cos \;\alpha
% \end{array}\right\rbrack \ldotp
% Taip pat galite matyti grafinę interpretaciją

alpha = 60;
c = cosd(alpha);
s = sind(alpha);

A = [c -s; s c];

disp('Posūkio matrica yra: ')
disp(A)

A00 = A * [0; 0];
A01 = A * [0; 1];
A10 = A * [1; 0];
A11 = A * [1; 1];

newplot;
clf;
plot([0 0 1 1 0],[0 1 1 0 0]);

hold on;

Vir_x = [A00(1) A01(1) A11(1) A10(1) A00(1)];
Vir_y = [A00(2) A01(2) A11(2) A10(2) A00(2)];
plot(Vir_x,Vir_y);
grid on;
axis([-2, 2, -2, 2]);
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
hold off;

%
% Dabar nagrinėsime atspindžio operatorių. Galite keisti ašies \overrightarrow{a} =\left(a_x ,a_y \right), kurios atžvilgiu bus daromas atspindys, koordinates (akivaizdu, kad vektorius turi būti nenulinis). MATLAB apskaičiuos atspindžio matricą ir nubraizys grafinį vaizdą (kartu braižomas ir ašies ortas). Atspindžio matrica yra skaičiuojama taip:
% A=I-2\frac{\left\lbrack \begin{array}{c}
% -a_y \\
% a_x
% \end{array}\right\rbrack \left\lbrack \begin{array}{cc}
% -a_y  & a_x
% \end{array}\right\rbrack }{a_x^2 +a_y^2 },
% čia I=\left\lbrack \begin{array}{cc}
% 1 & 0\\
% 0 & 1
% \end{array}\right\rbrack yra vienetinė matrica.

a_x = 3;
a_y = 4;

aa = [a_x; a_y];
aa = aa/norm(aa);

a = [0 -1; 1 0] * aa;

B = eye(2) - 2 * (a * a');

disp('Atspindžio matrica yra: ')
disp(B)

B00 = B*[0;0];
B01 = B*[0;1];
B10 = B*[1;0];
B11 = B*[1;1];

newplot;
clf;
hold on;

plot([0 0 1 1 0],[0 1 1 0 0]);

Vir_x = [B00(1) B01(1) B11(1) B10(1) B00(1)];
Vir_y = [B00(2) B01(2) B11(2) B10(2) B00(2)];
plot(Vir_x,Vir_y);
axis([-2, 2, -2, 2]);
quiver(0,0,aa(1),aa(2),0)

ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

grid on;
hold off;

%
% Pademonstruosime pagrindinę matricų daugybos savybę, t.y. A\;B\not= B\;A. Tam panaudosime anksčiau sugeneruotas posūkio ir atspindžio operatorius. Pavaizduosime, kaip transformuoja šių matricų sandaugos vienetinį kvadratą. Laikysime, kad A yra posūkio matrica, o B yra atspindžio matrica.
% Tarkime, kad pirmą atliekame posūkį, o tada ieškome atspindžio. Tada vienetinį kvadratą veikia sandauga B\;A. Turime tokį vaizdą:

C = B * A;

C00 = C*[0;0];
C01 = C*[0;1];
C10 = C*[1;0];
C11 = C*[1;1];

newplot;
clf;
hold on;

plot([0 0 1 1 0],[0 1 1 0 0]);

Vir_x = [C00(1) C01(1) C11(1) C10(1) C00(1)];
Vir_y = [C00(2) C01(2) C11(2) C10(2) C00(2)];
plot(Vir_x,Vir_y);
axis([-2, 2, -2, 2]);

ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

grid on;
hold off;

% Dabar tarkime, kad pirmą pritaikome atspindžio transformaciją, o tada atliekame posūkį. Tada vienetinį kvadratą veikia sandauga A\;B. Turime tokį vaizdą:

D = A * B;

D00 = D*[0;0];
D01 = D*[0;1];
D10 = D*[1;0];
D11 = D*[1;1];

newplot;
clf;
hold on;

plot([0 0 1 1 0],[0 1 1 0 0]);

Vir_x = [D00(1) D01(1) D11(1) D10(1) D00(1)];
Vir_y = [D00(2) D01(2) D11(2) D10(2) D00(2)];
plot(Vir_x,Vir_y);
axis([-2, 2, -2, 2]);

ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

grid on;
hold off;
clearvars("C", "D")

% Palyginkite gautus vaizdus. Dabar pagrindinė matricų savybė yra akivaizdi!
%
%% II dalis. Determinanto geometrinė interpretacija
% Apskaičiuokime pirmoje dalyje nagrinėtų matricų determinantus:

det(A)
det(B)

% Šiuos rezultatus lengvai galima įrodyti. Siūlome šio kurso klausytojams tai padaryti patiems.
% Dabar pademonstruosime kvadratinės matricos determinanto geometrinę interpretaciją. Kurso klausytojui siūlome pasirinkti sveikąją determinanto reikšmę iš intervalo \left\lbrack -5;5\right\rbrack. MATLAB sugeneruos matricą, kurios determinantas yra jūsų pasirinktas skaičius ir paveiks šia matrica vienetinį kvadratą. Žemiau bus nubraižytas grafinis vaizdas.

d = 2;

C = diag([3 3]);
while det(C) ~= d
    C = randi([-5 5], 2, 2);
end

C00 = C*[0;0];
C01 = C*[0;1];
C10 = C*[1;0];
C11 = C*[1;1];

newplot;
clf;
hold on;

plot([0 0 1 1 0],[0 1 1 0 0]);

Vir_x = [C00(1) C01(1) C11(1) C10(1) C00(1)];
Vir_y = [C00(2) C01(2) C11(2) C10(2) C00(2)];
plot(Vir_x,Vir_y);
axis([-10, 10, -10, 10]);

ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

grid on;
hold off;

%
% Apskaičiuosime gauto lygiagretainio plotą:

Plotas = norm(cross([C10; 0], [C01; 0]));

% Palyginkime lygiagretainio plotą ir determinantą:

disp(['Jūsų pasirinktas determinantas det(C) = ' num2str(d)]);
disp(['Gauto lygiagretainio plotas yra lygus: ' num2str(Plotas)]);

% Taigi matome, kad antros eilės matricos determinanto modulis rodo santykį tarp pradinės ir po transformacijos gautų figūrų plotų. Tas pats galioja ir tūriams trimačiu atveju.
%
%% III dalis. Tikrinės reikšmės ir tikriniai vektoriai
% Dabar panagrinėsime kvadratinės matricos tikrines reikšmes ir tikrinius vektorius. Priminsime, kad tiesinio operatoriaus A tikriniu vektoriumi vadinamas nenulinis vektorius \overrightarrow{\;x}, kuris tenkina sąlygą:
% A\;\overrightarrow{\;x} =\lambda \;\overrightarrow{\;x} \ldotp
% Skaičius \lambda yra vadinamas tikrine reikšme. Sakoma, kad tikrinis vektorius \overrightarrow{\;x} atitinka tikrinę reikšmę \lambda.
% Šioje dalyje mes ištirsime geometrinę tikrinių reikšmių ir vektorių interpretaciją. Tam panaudosime specialaus tipo matricas - simetrines matricas, t.y. tokias, kad A=A^T. Šį matricų tipą mes nagrinėsime todėl, kad jų tikrinės reikšmės visada yra realios. Taip pat apsiribosime 2\times 2 matricomis.
% Žemiau bus sugeneruota 2\times 2 simetrinė matrica D, apskaičiuoti jos tikriniai vektoriai ir tikrinės reikšmes.

d = randi([-5 5], 1, 2);
D = [d(1) d(2); d(2) d(1)]

[vecs, vals] = eig(D);
disp(['Tikrinės reikšmės yra: ' num2str(vals(1, 1)) ' ir ' num2str(vals(2, 2))]);
disp(['Tikriniai vektoriai, atitinkantys tikrinę reikšmę ' num2str(vals(1, 1)) ': (' num2str(vecs(1, 1)) 't; ' num2str(vecs(2, 1)) 't), čia t - bet koks realusis skaičius']);
disp(['Tikriniai vektoriai, atitinkantys tikrinę reikšmę ' num2str(vals(2, 2)) ': (' num2str(vecs(1, 2)) 's; ' num2str(vecs(2, 2)) 's), čia s - bet koks realusis skaičius']);

%
% Galime palyginti, kuo tikriniai vektoriai skiriasi nuo kitų vektorių. Kurso klausytojus siūlome pasirinkti bet kokį vektorių ir paveikti jį aukščiau sugeneruota matrica D. Žemiau bus pavaizduotas tiek pradinis vektorius, tiek jau pavektas tiesiniu operatoriumi D.

v_x = -1;
v_y = 1;

v = [v_x; v_y];

w = D * v;

newplot;
clf;
hold on;

quiver(0,0,v(1),v(2),0)
quiver(0,0,w(1),w(2),0)

ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';

grid on;
hold off;

% Galite matyti, kad pasirinkę tikrinį vektorių \overrightarrow{x}, abu pavaizduoti vektoriai (\overrightarrow{x} ir D\overrightarrow{x}) yra vienoje tiesėje. Tai reiškia, kad egzistuoja toks skaičius \lambda \;kad iš jo padauginę tikrinį vektorių \overrightarrow{x}gausime vektorių D\overrightarrow{x}. Būtent tokią geometrinę prasmę ir turi tikrinės reikšmė ir jas atitinkantys tikriniai vektoriai.
%% Pabandykite patys
% Įrodykite, kad posūkio ir atspindžio matricų determinantai yra atitinkamai 1 ir -1.
% Įrodykite, kad simetrinės 2\times 2 tikriniai vektoriai yra \left\lbrack \begin{array}{c}
% t\\
% t
% \end{array}\right\rbrack ir \left\lbrack \begin{array}{c}
% t\\
% -t
% \end{array}\right\rbrack.
% Atlikite vienetinio kūbo transformaciją su fiksuota determinanto reikšme (braižyti nebūtina). Įsitikinkite, kad gautų tūrių santykis yra lygus transformacijos matricos determinantui.