Witam
Mam do rozwiązania problem modelu drapieznik-ofiara:
\(\displaystyle{ x' = -ax + bxy}\)
\(\displaystyle{ y' = cx - dxy}\)
Napisałem sobie kodzik, który rozwiązuje to w sposób numeryczny. Niestety nie daje zbyt dobrych rozwiazan. Nie jest do konca pewny czy forma w jaka to przeksztalcielm jest poprawna. Oto moj pomysl jak wyliczac kolejne wielkosci populacji:
\(\displaystyle{ x_{n+1} = -ax_{n} + bx_{n}y_{n}}\)
\(\displaystyle{ y_{n+1} = cy_{n} - dx_{n}y_{n}}\)
Czy mógłby ktoś poradzić co zrobic?
Dzieki-- 23 kwi 2011, o 19:49 --
układ równań - równanie Lotki-Volterry
-
ShedirAchird
- Użytkownik

- Posty: 109
- Rejestracja: 8 gru 2009, o 19:59
- Płeć: Mężczyzna
- Lokalizacja: Strzelce Opolskie
- Podziękował: 1 raz
- Pomógł: 19 razy
układ równań - równanie Lotki-Volterry
Hmmm... Skoro
\(\displaystyle{ x' = \frac{dx}{dt} = -ax + bxy}\)
\(\displaystyle{ y' = \frac{dy}{dt} = cx - dxy}\)
To może coś takiego? Najpierw program policzy przyrosty, a potem je doda do wartości funkcji x,y, przy ustalonym \(\displaystyle{ \Delta t}\).
\(\displaystyle{ \Delta x = (-ax + bxy)\Delta t}\)
\(\displaystyle{ \Delta y = (cx - dxy)\Delta t}\)
\(\displaystyle{ x = x + \Delta x}\)
\(\displaystyle{ y = y + \Delta y}\)
I potem znowu policzy przyrosty (dla nowych wartości x, y) i znowu je doda do x,y. I tak w pętli.
Ja już w ten sposób całkowałem numerycznie równania Newtona w c++.
\(\displaystyle{ x' = \frac{dx}{dt} = -ax + bxy}\)
\(\displaystyle{ y' = \frac{dy}{dt} = cx - dxy}\)
To może coś takiego? Najpierw program policzy przyrosty, a potem je doda do wartości funkcji x,y, przy ustalonym \(\displaystyle{ \Delta t}\).
\(\displaystyle{ \Delta x = (-ax + bxy)\Delta t}\)
\(\displaystyle{ \Delta y = (cx - dxy)\Delta t}\)
\(\displaystyle{ x = x + \Delta x}\)
\(\displaystyle{ y = y + \Delta y}\)
I potem znowu policzy przyrosty (dla nowych wartości x, y) i znowu je doda do x,y. I tak w pętli.
Ja już w ten sposób całkowałem numerycznie równania Newtona w c++.
układ równań - równanie Lotki-Volterry
Napisałem sobie taki kod w JAViE. x' uznaje jako następna liczebność populacji. Mógłby ktoś powiedzieć co tu jest nie tak?
Kod: Zaznacz cały
import java.util.List;
import java.util.ArrayList;
public class DrapieznikOfiara {
/*
* dt = 1
* x' = -ax + bxy = x(by - a)
* y' = cy - dxy = y(c - dx)
*/
public static void main(String[] args) {
Double a,b,c,d,h;
Integer x0,y0;
final int SIZE = 10;
a = 0.07;
b = 0.008;
c = 0.01;
d = 0.2;
x0 = 20;
y0 = 20;
h = 1.0;
List<Integer> iloscDrapieznikow = new ArrayList<Integer>();
List<Integer> iloscOfiar = new ArrayList<Integer>();
iloscDrapieznikow.add(x0);
iloscOfiar.add(y0);
for(int i=0; i<SIZE; i++) {
Integer tmpX = iloscDrapieznikow.get(i);
Integer tmpY = iloscOfiar.get(i);
iloscDrapieznikow.add((int)((-a*tmpX + b*tmpX*tmpY)/h));
iloscOfiar.add((int)((c*tmpY - d*tmpX*tmpY)/h));
}
for(int i=0; i<SIZE; i++) {
System.out.println(i + ": " + iloscDrapieznikow.get(i) + " " + iloscOfiar.get(i));
}
}
}-
ShedirAchird
- Użytkownik

- Posty: 109
- Rejestracja: 8 gru 2009, o 19:59
- Płeć: Mężczyzna
- Lokalizacja: Strzelce Opolskie
- Podziękował: 1 raz
- Pomógł: 19 razy
układ równań - równanie Lotki-Volterry
A jest nie tak? Kurcze... nie znam się na Javie, ale typy zmiennych są wszędzie takie same. Coś, co mi się rzuca w oczy, to typ zmiennych wielkości populacji x i y, które przyjąłeś za integer. Czy one nie powinny być także double? Model Lotki - Volterry przecież nie jest układem równań z wartościami dyskretnymi (jak liczby całkowite opisujące stan populacji w rzeczywistości), a zmiana populacji w czasie jest ciągła - czyli zarówno x(t) jak i y(t) są ciągłe z ciągłą pierwszą pochodną. Oczywiście, ze względu na to, że to symulacja komp. nie uzyskasz funkcji ciągłych, ale integer a double to jest różnica.
układ równań - równanie Lotki-Volterry
Ok zaraz przetestuje. A wiesz dla jakich parametrow startowych to zadanie daje np wynik ze populacja bedzie okresowa/bedzie wymierajaca itd (chodzi mi o: a b c d x0 y0 h)
Dzieki
Dzieki
