diff --git a/src/com/nummethods/lr5/EulerMethod.java b/src/com/nummethods/lr5/EulerMethod.java index 8752abc..c78d9b3 100644 --- a/src/com/nummethods/lr5/EulerMethod.java +++ b/src/com/nummethods/lr5/EulerMethod.java @@ -15,8 +15,9 @@ public class EulerMethod extends IntegrateMethod { @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); + double result = vi + h * integral.f(xi, vi); + points.add(new Point2D.Double(xi, result)); + return result; } } diff --git a/src/com/nummethods/lr5/Integral.java b/src/com/nummethods/lr5/Integral.java index c6e844e..fd2a691 100644 --- a/src/com/nummethods/lr5/Integral.java +++ b/src/com/nummethods/lr5/Integral.java @@ -5,7 +5,7 @@ package com.nummethods.lr5; */ public class Integral implements Function { - private final Function func; + private Function func; private final double v0, x0, xN; private final int N; @@ -17,6 +17,10 @@ public class Integral implements Function { this.N = N; } + public void setFunc(Function func) { + this.func = func; + } + @Override public double f(double x, double v) { return func.f(x, v); diff --git a/src/com/nummethods/lr5/LR_5.java b/src/com/nummethods/lr5/LR_5.java index 02a916e..58337ca 100644 --- a/src/com/nummethods/lr5/LR_5.java +++ b/src/com/nummethods/lr5/LR_5.java @@ -56,9 +56,31 @@ public class LR_5 extends JFrame { System.out.println("Euler: " + euler.calculate(integral.getN())); final Point2D[] eulerPoints = euler.getPoints(); + Function f10 = new Function() { + + @Override + public double f(double x, double v) { + return x * Math.log(x) - x + 1; + } + }; + + Function f2 = new Function() { + + @Override + public double f(double x, double v) { + return -Math.cos(x) - 1; + } + }; + + final Point2D[] normalPoints = new Point2D[rungePoints.length]; + for (int i = 0; i < normalPoints.length; i++) { + double x = rungePoints[i].getX(); + double y = f2.f(x, 0); + normalPoints[i] = new Point2D.Double(x, y); + } + GraphicPanel panel = new GraphicPanel() { - private int xOld, yOld; @Override @@ -68,7 +90,9 @@ public class LR_5 extends JFrame { 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); + g.drawString("Euler: " + findPoint(eulerPoints, x), 10, 60); + g.setColor(new Color(0xD35E2C)); + g.drawString("Normal: " + findPoint(normalPoints, x), 10, 80); } @Override @@ -87,6 +111,7 @@ public class LR_5 extends JFrame { }; panel.addPoints(rungePoints); panel.addPoints(eulerPoints); + panel.addPoints(normalPoints); panel.setPreferredSize(new Dimension(400, 300)); diff --git a/src/com/nummethods/lr5/NormalMethod.java b/src/com/nummethods/lr5/NormalMethod.java new file mode 100644 index 0000000..dde47b4 --- /dev/null +++ b/src/com/nummethods/lr5/NormalMethod.java @@ -0,0 +1,38 @@ +package com.nummethods.lr5; + +import java.awt.geom.Point2D; + +/** + * Метод Эйлера. + * @author aNNiMON + */ +public class NormalMethod extends IntegrateMethod { + + public NormalMethod(Integral integral) { + super(integral); + } + + @Override + public double calculate(int n) { + double h = (integral.getXN() - integral.getX0()) / n; + for (double x = integral.getX0(); x <= integral.getXN(); x += h) { + points.add(new Point2D.Double(x, integral.f(x, integral.getV0()))); + } + + /*for (int i = 0; i < n; i++) { + double x = integral.getX0() + h * i; + points.add(new Point2D.Double(x, integral.f(x, integral.getV0()))); + }*/ + + return 0; + } + + @Override + protected double integrate(double xi, double h, double x0, double v0) { + /*if (isEquals(xi, x0)) { + points.add(new Point2D.Double(xi, integral.f(xi, v0))); + } else integrate(xi - h, h, x0, v0);*/ + return 0; + } + +} diff --git a/src/com/nummethods/lr5/RungeKuttaMethod.java b/src/com/nummethods/lr5/RungeKuttaMethod.java index 972ab77..e6dafb7 100644 --- a/src/com/nummethods/lr5/RungeKuttaMethod.java +++ b/src/com/nummethods/lr5/RungeKuttaMethod.java @@ -20,8 +20,9 @@ public class RungeKuttaMethod extends IntegrateMethod { 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; + double result = vi + (k1 + 2 * k2 + 2 * k3 + k4) / 6; + points.add(new Point2D.Double(xi, result)); + return result; } private double k1(double h, double x, double v) { diff --git a/src/util/GraphicPanel.java b/src/util/GraphicPanel.java index ccf10de..42cd90a 100644 --- a/src/util/GraphicPanel.java +++ b/src/util/GraphicPanel.java @@ -17,7 +17,7 @@ public abstract class GraphicPanel extends JPanel { // Цвета для графиков. private static final Color[] COLORS = { - Color.BLUE, new Color(0x00C000), Color.CYAN, Color.MAGENTA + Color.BLUE, new Color(0x00C000), new Color(0xD35E2C), Color.MAGENTA }; private final ArrayList pointsHolder;