chore: improve comments and add tests to trapezoidal rule (#11640)

* chore: improve comments and add tests to trapezoidal rule

* fix: too much characters in line

* Update maths/trapezoidal_rule.py

Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com>

* Update maths/trapezoidal_rule.py

Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com>

* Update maths/trapezoidal_rule.py

Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com>

* Update maths/trapezoidal_rule.py

Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com>

* fix: change function name in calls

* modify tests, changes numbers to remove coma

* updating DIRECTORY.md

* Fix doctest whitespace

* Try to fix line length in doctest

---------

Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com>
Co-authored-by: tianyizheng02 <tianyizheng02@users.noreply.github.com>
This commit is contained in:
Julien Richard 2024-12-31 02:11:29 +01:00 committed by GitHub
parent 8439fa8d1d
commit a4399022e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 57 additions and 41 deletions

View File

@ -142,6 +142,7 @@
* [Haralick Descriptors](computer_vision/haralick_descriptors.py) * [Haralick Descriptors](computer_vision/haralick_descriptors.py)
* [Harris Corner](computer_vision/harris_corner.py) * [Harris Corner](computer_vision/harris_corner.py)
* [Horn Schunck](computer_vision/horn_schunck.py) * [Horn Schunck](computer_vision/horn_schunck.py)
* [Intensity Based Segmentation](computer_vision/intensity_based_segmentation.py)
* [Mean Threshold](computer_vision/mean_threshold.py) * [Mean Threshold](computer_vision/mean_threshold.py)
* [Mosaic Augmentation](computer_vision/mosaic_augmentation.py) * [Mosaic Augmentation](computer_vision/mosaic_augmentation.py)
* [Pooling Functions](computer_vision/pooling_functions.py) * [Pooling Functions](computer_vision/pooling_functions.py)
@ -507,6 +508,7 @@
* [Kahns Algorithm Long](graphs/kahns_algorithm_long.py) * [Kahns Algorithm Long](graphs/kahns_algorithm_long.py)
* [Kahns Algorithm Topo](graphs/kahns_algorithm_topo.py) * [Kahns Algorithm Topo](graphs/kahns_algorithm_topo.py)
* [Karger](graphs/karger.py) * [Karger](graphs/karger.py)
* [Lanczos Eigenvectors](graphs/lanczos_eigenvectors.py)
* [Markov Chain](graphs/markov_chain.py) * [Markov Chain](graphs/markov_chain.py)
* [Matching Min Vertex Cover](graphs/matching_min_vertex_cover.py) * [Matching Min Vertex Cover](graphs/matching_min_vertex_cover.py)
* [Minimum Path Sum](graphs/minimum_path_sum.py) * [Minimum Path Sum](graphs/minimum_path_sum.py)
@ -886,6 +888,7 @@
* [N Body Simulation](physics/n_body_simulation.py) * [N Body Simulation](physics/n_body_simulation.py)
* [Newtons Law Of Gravitation](physics/newtons_law_of_gravitation.py) * [Newtons Law Of Gravitation](physics/newtons_law_of_gravitation.py)
* [Newtons Second Law Of Motion](physics/newtons_second_law_of_motion.py) * [Newtons Second Law Of Motion](physics/newtons_second_law_of_motion.py)
* [Period Of Pendulum](physics/period_of_pendulum.py)
* [Photoelectric Effect](physics/photoelectric_effect.py) * [Photoelectric Effect](physics/photoelectric_effect.py)
* [Potential Energy](physics/potential_energy.py) * [Potential Energy](physics/potential_energy.py)
* [Rainfall Intensity](physics/rainfall_intensity.py) * [Rainfall Intensity](physics/rainfall_intensity.py)

View File

@ -1,28 +1,25 @@
""" """
Numerical integration or quadrature for a smooth function f with known values at x_i Numerical integration or quadrature for a smooth function f with known values at x_i
This method is the classical approach of suming 'Equally Spaced Abscissas'
method 1:
"extended trapezoidal rule"
int(f) = dx/2 * (f1 + 2f2 + ... + fn)
""" """
def method_1(boundary, steps): def trapezoidal_rule(boundary, steps):
""" """
Apply the extended trapezoidal rule to approximate the integral of function f(x) Implements the extended trapezoidal rule for numerical integration.
over the interval defined by 'boundary' with the number of 'steps'. The function f(x) is provided below.
Args: :param boundary: List containing the lower and upper bounds of integration [a, b]
boundary (list of floats): A list containing the start and end values [a, b]. :param steps: The number of steps (intervals) used in the approximation
steps (int): The number of steps or subintervals. :return: The numerical approximation of the integral
Returns:
float: Approximation of the integral of f(x) over [a, b]. >>> abs(trapezoidal_rule([0, 1], 10) - 0.33333) < 0.01
Examples: True
>>> method_1([0, 1], 10) >>> abs(trapezoidal_rule([0, 1], 100) - 0.33333) < 0.01
0.3349999999999999 True
>>> abs(trapezoidal_rule([0, 2], 1000) - 2.66667) < 0.01
True
>>> abs(trapezoidal_rule([1, 2], 1000) - 2.33333) < 0.01
True
""" """
h = (boundary[1] - boundary[0]) / steps h = (boundary[1] - boundary[0]) / steps
a = boundary[0] a = boundary[0]
@ -31,7 +28,6 @@ def method_1(boundary, steps):
y = 0.0 y = 0.0
y += (h / 2.0) * f(a) y += (h / 2.0) * f(a)
for i in x_i: for i in x_i:
# print(i)
y += h * f(i) y += h * f(i)
y += (h / 2.0) * f(b) y += (h / 2.0) * f(b)
return y return y
@ -39,49 +35,66 @@ def method_1(boundary, steps):
def make_points(a, b, h): def make_points(a, b, h):
""" """
Generates points between 'a' and 'b' with step size 'h', excluding the end points. Generates points between a and b with step size h for trapezoidal integration.
Args:
a (float): Start value :param a: The lower bound of integration
b (float): End value :param b: The upper bound of integration
h (float): Step size :param h: The step size
Examples: :yield: The next x-value in the range (a, b)
>>> list(make_points(0, 1, 0.1)) # doctest: +NORMALIZE_WHITESPACE
[0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, \
0.8999999999999999]
>>> list(make_points(0, 10, 2.5)) >>> list(make_points(0, 10, 2.5))
[2.5, 5.0, 7.5] [2.5, 5.0, 7.5]
>>> list(make_points(0, 10, 2)) >>> list(make_points(0, 10, 2))
[2, 4, 6, 8] [2, 4, 6, 8]
>>> list(make_points(1, 21, 5)) >>> list(make_points(1, 21, 5))
[6, 11, 16] [6, 11, 16]
>>> list(make_points(1, 5, 2)) >>> list(make_points(1, 5, 2))
[3] [3]
>>> list(make_points(1, 4, 3)) >>> list(make_points(1, 4, 3))
[] []
""" """
x = a + h x = a + h
while x <= (b - h): while x <= (b - h):
yield x yield x
x = x + h x += h
def f(x): # enter your function here def f(x):
""" """
Example: This is the function to integrate, f(x) = (x - 0)^2 = x^2.
>>> f(2)
4 :param x: The input value
:return: The value of f(x)
>>> f(0)
0
>>> f(1)
1
>>> f(0.5)
0.25
""" """
y = (x - 0) * (x - 0) return x**2
return y
def main(): def main():
a = 0.0 # Lower bound of integration """
b = 1.0 # Upper bound of integration Main function to test the trapezoidal rule.
steps = 10.0 # define number of steps or resolution :a: Lower bound of integration
boundary = [a, b] # define boundary of integration :b: Upper bound of integration
y = method_1(boundary, steps) :steps: define number of steps or resolution
:boundary: define boundary of integration
>>> main()
y = 0.3349999999999999
"""
a = 0.0
b = 1.0
steps = 10.0
boundary = [a, b]
y = trapezoidal_rule(boundary, steps)
print(f"y = {y}") print(f"y = {y}")