% 4. gyakorlat
% Lotka-Volterra populáció dinamikai rendszerek
% általános alak: 
% dx=x*(xb-xd*x+xi*y)
% dy=y*(yb-yd*y+yi*x)
% x, y = fajok mennyisége
% xb, yb =pl. szaporodási/halálozási ráta ráta
% xd, yd =pl. erõforrás korlát
% xi, yi = interakció x és y közt

%
% A: klasszikus (leegyszerûsített) ideális ragadozó-áldozat eset: oszcilláció 
% dx=x*(-4+y) 
% dy=y*(3-x)
% paraméterek:
xb=;
xd=;
xi=;
yb=;
yd=;
yi=;
%határok:
max_pontx=;
max_ponty=;
min_pont=;
lepes=; %felbontás
tint=[0 10];%idõintervallum
%}

%{
% B: klasszikus ragadozó-áldozat eset kis megzavarással: stabil egyensúly 
% dx=x*(-4+y) 
% dy=y*(3-0.1y-x)
% paraméterek:
xb=;
xd=;
xi=;
yb=;
yd=;
yi=;
%határok:
max_pontx=;
max_ponty=;
min_pont=;
lepes=; %felbontás
tint=[0 100];%idõintervallum
%}

%{
% C: valósabb ragadozó-áldozat eset: kis növényevõ populáció már nem életképes  
% dx=x*(-4-3x+7y) 
% dy=y*(-1+2y-x)
% paraméterek:
xb=;
xd=;
xi=;
yb=;
yd=;
yi=;
%határok:
max_pontx=;
max_ponty=;
min_pont=;
lepes=; %felbontás
tint=[0 100];%idõintervallum
%}

%{
% D: versengés 
% dx=x*(8-x-3y) 
% dy=y*(5-y-x)
% paraméterek:
xb=;
xd=;
xi=;
yb=;
yd=;
yi=;
%határok:
max_pontx=;
max_ponty=;
min_pont=;
lepes=; %felbontás
tint=[0 10];%idõintervallum
%}

x=min_pont:lepes:max_pontx;% vizsgált pontok
y=min_pont:lepes:max_ponty;% vizsgált pontok

figure;

%
% 1.: vektormezõ
% rácspontok meghatározása x, y vektorokból:
[X,Y]=meshgrid(x,y);
% a vektormezõ gradiensének kiszámítása minden rácspontban
dx=; 
dy=;
l=;
%dx=dx./l; % 1-re normálás
%dy=dy./l;
% a vektormezõ ábrázolása (quiver függvény):
quiver(X,Y,dx, dy, 'k');
% x és y változásának kiszámítása minden X,Y rácspontban, és a kapott vektor ábrázolása az X,Y pontból kiindulva
%}

%2. dx=0 vagy dy=0 egyenesek ábrázolása
y0=; %xb-xd*x+xi*y=0 egyenes egyenlete
x0=;%yb-yd*y+yi*x=0 egyenes egyenlete
hold on; %trajektóriák egymásra rajzolásához
plot(); %dx=0 vagy dy=0 egyenesek ábrázolása
%xlim([-0.1, max_pontx]); %határok a megjelenítéshez
%ylim([-0.1, max_ponty]);
title(['egyenletek: dx=x*(',num2str(xb),'+',num2str(xd),'*x+',num2str(xi),'*y); dy=y*(',num2str(yb),'+',num2str(yd),'*y+',num2str(yi),'*x)']); %ábra cím
xlabel('x mennyisége'); %tengelyfeliratok
ylabel('y mennyisége');
legend('a vektormezõ gradiense az adott pontokban', ['dx=0 <-  ',num2str(xb),'+',num2str(xd),'*x+',num2str(xi),'*y=0'],'dx=0 <-  x=0', ['dy=0 <-  ',num2str(yb),'+',num2str(yd),'*y+',num2str(yi),'*x=0'], 'dy=0 <-  y=0');

%
%3. több trajektória kirajzolása az X,Y pontokból indulva:
sx=reshape(X, 1, length(x)*length(y)); % a pontok x koordinátái egy sorvektorba rendezve (könnyebb végigiterálni rajta)
sy=reshape(Y, 1, length(x)*length(y)); % a pontok y koordinátái egy sorvektorba rendezve (könnyebb végigiterálni rajta)

for i=1:length(sx) 
    xy0=[sx(i); sy(i)]; % egyenlet kiszámítása az adott kezdeti pontból (a hold on engedi a trajektóriák egymásra rajzolását)
    [t, xy] = ode45(); %egyenlet kiszámítása
    
    h=plot(xy(:,1),xy(:,2), 'g');
    
    %{
    % a szeparatrix (2 egyensúlyi pontot szeparáló görbe) kirajzolás (C): ha az egyik egyensúlyi ponthoz van közel a trajektória végpontja, az egyik, ha a másikhoz, akkor a másik színnel ábrázolom a pályát 
    if  % a trajektória végpontjának y koordinátája megyik egyensúlyi ponthoz esik közel
        h=plot();
    elseif 
        h=plot();
    end
    %}  
    h.Annotation.LegendInformation.IconDisplayStyle = 'off'; %a legend-ben ne jelenjenek meg
end
%}

hold off;