Start Typing !!! type the highlighted character. You can't scroll once you start typing.
filename

integeration_by_simpson_approx.py

"""

Author : Syed Faizan ( 3rd Year IIIT Pune )

Github : faizan2700

Purpose : You have one function f(x) which takes float integer and returns

float you have to integrate the function in limits a to b.

The approximation proposed by Thomas Simpsons in 1743 is one way to calculate integration.

( read article : https://cp-algorithms.com/num_methods/simpson-integration.html )

simpson_integration() takes function,lower_limit=a,upper_limit=b,precision and

returns the integration of function in given limit.

"""

# constants

# the more the number of steps the more accurate

N_STEPS = 1000

def f(x: float) -> float:

return x * x

"""

Summary of Simpson Approximation :

By simpsons integration :

1.integration of fxdx with limit a to b is = f(x0) + 4 * f(x1) + 2 * f(x2) + 4 * f(x3) + 2 * f(x4)..... + f(xn)

where x0 = a

xi = a + i * h

xn = b

"""

def simpson_integration(function, a: float, b: float, precision: int = 4) -> float:

"""

Args:

function : the function which's integration is desired

a : the lower limit of integration

b : upper limit of integraion

precision : precision of the result,error required default is 4

Returns:

result : the value of the approximated integration of function in range a to b

Raises:

AssertionError: function is not callable

AssertionError: a is not float or integer

AssertionError: function should return float or integer

AssertionError: b is not float or integer

AssertionError: precision is not positive integer

>>> simpson_integration(lambda x : x*x,1,2,3)

2.333

>>> simpson_integration(lambda x : x*x,'wrong_input',2,3)

Traceback (most recent call last):

...

AssertionError: a should be float or integer your input : wrong_input

>>> simpson_integration(lambda x : x*x,1,'wrong_input',3)

Traceback (most recent call last):

...

AssertionError: b should be float or integer your input : wrong_input

>>> simpson_integration(lambda x : x*x,1,2,'wrong_input')

Traceback (most recent call last):

...

AssertionError: precision should be positive integer your input : wrong_input

>>> simpson_integration('wrong_input',2,3,4)

Traceback (most recent call last):

...

AssertionError: the function(object) passed should be callable your input : wrong_input

>>> simpson_integration(lambda x : x*x,3.45,3.2,1)

-2.8

>>> simpson_integration(lambda x : x*x,3.45,3.2,0)

Traceback (most recent call last):

...

AssertionError: precision should be positive integer your input : 0

>>> simpson_integration(lambda x : x*x,3.45,3.2,-1)

Traceback (most recent call last):

...

AssertionError: precision should be positive integer your input : -1

"""

assert callable(

function

), f"the function(object) passed should be callable your input : {function}"

assert isinstance(a, float) or isinstance(

a, int

), f"a should be float or integer your input : {a}"

assert isinstance(function(a), float) or isinstance(

function(a), int

), f"the function should return integer or float return type of your function, {type(a)}"

assert isinstance(b, float) or isinstance(

b, int

), f"b should be float or integer your input : {b}"

assert (

isinstance(precision, int) and precision > 0

), f"precision should be positive integer your input : {precision}"

# just applying the formula of simpson for approximate integraion written in

# mentioned article in first comment of this file and above this function

h = (b - a) / N_STEPS

result = function(a) + function(b)

for i in range(1, N_STEPS):

a1 = a + h * i

result += function(a1) * (4 if i % 2 else 2)

result *= h / 3

return round(result, precision)

if __name__ == "__main__":

import doctest

doctest.testmod()