Korobka887

какая-то хуета, выдающая рандомные числа

Apr 18th, 2023
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.60 KB | None | 0 0
  1. def numerical_derivative_2d(func, epsilon):
  2.     """
  3.    Функция для приближённого вычисления градиента функции двух переменных.
  4.    :param func: np.array[2] -> float — произвольная дифференцируемая функция
  5.    :param epsilon: float — максимальная величина приращения по осям
  6.    :return: другая функция, которая приближённо вычисляет градиент в точке
  7.    """
  8.     def grad_func(x):
  9.         """
  10.        :param x: np.array[2] — точка, в которой нужно вычислить градиент
  11.        :return: np.array[2] — приближённое значение градиента в этой точке
  12.        """
  13.  
  14.         return np.array([(func([x[0] + epsilon, x[1]]) - func(x)) / epsilon, (func([x[0], x[1] + epsilon]) - func(x)) / epsilon])
  15.    
  16.     return grad_func
  17.  
  18.  
  19. def grad_descent_2d(func, low, high, start=None, callback=None):
  20.     """
  21.    Реализация градиентного спуска для функций двух переменных
  22.  
  23.    Обратите внимание, что здесь градиент функции не дан.
  24.    Его нужно вычислять приближённо.
  25.  
  26.    :param func: np.ndarray -> float — функция
  27.    :param low: левая граница интервала по каждой из осей
  28.    :param high: правая граница интервала по каждой из осей
  29.    """
  30.  
  31.     def find_local_min(df, low_local, high_local, iters=5000, lr=0.01):
  32.         x = np.array(np.random.uniform(low, high, 2), dtype=float)
  33.         grad = df(x)
  34.        
  35.         while iters > 0:
  36.             # if low_local <= x[0] - eps * grad[0] <= high_local and low_local <= x[1] - eps * grad[1] <= high_local:
  37.             x[0] = x[0] - eps * grad[0]
  38.             x[1] = x[1] - eps * grad[1]
  39.             # print(x)
  40.             grad = df(x)
  41.             iters -= 1
  42.         callback(x, func(x))
  43.  
  44.         return x
  45.  
  46.     eps = 1e-2
  47.     iters = 500
  48.     df = numerical_derivative_2d(func, eps)
  49.  
  50.     estimates = np.empty((0, 2), dtype=float)
  51.     segment = (high - low) / 60
  52.  
  53.     while low < high:
  54.       estimates = np.vstack([estimates, find_local_min(df, low, low + segment, lr=eps)])
  55.       low += segment
  56.  
  57.     y = np.min(func(estimates))
  58.     print(estimates[:])
  59.     best_estimate = estimates[np.where(func(estimates) == y)[0]][0]
  60.     callback(best_estimate, func(best_estimate))
  61.  
  62.     return best_estimate
Add Comment
Please, Sign In to add comment