% 1. gyakorlat: mátrix hatványozás:
%{
dt = 0.1; %idõbeli lépésköz
dx = 1; %térbeli lépésköz
D=1; %diffúzió sebessége %ezt változtassuk most

% a rendszer elszáll, ha:
%D*2*dt/dx^2>1
%a diffúziós rendszer mátrix alakban:
a=D*dt/dx^2;
b=1-2*D*dt/dx^2;
%mx=[b a 0 0; a b a 0; 0 a b a; 0 0 b a]; %kis mx-ot kézzel is be lehet írni, de a nagyot már nem
meret=20;
hatvanyok=800;
mx=diag(b*ones(meret,1),0)+diag(a*ones(meret-1,1),1)+diag(a*ones(meret-1,1),-1); %a diffúziós  mátrix elõállítás
%mx(1,1)=1-a; %Neumann határ
%mx(end,end)=1-a; %Neumann határ
mx(1, end)=a; %periodikus határ
mx(end,1)=a; %periodikus határ
[sajatvectorok, sajatertekek]=eig(mx); %sajátérték számítás

cc_vect_init=zeros(meret,1); %kezdeti vektor, amire a mátrix hat
cc_vect_init(8:13)=1; % kiindulási koncentráció eloszlás
mxhatv=mx^hatvanyok; %hatványozom a mátrixot
[hatvsajatvectorok, hatvsajatertekek]=eig(mxhatv);
cc_vect_final=mxhatv*cc_vect_init; %végsõ cc

figure;
%lépésenként számolva a folyamatot:
cc_vect=cc_vect_init; 
se=zeros(meret,hatvanyok);

for sz=1:hatvanyok 
mxhatv=mx^sz; %hatvanyozom a Perron-Frobenius mátrixot
sajatertekek=eig(mxhatv);
se(:,sz)=sajatertekek; %sajátértékeket mindig eltárolom
cc_vect=mx*cc_vect;

imagesc(mxhatv) %ábrázolom a mátrixot
%imagesc(cc_vect) %ábrázolom a cc változásokat
caxis([0,1]); %a színskála határainak fixálása (egyébként automatikusan módosul a skála a legnagyobb és legkisebb érték közé)
title(['hatvány: ', num2str(sz)])
waitforbuttonpress;
pause(0.1)
end

figure;
plot(1:hatvanyok, se, '.b'); %ábrázolom a sajátértékeket, ezek jellemzik a mátrixot (az abszolútértékben maximális leginkább) 
xlim([1, hatvanyok]);
xlabel('hatványok');
ylabel('sajátértékek');
title('A mátrix sajátértékeinek alakulása a hatványozással.');

% legnagyobb sé-hez csupa 1-es sv tartozik, ez lesz domináns
% hatványozással~ idõ múlással, ezért van kiegyenlítõdés a folyamat elõre haladtával
% a kis sé-hez tartozó sv gyakran vált elõjelet, oszcillál, de ez hamar
% eltûnik, lecseng a hatványozásnál
%a<0.5, akkor max sé 1 (anyagmegmaradásos esetben), minimális -1-nél nagyobb, a max dominál hatványozásnál a többi eltûnik hatványozással
%(ha a=0.5, akkor +- -ban 1 erõs hullám szõrösödik ez 2 tag marad meg legtovább hatványozással, szimmetria 
%a>0.5, akkor max sé 1 (anyagmegmaradásos esetben), minimális -1-nél kisebb, ez száll el hatványozással, oszcillálva, ez a domináns
%}


%
% nem minden mátrix egyenlítõdik ki!
mx=[0 0 0 1; 1 0 0 0; 0 1 0 0; 0 0 1 0] %hatványozáskor ciklikusan magába visszatérõ mx
vect_init=[1; 2; 3; 4];
%mx=[0 1; 1 1]; %Fibonacci mx: mértani sorozat szerint nõ
%vect_init=[1; 0] %Fibonacci kezdeti feltétel: 1 pár fiatal állat
%mx=[0 1 0 1; 1 0 0 0; 0 1 0 0; 0 0 1 0] %visszatér magába ciklikusan + mértani sorozat szerint nõ is
se=eig(mx)

figure;

for i=1:20
    i
   mxhatv=mx^i
   vect_akt=mxhatv*vect_init
   vect_akt(2)/vect_akt(1)
   se_hatv=eig(mxhatv)
   
   imagesc(mxhatv) %ábrázolom a mátrixot
   caxis([0,1]);%
   title(['hatvány: ', num2str(i)])
   waitforbuttonpress;
   pause(0.1)
end
%}