mirror of
https://hub.njuu.cf/TheAlgorithms/Python.git
synced 2023-10-11 13:06:12 +08:00
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:
parent
97e2de0763
commit
4246da387f
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user