Source code for src.spyice.utils.error_norms
import numpy as np
[docs]
class ErrorNorms:
"""Defines functions for calculating error norms between numerical and analytical values."""
[docs]
def __init__(self, numerical_values, analytical_values) -> None:
"""
Args:
numerical_values (list): A list of numerical values.
analytical_values (list): A list of analytical values.
Attributes:
numerical_values (list): A list of numerical values.
analytical_values (list): A list of analytical values.
iteration_count (int): The count of iterations.
"""
self.numerical_values = numerical_values
self.analytical_values = analytical_values
self.iteration_count = 0
[docs]
def numerical_analytical_diff(self):
"""Calculates the absolute difference between the analytical values and the numerical values.
Args:
None
Returns:
numpy.ndarray: The array containing the absolute differences between the analytical values and the numerical values.
"""
if len(self.analytical_values.shape) == 1:
self.iteration_count, self.array_len = 1, self.analytical_values.shape[0]
self.numerical_analytical_diff = abs(
self.analytical_values - self.numerical_values
)
else:
[self.iteration_count, self.array_len] = self.analytical_values.shape
self.numerical_analytical_diff = np.array(
[
abs(self.analytical_values[i] - self.numerical_values[i])
for i in range(self.iteration_count)
]
)
return self.numerical_analytical_diff
[docs]
def one_norm(self, numerical_analytical_diff):
"""Calculates the one norm of the numerical-analytical difference.
Args:
numerical_analytical_diff (ndarray): The numerical-analytical difference.
Returns:
ndarray or float: The one norm of the numerical-analytical difference. If the analytical values are 1D, a float is returned. Otherwise, an ndarray is returned with the one norm for each iteration.
Raises:
None
"""
return (
np.sum(numerical_analytical_diff) / self.array_len
if len(self.analytical_values.shape) == 1
else np.array(
[
np.sum(numerical_analytical_diff[i]) / self.array_len
for i in range(self.iteration_count)
]
)
)
[docs]
def two_norm(self, numerical_analytical_diff):
"""Calculates the two-norm error of the numerical-analytical difference.
Args:
numerical_analytical_diff (ndarray): The numerical-analytical difference.
Returns:
ndarray or float: The two-norm error. If the analytical values are 1D, a float is returned.
If the analytical values are 2D, an ndarray is returned with the two-norm error for each iteration.
"""
return (
np.sqrt(np.sum(numerical_analytical_diff**2)) / self.array_len
if len(self.analytical_values.shape) == 1
else np.array(
[
np.sqrt(np.sum(numerical_analytical_diff[i] ** 2)) / self.array_len
for i in range(self.iteration_count)
]
)
)
[docs]
def infinity_norm(self, numerical_analytical_diff):
"""Calculates the infinity norm of the given numerical-analytical difference.
Args:
numerical_analytical_diff (array-like): The numerical-analytical difference.
Returns:
float or numpy.ndarray: The infinity norm of the difference. If the analytical values
are 1-dimensional, a single float value is returned. Otherwise, a numpy array
containing the infinity norm for each iteration is returned.
"""
return (
max(numerical_analytical_diff)
if len(self.analytical_values.shape) == 1
else np.array(
[max(numerical_analytical_diff[i]) for i in range(self.iteration_count)]
)
)