zad 1
Zbudować czytelny model Lotki-Volttery używając pakietu Simulink. Każdą z linii sygnałowych oraz każdy blok opisać stosując oznaczenia występujące w równaniach zawartych we wprowadzeniu. Proszę nie używać bloków tworzących podsystemy. W celu mnożenia sygnałów użyć bloku ‘Product’ z grupy Math Operations.
Część dotycząca rozwiązań czasowych:
Wprowadzić zadane parametry modelu r, a, b, s dla podanych warunków początkowych P0,V0. Przeprowadzić symulację dla zadanego czasu tÎ[0,Tmax], wykreślić przebiegi czasowe dla P i V na jednym wykresie dla podanego zestawu warunków początkowych.
Stosując te same parametry co powyżej wyznaczyć numerycznie rozwiązania czasowe dla modelu Lotki-Volterry oraz sporządzić ich wykresy (zastosować funkcj_ę ode45). Porównać wykresy z zad. 2 i 3.
Część dotycząca portretu fazowego:
Wykreślić portret fazowy na płaszczyźnie (V,P) dla wszystkich zestawów warunków początkowych (łącznie 10 trajektorii, zastosować blok ‘XYGraph’ lub wyeksportować dane do przestrzeni roboczej Matlaba i tam stworzyć wykres, model Simulinka można uruchamiać z poziomu skryptu za pomocą komendy sim nazwa_modelu).
Wyznaczyć analitycznie rozwiązania stacjonarne modelu i znaleźć ich wartości na portrecie fazowym.
Rozwiązując całkę pierwszą znaleźć równanie określające powierzchnię stanów f(V,P). Sporządzić wykres tej powierzchni oraz jej poziomice określające konkretne trajektorie fazowe (pomocne funkcje meshgrid oraz contour). Porównać portrety fazowe otrzymane w zad. 4 i 6.
function dy = LotkaVolterra(t, y)
global a b r s
dy=zeros(2,1);
% y(1) <-> V
% y(2) <-> P
dy(1) = r*y(1) - a*y(1)*y(2); % ofiara dV/dt
dy(2) = b*y(1)*y(2) - s*y(2); % drapieżca dP/dt
function dy = LotkaVolterra(t, y, a, b, r, s)
dy=zeros(2,1);
% y(1) <-> V
% y(2) <-> P
dy(1) = r*y(1) - a*y(1)*y(2); % ofiara dV/dt
dy(2) = b*y(1)*y(2) - s*y(2); % drapieżca dP/dt
close all;clear all;
t_max = 200;
colours = 'rgbcymkbrg';
global a b r s
a = 0.005;
b = 0.001;
r = 0.1;
s = 0.1;
P_0 = 20;
V_0 = 45;
i = 1; % przebiegi czasowe rysujemy tylko dla jednej wartości V_0
sim lab_4_zad_1_model;
figure(1);
plot(tout, V, 'g', tout, P, 'r');
xlabel('czas'); ylabel('ilosc zwierzatek');
legend('ofiary', 'drapiezniki');
title('wykres z simulinka');
[t, y] = ode45(@LotkaVolterra, [0, t_max], [V_0, P_0]);
figure(2);
plot(t, y(:, 1), 'g', t, y(:, 2), 'r');
xlabel('czas'); ylabel('ilosc zwierzatek');
legend('ofiary', 'drapiezniki');
title('wykres na podstawie obliczen funkcja ode45');
V_0 = 5:10:100; % wektor wartości V_0 do rysowania portretów fazowych
figure(3);
hold on
for i = 1:length(V_0)
sim lab_4_zad_1_model;
plot(V, P, colours(i));
end;
xlabel('V'); ylabel('P');
title('Portrety fazowe na podstawie simulinka');
hold off
[V, P] = meshgrid(1:500, 1:100);
C = b*V + a*P - s*log(V) - r*log(P);
figure(4);
contour(C);
title('Portrety fazowe na podstawie pierwszej calki');
zad 2.
Zbudować czytelny model drapieżnik-ofiara z ograniczoną pojemnością środowiska dla ofiar w Simulinku.
Przeanalizować zachowanie modelu dla różnych wartości parametru K.
Wyznaczyć analitycznie punkty równowagi modelu oraz wartość K, dla której układ zmienia swoją dynamikę.
Sporządzić wykresy fazowe i przebiegi czasowe liczebności populacji dla różnych wartości K – jakie tendencje zachowaniu modelu zauważyłaś/eś?
function dy = LotkaVolterrazK(t, y, a, b, r, s, K)
dy=zeros(2,1);
% y(1) <-> V
% y(2) <-> P
dy(1) = r*y(1) - (r*y(1)*y(1))/K - a*y(1)*y(2); % ofiara dV/dt
dy(2) = b*y(1)*y(2) - s*y(2); % drapieżca dP/dt
close all;clear all;
t_max = 200;
K = [30, 100, 300];
colours = 'rgbcymkbrg'
a = 0.005;
b = 0.001;
r = 0.1;
s = 0.1;
P_0 = 20;
V_0 = 45;
for i = 1:3
sim lab_4_zad_2_model;
figure(1);
plot(tout, V, 'g', tout, P, 'r');
xlabel('czas'); ylabel('ilosc zwierzatek');
legend('ofiary', 'drapiezniki');
title('wykres z simulinka');
[t, y] = ode45(@LotkaVolterrazK, [0, t_max], [V_0, P_0], [], a, b, r, s, K(i));
figure(2);
plot(t, y(:, 1), 'g', t, y(:, 2), 'r');
xlabel('czas'); ylabel('ilosc zwierzatek');
legend('ofiary', 'drapiezniki');
title('wykres na podstawie obliczen funkcja ode45');
end;