siteName > > maths.SimpsonIntegration
Threads
java ( 177186 ) - java ( 177187 ) stack: com.thealgorithms.maths.SimpsonIntegration.main(SimpsonIntegration.java:18)
package com.thealgorithms.maths;

import java.util.TreeMap;

public class SimpsonIntegration {

    /*
     * Calculate definite integrals by using Composite Simpson's rule.
     * Wiki: https://en.wikipedia.org/wiki/Simpson%27s_rule#Composite_Simpson's_rule
     * Given f a function and an even number N of intervals that divide the integration interval
     * e.g. [a, b], we calculate the step h = (b-a)/N and create a table that contains all the x
     * points of the real axis xi = x0 + i*h and the value f(xi) that corresponds to these xi.
     *
     * To evaluate the integral i use the formula below:
     * I = h/3 * {f(x0) + 4*f(x1) + 2*f(x2) + 4*f(x3) + ... + 2*f(xN-2) + 4*f(xN-1) + f(xN)}
     *
     */
    public static void main(String[] args) {
        SimpsonIntegration integration = new SimpsonIntegration();

        // Give random data for the example purposes
        int n = 16;
        double a = 1;
        double b = 3;

        // Check so that n is even
        if (n % 2 != 0) {
            System.out.println("n must be even number for Simpsons method. Aborted");
            System.exit(1);
        }

        // Calculate step h and evaluate the integral
        double h = (b - a) / (double) n;
        double integralEvaluation = integration.simpsonsMethod(n, h, a);
        System.out.println("The integral is equal to: " + integralEvaluation);
    }

    /*
     * @param N: Number of intervals (must be even number N=2*k)
     * @param h: Step h = (b-a)/N
     * @param a: Starting point of the interval
     * @param b: Ending point of the interval
     *
     * The interpolation points xi = x0 + i*h are stored the treeMap data
     *
     * @return result of the integral evaluation
     */
    public double simpsonsMethod(int n, double h, double a) {
        TreeMap<Integer, Double> data = new TreeMap<>(); // Key: i, Value: f(xi)
        double temp;
        double xi = a; // Initialize the variable xi = x0 + 0*h

        // Create the table of xi and yi points
        for (int i = 0; i <= n; i++) {
            temp = f(xi); // Get the value of the function at that point
            data.put(i, temp);
            xi += h; // Increase the xi to the next point
        }

        // Apply the formula
        double integralEvaluation = 0;
        for (int i = 0; i < data.size(); i++) {
            if (i == 0 || i == data.size() - 1) {
                integralEvaluation += data.get(i);
                System.out.println("Multiply f(x" + i + ") by 1");
            } else if (i % 2 != 0) {
                integralEvaluation += (double) 4 * data.get(i);
                System.out.println("Multiply f(x" + i + ") by 4");
            } else {
                integralEvaluation += (double) 2 * data.get(i);
                System.out.println("Multiply f(x" + i + ") by 2");
            }
        }

        // Multiply by h/3
        integralEvaluation = h / 3 * integralEvaluation;

        // Return the result
        return integralEvaluation;
    }

    // Sample function f
    // Function f(x) = e^(-x) * (4 - x^2)
    public double f(double x) {
        return Math.exp(-x) * (4 - Math.pow(x, 2));
        //        return Math.sqrt(x);
    }
}
Variables All
No.FromNameValue
118args[Ljava.lang.String;@7852e922
END 0 00
Output All Filter Merge
Process FilterThread Filter
177186 java 177187 java
No.PNPIDTIDTNMessage
1java177186177187javaMultiply f(x0) by 1
2java177186177187javaMultiply f(x0) by 2
3java177186177187javaMultiply f(x1) by 4
4java177186177187javaMultiply f(x2) by 2
5java177186177187javaMultiply f(x3) by 4
6java177186177187javaMultiply f(x4) by 2
7java177186177187javaMultiply f(x5) by 4
8java177186177187javaMultiply f(x6) by 2
9java177186177187javaMultiply f(x7) by 4
10java177186177187javaMultiply f(x8) by 2
11java177186177187javaMultiply f(x9) by 4
12java177186177187javaMultiply f(x10) by 2
13java177186177187javaMultiply f(x11) by 4
14java177186177187javaMultiply f(x12) by 2
15java177186177187javaMultiply f(x13) by 4
16java177186177187javaMultiply f(x14) by 2
17java177186177187javaMultiply f(x15) by 4
18java177186177187javaMultiply f(x16) by 1
19java177186177187javaMultiply f(x16) by 2
20java177186177187javaThe integral is equal to: 0.3505787273808654
END 0 0 0 00
Project:Alg-Java
Update:20240824
Commit:a7cd97d7
Source Code:maths.SimpsonIntegration
BuildTool:Java17
Compiler:Java17
Runtime:Openjdk17
System:MySystemD
Kernel:Linux5.10.211
Cpu:Intel:Corei7-7700K
Machine:AwesomeMachine