Strona główna » Algorytmy » Artykuły » Klasyczny model Lotki-Volterry

Klasyczny model Lotki-Volterry

Wstęp

Klasyczny model Lotki-Volterry dotyczy zależności pomiędzy populacjami gatunku drapieżcy oraz ofiar. Przy pomocy równania jesteśmy w stanie wyznaczyć jak zmieni się liczba drapieżców i ofiar w kolejnych miesiącach.

Przyjmijmy, że liczebność drapieżcy oznaczymy przez , a populację gatunku ofiar przez, wtedy:

Parametrami modelu są tutaj współczynniki: a – współczynnik przyrostu liczby ofiar, b – współczynnik zjadanych ofiar oraz c – współczynnik umierania wilków

Przykład

Przyjmijmy teraz, że będziemy rozpatrywać populację kotów i myszy. Przyjmijmy, że na początku mamy On = 40 myszy i Dn = 40 kotów. Przyjmijmy parametry: a = 0,09, b = 0,0025 i c = 0,22.

Wiadomo, że liczba zwierząt musi być całkowita, ale w przypadku obliczeń matematycznych możemy przyjąć, że wartości mogą należeć do liczb rzeczywistych. Wtedy liczba populacji gatunków w kolejnych miesiącach przedstawia się następująco:

(podane liczby zostały zaokrąglone do całkowitych w dół)

MiesiącMyszy (szt.)Koty (szt.)Wykres do zadania
010040Wykres
19941
29742
39643
49444
59245

Zadanie

Wczytaj z pliku parametry.txt kolejno podane parametry a, b, c oraz wartość populacji początkowych (najpierw drapieżców potem ofiar) i wykonaj poniższe zadania. Zakładamy, że do obliczeń używamy liczb rzeczywistych, ale w odpowiedzi należy podać liczby zaokrąglone w dół.

  1. Podaj populację gatunku drapieżcy i ofiar po 5 latach (60 pełnych miesiącach).
  2. Podaj jaka była najmniejsza liczebność drapieżców w ciągu 20 lat.
  3. Podaj kiedy populacja myszy wyniesie 90 sztuk?
  4. Miesięczną liczebność populacji ofiar i drapieżców z dokładnością do dwóch miejsc po przecinku przez 10 lat zapisz do pliku tekstowego populacja.txt
    1. Na podstawie danych z pliku utwórz wykres używając dowolnego programu.
    2. Opisz wykres.

Przykład pliku

Przykładowa zawartość pliku:

  1. 0.09 0.0025 0.22 40.0 100.0

Sugerowany styl odpowiedzi do podpunktu 4.:

  1. 0 100,00 40,00
  2. 1 99,00 41,20
  3. 2 97,71 42,33
  4. 3 96,17 43,36
  5. 4 94,40 44,25

Rozwiązanie

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;

