jacobi_iteration_method.py the use of vector operations, which reduces the calculation time by dozens of times (#8938)

* Replaced loops in jacobi_iteration_method function with vector operations. That gives a reduction in the time for calculating the algorithm.

* Replaced loops in jacobi_iteration_method function with vector operations. That gives a reduction in the time for calculating the algorithm.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Delete main.py

* Update jacobi_iteration_method.py

Changed a line that was too long.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update jacobi_iteration_method.py

Changed the type of the returned list as required.

* Update jacobi_iteration_method.py

Replaced init_val with new_val.

* Update jacobi_iteration_method.py

Fixed bug: init_val: list[int]  to  list[float].
Since the numbers are fractional: init_val = [0.5, -0.5, -0.5].

* Update jacobi_iteration_method.py

Changed comments, made variable names more understandable.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update jacobi_iteration_method.py

left the old algorithm commented out, as it clearly shows what is being done.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update jacobi_iteration_method.py

Edits upon request.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Kamil 2023-09-11 16:05:32 +05:00 committed by GitHub
parent 97e2de0763
commit 4246da387f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -12,7 +12,7 @@ from numpy.typing import NDArray
def jacobi_iteration_method( def jacobi_iteration_method(
coefficient_matrix: NDArray[float64], coefficient_matrix: NDArray[float64],
constant_matrix: NDArray[float64], constant_matrix: NDArray[float64],
init_val: list[int], init_val: list[float],
iterations: int, iterations: int,
) -> list[float]: ) -> list[float]:
""" """
@ -115,6 +115,7 @@ def jacobi_iteration_method(
strictly_diagonally_dominant(table) strictly_diagonally_dominant(table)
"""
# Iterates the whole matrix for given number of times # Iterates the whole matrix for given number of times
for _ in range(iterations): for _ in range(iterations):
new_val = [] new_val = []
@ -130,8 +131,37 @@ def jacobi_iteration_method(
temp = (temp + val) / denom temp = (temp + val) / denom
new_val.append(temp) new_val.append(temp)
init_val = new_val init_val = new_val
"""
return [float(i) for i in new_val] # denominator - a list of values along the diagonal
denominator = np.diag(coefficient_matrix)
# val_last - values of the last column of the table array
val_last = table[:, -1]
# masks - boolean mask of all strings without diagonal
# elements array coefficient_matrix
masks = ~np.eye(coefficient_matrix.shape[0], dtype=bool)
# no_diagonals - coefficient_matrix array values without diagonal elements
no_diagonals = coefficient_matrix[masks].reshape(-1, rows - 1)
# Here we get 'i_col' - these are the column numbers, for each row
# without diagonal elements, except for the last column.
i_row, i_col = np.where(masks)
ind = i_col.reshape(-1, rows - 1)
#'i_col' is converted to a two-dimensional list 'ind', which will be
# used to make selections from 'init_val' ('arr' array see below).
# Iterates the whole matrix for given number of times
for _ in range(iterations):
arr = np.take(init_val, ind)
sum_product_rows = np.sum((-1) * no_diagonals * arr, axis=1)
new_val = (sum_product_rows + val_last) / denominator
init_val = new_val
return new_val.tolist()
# Checks if the given matrix is strictly diagonally dominant # Checks if the given matrix is strictly diagonally dominant