捕食関係


戻る
LotkaVolterraクラス

まずロトカ・ボルテラモデルの定数を保存したり、実行結果を返すようなLotkaVolterraクラスを 考える。



の方程式よりa,b,c,dの定数を保存し、dx/dt,dy/dtの値を返すメソッドを作る。 けれど、このままでは定数の数が多いので、後々楽にするために定数をたかだか1つするため 式を変型する。x,y,tを以下の様におきかえて式を変型させる。


(1)


(2)


とおくと、 式は以下のようになる。



この式は結局(1)、(2)の式においてa = 1,b = 1,c = m,d = mとおいたのと同じなので、この性質を利用して 以下のようなクラスを作製した。


プログラムソース:
class LotkaVolterra{
        double a, b, c, d;

        LotkaVolterra(double a, double b, double c, double d){
                this.a = a;
                this.b = b;
                this.c = c;
                this.d = d;
        }

        LotkaVolterra(double m){
                settingM(m);
        }

        void settingM(double m){
                a = 1.0;
                b = 1.0;
                c = m;
                d = m;
        }

        double dxdt(double x, double y){
                return a * x - b * x * y;
        }

        double dydt(double x, double y){
                return -c * y + d * x * y;
        }
}


last update 2006/08/31

実装例

時間によって被捕食者と捕食者の増減を実現するには以下の演算をくり返す。

(LotkaVolterra lotkaVolterra = new LotkaVolterra(a,b,c,d);で生成)

dxdt = x + lotkaVolterra.dxdt(x,y);
dydt = y + lotkaVolterra.dydt(x,y);
x = dxdt;
y = dydt;
t++;


a,b,c,dを使う場合はその定数がx,yの増減がおかしくならないように自由に設定できる。 だが、mを使う場合は例えばm = 1, x = 20, y =10とすると

dx/dt = 20 - 20 * 10 = -180

となり、なんかおかしくなる。なのでこの場合はx,yを増減がおかしくならないように設定する。 また、その増減にあわせて時間幅も調整して変化の様子を見やすくする。

(LotkaVolterra lotkaVolterra = new LotkaVolterra(m);で生成)
A : 時間幅

dxdt = x + A * lotkaVolterra.dxdt(x,y);
dydt = y + A * lotkaVolterra.dydt(x,y);
x = dxdt;
y = dydt;
t = t + A;


プログラムのある時間におけるx,yのデータはgnuplotで描けるような形式にして data1.txtファイルにかきこんでいます。gnuplotで、
plot "data1.txt" using 1:2 with lines, "data1.txt" using 1:3 with lines
と入力すれば増減の様子が見れます。


プログラムソース:
public class DataOutput{

	public static void main(String argv[]){
		double m = 0.5;
		double x = 2.0, y = 1.0;
		double A = 0.001;
		double count = 50;
		double t = 0, dxdt, dydt;
		LotkaVolterra lotkaVolterra = new LotkaVolterra(m);
		PrintWriter dataOutput = null;

		try {
			dataOutput = new PrintWriter(
				new BufferedWriter(
					new FileWriter("data1.txt")));
			dataOutput.println("# t X Y");

			while (t < count){
				dxdt = x + A * lotkaVolterra.dxdt(x,y);
				dydt = y + A * lotkaVolterra.dydt(x,y);

				dataOutput.print(t);
				dataOutput.print(" ");
				dataOutput.print(dxdt);
				dataOutput.print(" ");
				dataOutput.println(dydt);

				x = dxdt;
				y = dydt;
				t = t + A;
			}
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			try {
				dataOutput.close();
			} catch (Exception et) { }
		}
	}
}


last update 2006/08/31

実行結果1

m = 1.0, x = 2.0に固定し、yを1.0から3.0に変化させた時の変化の様子。
(赤線が被捕食者x,緑線が捕食者y)

y = 1.0


y = 2.0


y = 3.0


last update 2006/08/31

実行結果2

x = 2.0, y = 1.0に固定し、mを0.5から2.0に変化させた時の変化の様子。
(赤線が被捕食者x,緑線が捕食者y)

m = 0.5


m = 1.0


m = 2.0


last update 2006/08/31

実行結果3

x軸に被捕食者、y軸に捕食者をとれば、増減の軌道が分かる。 軌道は閉じているので、被捕食者と捕食者はいずれも増減をくり返すが、 片方が死滅することはない。

赤線 x = 2.0, y = 1.0, m = 0.5
緑線 x = 2.0, y = 2.0, m = 0.5


赤線 x = 2.0, y = 1.0, m = 2.0
緑線 x = 2.0, y = 2.0, m = 2.0


赤線 x = 2.0, y = 1.0, m = 0.5
緑線 x = 2.0, y = 1.0, m = 2.0


last update 2006/08/31

戻る