W programie wykorzystamy bibliotekę do wypisywania na konsolę iostream oraz będziemy wczytywać / zapisywać dane do pliku, więc potrzebujemy biblioteki fstream. Oczywiście będziemy używać standardowej przestrzenie nazw std.

  1. int main () {
  2.   ifstream file("parametry.txt");
  3.   if(file.good()){

(5.) Deklarujemy funkcję main() i (6.) otwieramy strumień z plikiem parametry.txt. (7.) Na pliku działamy tylko, gdy strumień jest prawidłowy.

  1.     double a, b, c, O, D;
  2.     file >> a >> b >> c >> O >> D;

(8.) Deklarujemy zmienne do przechowania parametrów i początkowej ilości ofiar oraz drapieżców. (9.) Wczytujemy dane z pliku.

  1.     double Dn = D, On = O, Dn2, On2;
  2.     for(int i = 1; i<=60; i++){
  3.       On2 = On + a*On - b*On*Dn;
  4.       Dn2 = Dn + b*On*Dn - c*Dn;
  5.       On = On2;
  6.       Dn = Dn2;
  7.     }
  8.     cout &lt;< "Po 6m\n
  9.     cout << "populacja myszy: " << (int)(On);
  10.     cout << "\npopulacja drapiezcow: " << (int)(Dn);

(10.) Kopiujemy wartości zmiennych początkowych. (11.) Dla kolejnych 60 miesięcy: (12., 13.) obliczamy obydwie populacje zgodnie z równaniem i (14., 15.) przepisujemy jako wynik ostateczny. Nie możemy pominąć tego, ponieważ przy wyliczaniu obu populacji potrzebujemy Dn i On niezmienione. (17. - 19.) Wypisujemy wynik działania funkcji.

  1.     double min = D;
  2.     Dn = D, On = O;
  3.     for(int i = 1; i<=12*20; i++){
  4.       On2 = On + a*On - b*On*Dn;
  5.       Dn2 = Dn + b*On*Dn - c*Dn;
  6.       On = On2;
  7.       Dn = Dn2;
  8.       if(Dn < min)
  9.         min = Dn;
  10.     }
  11.     cout << "\n\nPrzez 10 lat najmniejsza populacja ";
  12.     cout << "drapieznikow: " << (int)(min) << " sztuk";

(20.) Przyjmujemy, że najmniejszą populacja była przed pierwszym miesiącem. (21.) Przywracamy zmiennym wartości pierwotne. (22.) Dla kolejnych 20 lat wyliczamy: (23., 24.) kolejne wartości populacji i (23., 24.) aktualizujemy oficjalne wartości. (27.) Jeśli wyliczona ilość drapieżników jest mniejsza od aktualnego minimum min to (28.) aktualizujemy wartość minimalną. (30., 31.) Wypisujemy wynik do podpunktu 2.

  1.     int i = 1;
  2.     Dn = D, On = O;
  3.     do{
  4.       On2 = On + a*On - b*On*Dn;
  5.       Dn2 = Dn + b*On*Dn - c*Dn;
  6.       On = On2;
  7.       Dn = Dn2;
  8.       i++;
  9.     } while((int)On!=90);
  10.     cout << "\n\nPopulacja myszy ponownie wyniosla 100";
  11.     cout << "sztuk w " << i << " miesiacu";

(32.) Tym razem deklarujemy zmienną i poza pętlą. Dzięki temu w momencie zatrzymania wyliczania wiemy na którym miesiącu się zatrzymaliśmy. (33.) Resetujemy aktualne wartości populacji. (35. - 38.) Wyliczamy ponownie wartości populacji dla n-tego miesiąca i (39.) zwiększamy, który to miesiąc. (40.) Wyliczanie przerywamy kiedy wyliczona populacja ofiar (zaokrąglona w dół!) wynosi 90. (41. - 42.) Wypisujemy na którym miesiącu się zatrzymaliśmy.

  1.     ofstream ofile("populacja.txt");
  2.     if(ofile.good()){
  3.       Dn = D; On = O;
  4.       ofile << "Miesiac  Ofiary  Drapiezcy\n0  ";
  5.       ofile << O << "  " << D;
  6.       for(int i = 1; i<=12*10; i++){
  7.         On2 = On + a*On - b*On*Dn;
  8.         Dn2 = Dn + b*On*Dn - c*Dn;
  9.         On = On2;
  10.         Dn = Dn2;
  11.         ofile << "\n" << i << "  ";
  12.         ofile << (double)(int)(On*100)/100 << "  ";
  13.         ofile << (double)(int)(Dn*100)/100;
  14.       }
  15.     }
  16.     ofile.close();

(43.) Otwieramy strumień do pliku zapisu. (44.) Jeśli otworzenie pliku się powiedzie to: (45.) Resetujemy wyliczone wartości populacji. (46., 47.) Do pliku zapisujemy nagłówki kolumn i pierwszy wiersz dla "miesiąca 0". (48.) Dla każdego miesiąca kolejnych 12 lat (49., 50.) wyliczamy wartość populacji n-tego miesiąca i (51., 52.) zatwierdzamy wyniki. (53. - 55.) Zapisujemy wyniki do pliku. Po zakończeniu obliczeń (58.) Zamykamy dostęp strumienia do zapisywania danych w pliku.

  1.   }
  2.   file.close();
  3.   system("pause");
  4.   return 0;
  5. }

(60.) Zamykamy strumień otwartego pliku z argumentami. (61.) Czekamy na interakcję użytkownika i (62.) kończymy działanie programu zwracając sukces.