Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
1 / 1
Integration
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
5 / 5
11
100.00% covered (success)
100.00%
1 / 1
 intLeftRect
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 intRightRect
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 intMiddleRect
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 intTrapezium
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 intSimpson
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   phpOMS\Math\Numerics
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15namespace phpOMS\Math\Numerics;
16
17/**
18 * Numerical integration.
19 *
20 * @package phpOMS\Math\Numerics
21 * @license OMS License 2.0
22 * @link    https://jingga.app
23 * @since   1.0.0
24 */
25final class Integration
26{
27    /**
28     * Integrate function by using rectangles from the left side
29     *
30     * @param float    $from Start interval
31     * @param float    $to   End interval
32     * @param float    $n    Steps
33     * @param Callable $func Function to integrate
34     *
35     * @return float
36     *
37     * @since 1.0.0
38     */
39    public static function intLeftRect(float $from, float $to, float $n, callable $func) : float
40    {
41        $h   = ($to - $from) / $n;
42        $sum = 0.0;
43
44        for ($x = $from; $x <= ($to - $h); $x += $h) {
45            $sum += $func($x);
46        }
47
48        return $h * $sum;
49    }
50
51    /**
52     * Integrate function by using rectangles from the right side
53     *
54     * @param float    $from Start interval
55     * @param float    $to   End interval
56     * @param float    $n    Steps
57     * @param Callable $func Function to integrate
58     *
59     * @return float
60     *
61     * @since 1.0.0
62     */
63    public static function intRightRect(float $from, float $to, float $n, callable $func) : float
64    {
65        $h   = ($to - $from) / $n;
66        $sum = 0.0;
67
68        for ($x = $from; $x <= ($to - $h); $x += $h) {
69            $sum += $func($x + $h);
70        }
71
72        return $h * $sum;
73    }
74
75    /**
76     * Integrate function by using rectangles from a moving center point
77     *
78     * @param float    $from Start interval
79     * @param float    $to   End interval
80     * @param float    $n    Steps
81     * @param Callable $func Function to integrate
82     *
83     * @return float
84     *
85     * @since 1.0.0
86     */
87    public static function intMiddleRect(float $from, float $to, float $n, callable $func) : float
88    {
89        $h   = ($to - $from) / $n;
90        $sum = 0.0;
91
92        for ($x = $from; $x <= ($to - $h); $x += $h) {
93            $sum += $func($x + $h / 2.0);
94        }
95
96        return $h * $sum;
97    }
98
99    /**
100     * Integrate function by using trapezium
101     *
102     * @param float    $from Start interval
103     * @param float    $to   End interval
104     * @param float    $n    Steps
105     * @param Callable $func Function to integrate
106     *
107     * @return float
108     *
109     * @since 1.0.0
110     */
111    public static function intTrapezium(float $from, float $to, float $n, callable $func) : float
112    {
113        $h   = ($to - $from) / $n;
114        $sum = $func($from) + $func($to);
115
116        for ($i = 1; $i < $n; ++$i) {
117            $sum += 2 * $func($from + $i * $h);
118        }
119
120        return $h * $sum / 2.0;
121    }
122
123    /**
124     * Integrate by using the simpson rule
125     *
126     * @param float    $from Start interval
127     * @param float    $to   End interval
128     * @param float    $n    Steps
129     * @param Callable $func Function to integrate
130     *
131     * @return float
132     *
133     * @since 1.0.0
134     */
135    public static function intSimpson(float $from, float $to, float $n, callable $func) : float
136    {
137        $h    = ($to - $from) / $n;
138        $sum1 = 0.0;
139        $sum2 = 0.0;
140
141        for ($i = 0; $i < $n; ++$i) {
142            $sum1 += $func($from + $h * $i + $h / 2.0);
143        }
144
145        for ($i = 1; $i < $n; ++$i) {
146            $sum2 += $func($from + $h * $i);
147        }
148
149        return $h / 6.0 * ($func($from) + $func($to) + 4.0 * $sum1 + 2.0 * $sum2);
150    }
151}