% 10. gyakorlat
% Turing morfogenezis klasszikus példája:
% dU/dt= 4*U+2*V+1*dU^2/dx^2
% dV/dt= -8*V-26*U+17*dV^2/dx^2
% 2 anyag hat egymásra [0 pi] tarományon -> kölcsönhatásukból stabil gradiens alakul ki -> mintázat 
% 2 gradiens metszéspontja: pi/2 pontnál van (oszcillálva áll be ide)
%feltételek mintázat képzõdéshez:
% a két diffúzió nem lehet egyforma gyors
% nem lehet szimetrikus az [a, b; c, d] mátrix 
% legalább 2D-s rendszer kell (u,v)

% Feladatok, kérdések:
% Implementáljuk a klasszikus Turing rendszert.
% Mit tapasztalunk, hogy viselkedik a rendszer?
% Mennyire érzékeny a rendszer a paraméterekre? 
% Más a b c d paraméterekkel is kialakul a mintázat? 
% Mit tapasztalunk a Dv diffúziós paramétert változtatva? Mikor kezd megjelenni a stabil mintázat?
% Mennyire érzékeny a rendszer a kezdeti állapotra? 

dt =; %idõbeli lépésköz %D*2*dt/dx^2<1 % lassan, pontosan számolt diffúzió 
dx =; %térbeli lépésköz

x =; %viszgált pontok az egyenesen [0 pi]
nx = length(x);
nt = 200000; %idõtartomány vége

%diffúziós együtthatók: diffúzió sebessége
%a diffúzió destabilizál
Du=;
Dv=;

% kölcsönhatások, hatások együtthatói:
a=;   %u hat u-ra
b=;   %v hat u-ra
c=;  %v hat v-re
d=; %u hat v-re

u =; %az u anyag kezdeti értékei (-1)
u()=; %kezdeti inhomogenitás (1 az 1. negyedében)
v =; %a v anyag kezdeti értékei (0)

%
% skálázott színek a mintázathoz az adott idõpontban, colormap-et definiál
pic=zeros(1, nx, 3); %3D-s rgb colormap (piros és kék színek kombinációi)
pic(:,:,1)=(u'+1)/2; %piros (0 1 közé skálázzuk az értékeket)
pic(:,:,3)=(v'+1)/2; %kék (0 1 közé skálázzuk az értékeket)

%a végén megjelenített összesítõ szín kép: az egész folyamatot mutatja
bigpic=zeros(nt+1,nx,3);
bigpic(1,:,1)=(u'+1)/2;
bigpic(1,:,3)=(v'+1)/2;
%}

%ábrázolás:
figure;
subplot(2,1,1);
%kezdeti érték rajzol:
plot(x, u, 'r', x, v, 'b'); 
grid(gca, 'minor');
   % ylim([-50 50]); %ha nem akarod, hogy ugráljon a y tengely (a folyamat eleje kevésbé látszik)
    xlim([0 pi]);
    
subplot(2,1,2)
image(pic); %a 3D-s rgb mátrix színes képként kirajzolása (ez magának a gradiensnek a képe)

    waitforbuttonpress;
    
for t = 1:nt %minden idõpillanatban
    u2 = u; %u2 = értékek az elõzõ idõplillanatban; u = új értékek
    v2 = v; %v2 = értékek az elõzõ idõplillanatban; v = új értékek
    
    for i = 1:nx %minden pontban kiszámolom az aktuális értékét
    
    % Neumann perem    
    
                % Turing egyenletek: 
                u(i) =; %dU/dt=a*U+b*V+D*dU^2/dx^2 % U függõ+ V függõ +diff tag
                v(i) =; %dV/dt=c*V+d*U+D*dV^2/dx^2 % V függõ+ U függõ +diff tag
    end
    
    %ábrázol:
    if mod(t, 100)==0 %minden x. lépésben ábrázolunk csak (gyorsítás)
    subplot(2,1,1)
    plot(x, u, 'r', x, v, 'b');
    grid(gca, 'minor');
    %ylim([-50 50]); %ha nem akarod, hogy ugráljon a y tengely (a folyamat eleje kevésbé látszik)
    xlim([0 pi]);
    title(['lépés: ', num2str(t)]);
    
    %
    subplot(2,1,2)
    pic(:,:,1)=min(1, max(0, (u'+1)/2)); % (0 1) közé szorítjuk az értékeket, mert elszáll a  rendszer (egyre nagyobbak, kisebbek a gradiensek)
    pic(:,:,3)=min(1, max(0, (v'+1)/2));
    image(pic);
    %}
    
    %waitforbuttonpress;
     pause(0.01);
    end
     
    bigpic(t+1,:,1)=min(1, max(0, (u'+1)/2)); % (0 1) közé skálázva értékek, mert elszáll a  rendszer
    bigpic(t+1,:,3)=min(1, max(0, (v'+1)/2));
end

% a mintázat alakulása az idõben:
figure;
image(bigpic);
ylabel ('idõ');