Skip to content

weddle's integration rule #11773

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
Open
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 135 additions & 0 deletions maths/weddles_rule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import numpy as np
from sympy import lambdify, symbols, sympify


def get_inputs():

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: get_inputs. If the function does not return a value, please provide the type hint as: def function() -> None:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: get_inputs. If the function does not return a value, please provide the type hint as: def function() -> None:

"""
Get user input for the function, lower limit, and upper limit.

Returns:
tuple: A tuple containing the function as a string, the lower limit (a),
and the upper limit (b) as floats.

Example:
>>> from unittest.mock import patch
>>> inputs = ['1/(1+x**2)', 1.0, -1.0]
>>> with patch('builtins.input', side_effect=inputs):
... get_inputs()
('1/(1+x**2)', 1.0, -1.0)
"""
func = input("Enter function with variable as x: ")
a = float(input("Enter lower limit: "))
b = float(input("Enter upper limit: "))
return func, a, b


def safe_function_eval(func_str):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: safe_function_eval. If the function does not return a value, please provide the type hint as: def function() -> None:

As there is no test file in this pull request nor any test function or class in the file maths/weddles_rule.py, please provide doctest for the function safe_function_eval

Please provide type hint for the parameter: func_str

"""
Safely evaluates the function by substituting x value using sympy.

Args:
func_str (str): Function expression as a string.

Returns:
float: The evaluated function result.
"""
x = symbols('x')
func_expr = sympify(func_str)

# Convert the function to a callable lambda function
lambda_func = lambdify(x, func_expr, modules=["numpy"])
return lambda_func


def compute_table(func, a, b, acc):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: compute_table. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: func

Please provide type hint for the parameter: a

Please provide descriptive name for the parameter: a

Please provide type hint for the parameter: b

Please provide descriptive name for the parameter: b

Please provide type hint for the parameter: acc

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: compute_table. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: func

Please provide type hint for the parameter: a

Please provide descriptive name for the parameter: a

Please provide type hint for the parameter: b

Please provide descriptive name for the parameter: b

Please provide type hint for the parameter: acc

"""
Compute the table of function values based on the limits and accuracy.

Args:
func (str): The mathematical function with the variable 'x' as a string.
a (float): The lower limit of the integral.
b (float): The upper limit of the integral.
acc (int): The number of subdivisions for accuracy.

Returns:
tuple: A tuple containing the table of values and the step size (h).

Example:
>>> compute_table(
... safe_function_eval('1/(1+x**2)'), 1, -1, 1
... )
(array([0.5 , 0.69230769, 0.9 , 1. , 0.9 ,
0.69230769, 0.5 ]), -0.3333333333333333)
"""
# Weddle's rule requires number of intervals as a multiple of 6 for accuracy
n_points = acc * 6 + 1
h = (b - a) / (n_points - 1)
x_vals = np.linspace(a, b, n_points)

# Evaluate function values at all points
table = func(x_vals)
return table, h


def apply_weights(table):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: apply_weights. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: table

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: apply_weights. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: table

"""
Apply Simpson's rule weights to the values in the table.

Args:
table (list): A list of computed function values.

Returns:
list: A list of weighted values.

Example:
>>> apply_weights([0.0, 0.866, 1.0, 0.866, 0.0, -0.866, -1.0])
[4.33, 1.0, 5.196, 0.0, -4.33]
"""
add = []
for i in range(1, len(table) - 1):
if i % 2 == 0 and i % 3 != 0:
add.append(table[i])
if i % 2 != 0 and i % 3 != 0:
add.append(5 * table[i])
elif i % 6 == 0:
add.append(2 * table[i])
elif i % 3 == 0 and i % 2 != 0:
add.append(6 * table[i])
return add


def compute_solution(add, table, h):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: compute_solution. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: add

Please provide type hint for the parameter: table

Please provide type hint for the parameter: h

Please provide descriptive name for the parameter: h

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide return type hint for the function: compute_solution. If the function does not return a value, please provide the type hint as: def function() -> None:

Please provide type hint for the parameter: add

Please provide type hint for the parameter: table

Please provide type hint for the parameter: h

Please provide descriptive name for the parameter: h

"""
Compute the final solution using the weighted values and table.

Args:
add (list): A list of weighted values from apply_weights.
table (list): A list of function values.
h (float): The step size (h) calculated from the limits and accuracy.

Returns:
float: The final computed integral solution.

Example:
>>> compute_solution([4.33, 6.0, 0.0, -4.33], [0.0, 0.866, 1.0, 0.866, 0.0,
... -0.866, -1.0], 0.5235983333333333)
0.7853975
"""
return 0.3 * h * (sum(add) + table[0] + table[-1])


if __name__ == "__main__":
from doctest import testmod
testmod()

Check failure on line 124 in maths/weddles_rule.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W293)

maths/weddles_rule.py:124:1: W293 Blank line contains whitespace
func, a, b = get_inputs()
acc = 1
solution = None

while acc <= 100_000:
table, h = compute_table(func, a, b, acc)
add = apply_weights(table)
solution = compute_solution(add, table, h)
acc *= 10

print(f'Solution: {solution}')

Check failure on line 135 in maths/weddles_rule.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (W292)

maths/weddles_rule.py:135:35: W292 No newline at end of file
Loading