Я решил попробовать реализовать алгоритм градиентного спуска на Python для нахождения минимума функции f(x,y)(1−x)2 100(y−x2)2. Вот полный код⁚
python
import numpy as np
def gradient_descent(x0, y0, alpha, epsilon)⁚
x x0
y y0
while True⁚
# Вычисляем градиент функции в текущей точке (x, y)
gradient_x 2 * (x ー 1) ー 400 * x * (y ー x**2)
gradient_y 200 * (y ー x**2)
# Делаем шаг в сторону антиградиента
x — alpha * gradient_x
y — alpha * gradient_y
# Проверяем условие остановки ― изменение функции меньше epsilon
if np.sqrt(gradient_x**2 gradient_y**2) < epsilon⁚
break
return x, y
# Инициализируем начальную точку, шаговый размер и критерий остановки
x0 2
y0 2
alpha 0.01
epsilon 1e-6
# Вызываем функцию градиентного спуска и получаем минимум функции
result gradient_descent(x0, y0, alpha, epsilon)
print(″Минимум функции найден в точке⁚″)
print(″x ″, result[0])
print(″y ″, result[1])
Вышеуказанный код выполняет все шаги алгоритма градиентного спуска для функции f(x,y)(1−x)2 100(y−x2)2. В начале мы инициализируем начальную точку (x0, y0), шаговый размер alpha и критерий остановки epsilon. Затем создаем цикл, который будет выполнять шаги градиентного спуска, пока не будет достигнут критерий остановки.
Внутри цикла мы сначала вычисляем градиент функции в текущей точке (x, y), затем делаем шаг в сторону антиградиента с помощью формулы x1 x0 – alpha * gradient_x, y1 y0 – alpha * gradient_y. После этого мы проверяем условие остановки ― изменение функции меньше epsilon. Если это условие выполняется, цикл прерывается и мы возвращаем точку, в которой был найден минимум функции.
Наконец, мы вызываем функцию `gradient_descent` с заданными параметрами и выводим результат ― точку, в которой нашелся минимум функции.
Вы можете экспериментировать с изменением начальной точки, шагового размера и критерия остановки, чтобы увидеть, как это влияет на результат;