Integration with different methods

Question:

How can i define my variable method in my function so that my integrate function can calculate the same integral via a chosen method ? Maybe i have to define an alias for the different functions?

import argparse 

def dummy_function(x_value): 
    return 4/(1+x_value**2)

def integrate(method,function,integration_range,n_slices): 
    method = ? 
    return integral_area

def riemann(function, integration_range, n_slices):
    x_start = integration_range[0]
    x_stop = integration_range[1]
    delta = (x_stop-x_start) / n_slices
    divisions = [x_start + j*delta for j in range(n_slices)]
    integral_area=0
    for x_value in divisions:
        integral_area += function(x_value)*delta
    return integral_area

def trapezoid(function, integration_range, n_slices):
    x_start = integration_range[0]
    x_stop = integration_range[1]
    delta = (x_stop-x_start) / n_slices
    divisions = [x_start + j*delta for j in range(n_slices)]
    integral_area=0
    for x_value in divisions:
        integral_area += (function(x_value)+function(x_value + 
        delta))*delta/2
    return integral_area

def simpson(function, integration_range, n_slices):
    x_start = integration_range[0]
    x_stop = integration_range[1]
    delta = (x_stop-x_start) / n_slices
    divisions = [x_start + j*delta for j in range(n_slices)]
    integral_area=0
    for x_value in divisions:
        integral_area += (function(x_value)+ 4*function(x_value + delta/2)
        + function(x_value + delta))*delta/6
    return integral_area

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Calculate Integral') 
    parser.add_argument('-s','--slices', type=int, default=1000000, help='Enter number of slices') 
    parser.add_argument('-m','--method', choices=['riemann','trapezoid','simpson'], default='riemann' ,help='Enter integration method') 
    args = parser.parse_args() 
    N_SLICES = args.slices 
    method = args.method 
    INTEGRAL_RANGE = [0, 1] 
    INTEGRAL_RESULT = integrate(method, dummy_function, INTEGRAL_RANGE, N_SLICES)
    print("Result:", INTEGRAL_RESULT)

i tried some ways but i get errors like ‘str’ object not callable etc.

Asked By: Keki

||

Answers:

Something like this should work:

def integrate(method,function,integration_range,n_slices): 
    methods = {
        'riemann': riemann,
        'trapezoid': trapezoid,
        'simpson': simpson
        } 
    return methods[method](function, integration_range, n_slices)

You could simplify this quite a bit though, no need to repeat code:

def integrate(method,function,integration_range,n_slices): 
    methods = {
        'riemann': riemann,
        'trapezoid': trapezoid,
        'simpson': simpson
        } 
    x_start, x_stop = integration_range
    delta = (x_stop-x_start) / n_slices
    divisions = [x_start + j*delta for j in range(n_slices)]
    return methods[method](function, divisions, delta)

def riemann(function, divisions, delta):
    return sum(function(x_value)*delta for x_value in divisions)

def trapezoid(function, divisions, delta):
    return sum((function(x_value)+function(x_value + 
        delta))*delta/2 for x_value in divisions)

def simpson(function, divisions, delta):
    return sum((function(x_value)+ 4*function(x_value + delta/2)
        + function(x_value + delta))*delta/6 for x_value in divisions)
Answered By: BeRT2me

You could reference method in the globals symbol table.

def integrate(method, function, integration_range, n_slices): 
    return globals()[method](function, integration_range, n_slices)

This technique can be extended in the event that you move the methods into a class. Here is a simple example to demonstrate:

class SomeClassName:
    def __init__(self):
        pass

    def class_method(self, argument):
        print(f"class_method('{argument}') called.")


# Get reference to class in globals
my_class = globals()['SomeClassName']()
# Store reference to class method
method = getattr(my_class, 'class_method')
# Call class method with argument 'some text'
method('some text')

# All on one line
getattr(globals()['SomeClassName'](), 'class_method')('some text')
Answered By: Dan Nagle
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.