Strona 1 z 1

układ równań - równanie Lotki-Volterry

: 23 kwie 2011, o 19:49
autor: kizdas
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

: 23 kwie 2011, o 23:09
autor: ShedirAchird
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++.

układ równań - równanie Lotki-Volterry

: 24 kwie 2011, o 22:49
autor: kizdas
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));
		}
		
	}
}

układ równań - równanie Lotki-Volterry

: 25 kwie 2011, o 00:02
autor: ShedirAchird
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

: 25 kwie 2011, o 00:31
autor: kizdas
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