|
|
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
|
実行結果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
|
戻る
|