Добавлена пятая лабораторная работа
This commit is contained in:
parent
634e3f8c2a
commit
0c5e72eee5
@ -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 {
|
||||
|
@ -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
|
||||
|
22
src/com/nummethods/lr5/EulerMethod.java
Normal file
22
src/com/nummethods/lr5/EulerMethod.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
9
src/com/nummethods/lr5/Function.java
Normal file
9
src/com/nummethods/lr5/Function.java
Normal file
@ -0,0 +1,9 @@
|
||||
package com.nummethods.lr5;
|
||||
|
||||
/**
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public interface Function {
|
||||
|
||||
double f(double x, double v);
|
||||
}
|
41
src/com/nummethods/lr5/Integral.java
Normal file
41
src/com/nummethods/lr5/Integral.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
39
src/com/nummethods/lr5/IntegrateMethod.java
Normal file
39
src/com/nummethods/lr5/IntegrateMethod.java
Normal 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;
|
||||
}
|
||||
}
|
107
src/com/nummethods/lr5/LR_5.java
Normal file
107
src/com/nummethods/lr5/LR_5.java
Normal 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;
|
||||
}
|
||||
}
|
43
src/com/nummethods/lr5/RungeKuttaMethod.java
Normal file
43
src/com/nummethods/lr5/RungeKuttaMethod.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user