Добавлена пятая лабораторная работа

This commit is contained in:
Victor 2013-06-04 00:55:49 +03:00
parent 634e3f8c2a
commit 0c5e72eee5
9 changed files with 264 additions and 4 deletions

View File

@ -17,7 +17,7 @@ import javax.swing.border.EmptyBorder;
*/
public class Main extends JFrame {
private static final int NUM_OF_LABS = 4;
private static final int NUM_OF_LABS = 5;
public static void main(String[] args) {
try {

View File

@ -2,7 +2,6 @@ package com.nummethods.lr4;
import java.awt.Dimension;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
/**
* v10

View File

@ -0,0 +1,22 @@
package com.nummethods.lr5;
import java.awt.geom.Point2D;
/**
* Ìåòîä Ýéëåðà.
* @author aNNiMON
*/
public class EulerMethod extends IntegrateMethod {
public EulerMethod(Integral integral) {
super(integral);
}
@Override
protected double integrate(double xi, double h, double x0, double v0) {
double vi = (isEquals(xi, x0)) ? v0 : integrate(xi-h, h, x0, v0);
points.add(new Point2D.Double(xi, vi));
return vi + h * integral.f(xi, vi);
}
}

View File

@ -0,0 +1,9 @@
package com.nummethods.lr5;
/**
* @author aNNiMON
*/
public interface Function {
double f(double x, double v);
}

View File

@ -0,0 +1,41 @@
package com.nummethods.lr5;
/**
* @author aNNiMON
*/
public class Integral implements Function {
private final Function func;
private final double v0, x0, xN;
private final int N;
public Integral(Function func, double v0, double x0, double xN, int N) {
this.func = func;
this.v0 = v0;
this.x0 = x0;
this.xN = xN;
this.N = N;
}
@Override
public double f(double x, double v) {
return func.f(x, v);
}
public double getX0() {
return x0;
}
public double getXN() {
return xN;
}
public double getV0() {
return v0;
}
public int getN() {
return N;
}
}

View File

@ -0,0 +1,39 @@
package com.nummethods.lr5;
import java.awt.geom.Point2D;
import java.util.ArrayList;
/**
* @author aNNiMON
*/
public abstract class IntegrateMethod {
protected final Integral integral;
protected final ArrayList<Point2D> points;
public IntegrateMethod(Integral integral) {
this.integral = integral;
this.points = new ArrayList<Point2D>();
}
public double calculate(int n) {
double h = (integral.getXN() - integral.getX0()) / n;
return integrate(integral.getXN(), h, integral.getX0(), integral.getV0());
}
protected abstract double integrate(double xi, double h, double x0, double v0);
public Integral getIntegral() {
return integral;
}
public Point2D[] getPoints() {
Point2D[] array = new Point2D[points.size()];
array = points.toArray(array);
return array;
}
protected boolean isEquals(double a, double b) {
return Math.abs(a - b) < 0.00001;
}
}

View File

@ -0,0 +1,107 @@
package com.nummethods.lr5;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import util.GraphicPanel;
/**
*
* @author aNNiMON
*/
public class LR_5 extends JFrame {
private static final Integral var2 = new Integral(new Function() {
@Override
public double f(double x, double v) {
return Math.sin(x);
}
}, 0, -Math.PI, Math.PI, 50); // -0.006 | 4.386
private static final Integral var10 = new Integral(new Function() {
@Override
public double f(double x, double v) {
return Math.log(x);
}
}, 0, 1, 5, 100); // 4.106 | 4.079
private static final Integral var12 = new Integral(new Function() {
@Override
public double f(double x, double v) {
return 1 / (x);
}
}, 0, 1, 5, 75);
public static void main(String[] args) {
new LR_5().setVisible(true);
}
public LR_5() {
super("LR_5");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
final Integral integral = var10;
IntegrateMethod runge = new RungeKuttaMethod(integral);
System.out.println("Runge-Kutta: " + runge.calculate(integral.getN()));
final Point2D[] rungePoints = runge.getPoints();
IntegrateMethod euler = new EulerMethod(integral);
System.out.println("Euler: " + euler.calculate(integral.getN()));
final Point2D[] eulerPoints = euler.getPoints();
GraphicPanel panel = new GraphicPanel() {
private int xOld, yOld;
@Override
protected void drawLabels(Graphics g, double x) {
g.setColor(Color.BLACK);
g.drawString("x: " + x, 10, 20);
g.setColor(Color.BLUE);
g.drawString("Runge-Kutta: " + findPoint(rungePoints, x), 10, 40);
g.setColor(new Color(0x00C000));
g.drawString("Cubic Spline: " + findPoint(eulerPoints, x), 10, 60);
}
@Override
protected void plot(Graphics g, double x, double y, boolean firstIteration) {
if (firstIteration) {
// Ïåðâàÿ èòåðàöèÿ - çàïîìèíàåì êîîðäèíàòó
xOld = (int) x;
yOld = (int) y;
return;
}
g.fillRect(xOld - 1, yOld - 1, 3, 3);
g.drawLine(xOld, yOld, (int) x, (int) y);
xOld = (int) x;
yOld = (int) y;
}
};
panel.addPoints(rungePoints);
panel.addPoints(eulerPoints);
panel.setPreferredSize(new Dimension(400, 300));
add(panel);
pack();
setLocationRelativeTo(null);
}
private double findPoint(Point2D[] array, double x) {
for (int i = 0; i < array.length; i++) {
double dx = Math.abs( array[i].getX() - x );
if (dx < 0.001) {
return array[i].getY();
}
}
return 0;
}
}

View File

@ -0,0 +1,43 @@
package com.nummethods.lr5;
import java.awt.geom.Point2D;
/**
* Ěĺňîä Đóíăĺ-Ęóňňű
* @author aNNiMON
*/
public class RungeKuttaMethod extends IntegrateMethod {
public RungeKuttaMethod(Integral integral) {
super(integral);
}
@Override
public double integrate(double xi, double h, double x0, double v0) {
double vi = isEquals(xi, x0) ? v0 : integrate(xi-h, h, x0, v0);
double k1 = k1(h, xi, vi);
double k2 = k2(h, xi, vi, k1);
double k3 = k3(h, xi, vi, k2);
double k4 = k4(h, xi, vi, k3);
points.add(new Point2D.Double(xi, vi));
return vi + (k1 + 2 * k2 + 2 * k3 + k4) / 6;
}
private double k1(double h, double x, double v) {
return h * integral.f(x, v);
}
private double k2(double h, double x, double v, double k1) {
return h * integral.f(x + h / 2, v + k1 / 2);
}
private double k3(double h, double x, double v, double k2) {
return h * integral.f(x + h / 2, v + k2 / 2);
}
private double k4(double h, double x, double v, double k3) {
return h * integral.f(x + h / 2, v + k3 / 2);
}
}

View File

@ -81,7 +81,7 @@ public abstract class GraphicPanel extends JPanel {
for (int i = 0; i < input.length; i++) {
Point2D p = input[i];
plot(g, (p.getX() - xMin) * dx, height - (p.getY() - yMin) * dy);
plot(g, (p.getX() - xMin) * dx, height - (p.getY() - yMin) * dy, i == 0);
}
}
@ -97,7 +97,7 @@ public abstract class GraphicPanel extends JPanel {
protected abstract void drawLabels(Graphics g, double x);
protected void plot(Graphics g, double x, double y) {
protected void plot(Graphics g, double x, double y, boolean firstIteration) {
g.drawLine((int) x, (int) y, (int) x, (int) y);
}