Untitled

mail@pastecode.io avatar
unknown
java
7 months ago
1.6 kB
3
Indexable
Never
import java.util.function.Function;
import java.util.function.Supplier;

public class IntegratorSimpson implements Supplier<Double> {
    private final Function<Double, Double> function;

    private final double a, b;

    private final double accuracy;


    public IntegratorSimpson(Function<Double, Double> function,
                             double a, double b,
                             double accuracy) {
        this.function = function;
        this.a = a;
        this.b = b;
        this.accuracy = accuracy;
    }

    @Override
    public Double get() {
        double dx = b - a;
        double olds = 0;

        var f = function;
        double oldt = 0.5 * (f.apply(a) + f.apply(b)) * dx;
        for (int i = 1; ; i *= 2) {
            double t = 0;
            double spacing = dx / i;
            double x = a + 0.5 * spacing;
            for (int q = 0; q < i; q++) {
                t += f.apply(x);
                x += spacing;
            }
            t = 0.5 * (olds + t * spacing);

            double s = (4 * t - oldt) / 3;

            if (Math.abs(s - olds) <= accuracy)
                return s;

            olds = s;
            oldt = t;
        }
    }

    public static void main(String[] args) {
        assert Math.pow(10, -5) == 1E-5;
        IntegratorSimpson simpson = new IntegratorSimpson(
                x -> Math.exp(x) * Math.cos(x),
                0, 1,
                1E-5 * 0.5);

        System.out.println(simpson.get());
    }

}
Leave a Comment