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.
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)
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')
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.
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)
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')