/*
* -------------------------------------------------------------------------
* $Id: PredatorPrey.java,v 1.9 2004/09/01 18:07:54 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
*
* This software is confidential information which is proprietary to
* and a trade secret of Visual Numerics, Inc. Use, duplication or
* disclosure is subject to the terms of an appropriate license
* agreement.
*
* VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
* NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
* ITS DERIVATIVES.
*--------------------------------------------------------------------------
*/
package com.imsl.demo.javagrande;
import com.imsl.chart.*;
import com.imsl.math.*;
import com.imsl.IMSLException;
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class PredatorPrey extends Applet
implements MouseListener, MouseMotionListener {
private Chart chart = null;
private AxisXY axis;
static private final int npoints = 100;
private double rabbits[], foxes[];
private double point[] = {1,3};
private double initialRabbit[] = {1};
private double initialFox[] = {3};
private Data dataSolved;
private Data dataError;
private int numberSolved;
private void solve() throws IMSLException {
OdeRungeKutta.Function f = new OdeRungeKutta.Function() {
public void f(double t, double y[], double yprime[]) {
yprime[0] = 2.0*y[0] - 2.0*y[0]*y[1];
yprime[1] = -y[1] + y[1]*y[0];
}
};
OdeRungeKutta q = new OdeRungeKutta(f);
double dt = 10.0/(npoints-1);
for (int k = 0; k < npoints; k++) {
q.solve(k*dt, (k+1)*dt, point);
rabbits[k] = point[0];
foxes[k] = point[1];
}
numberSolved++;
}
public void init() {
rabbits = new double[npoints];
foxes = new double[npoints];
try {
solve();
} catch (Exception exception) {
System.out.println(exception);
return;
}
chart = new Chart(this);
chart.getChartTitle().setTitle(new Text("Predator Prey Problem"));
axis = new AxisXY(chart);
axis.setAutoscaleInput(AxisXY.AUTOSCALE_OFF);
axis.getAxisX().setWindow(0.0, 5.0);
axis.getAxisY().setWindow(0.0, 5.0);
axis.getAxisX().getAxisTitle().setTitle("Rabbits");
axis.getAxisY().getAxisTitle().setTitle("Foxes");
Data data = new Data(axis, rabbits, foxes);
data.setDataType(Data.DATA_TYPE_LINE|Data.DATA_TYPE_MARKER);
data.setMarkerType(Data.MARKER_TYPE_FILLED_SQUARE);
data.setMarkerSize(0.75);
data.setMarkerColor(Color.blue);
data.setLineColor(Color.blue);
data = new Data(axis, initialRabbit, initialFox);
data.setDataType(Data.DATA_TYPE_MARKER);
data.setMarkerType(Data.MARKER_TYPE_FILLED_CIRCLE);
data.setMarkerSize(1.5);
data.setMarkerColor(Color.red);
double px[] = {2.5};
double py[] = {4.7};
dataSolved = new Data(axis, px, py);
dataSolved.setLabelType(Data.LABEL_TYPE_TITLE);
dataSolved.setTitle("solved 1 ODE");
dataSolved.setTextColor(Color.green);
double ex[] = {2.5};
double ey[] = {4.2};
dataError = new Data(axis, ex, ey);
dataError.setLabelType(Data.LABEL_TYPE_TITLE);
//dataError.setTitle("solved 1 ODE");
dataError.setTextColor(Color.red);
addMouseListener(this);
addMouseMotionListener(this);
}
public void update(Graphics g) {
chart.update(g);
}
public void paint(Graphics g) {
chart.paint(g);
}
public void mouseMoved(MouseEvent event) {
}
public void mouseDragged(MouseEvent event) {
updateInitialPoint(event);
}
public void mouseClicked(MouseEvent event) {
updateInitialPoint(event);
}
private void updateInitialPoint(MouseEvent event) {
axis.mapDeviceToUser(event.getX(), event.getY(), point);
initialRabbit[0] = point[0];
initialFox[0] = point[1];
try {
solve();
dataSolved.setTitle("solved "+(++numberSolved)+" ODEs");
dataError.setTitle("");
} catch (IMSLException exception) {
StringBuffer sb = new StringBuffer(exception.toString());
int nCharsPerLine = 30;
for (int k = nCharsPerLine; k < sb.length(); k += nCharsPerLine) {
for (int j = 0; j < nCharsPerLine; j++) {
if (sb.charAt(k-j) == ' ') {
sb.setCharAt(k-j, '\n');
k -= j;
break;
}
}
}
dataError.setTitle(sb.toString());
}
repaint();
}
public void mousePressed(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseEntered(MouseEvent event) {
}
public void mouseExited(MouseEvent event) {
}
public static void main(String argv[]) {
PredatorPrey ex = null;
Frame frame = new Frame();
ex = new PredatorPrey();
frame.add(ex);
ex.init();
frame.setSize(new Dimension(400,400));
frame.show();
}
}