Реализация простейшего примера градиентного спуска на IPython

Ниже пример реализации на IPython градиентного спуска в рамках прохождения курса на Курсере для простой функции одной переменной с подробными комментариями. Т.е. вообще-то тема градиента предполагает хотя бы функцию двух переменных. Но начать, считаю, надо с одной переменной. Затем, когда суть понятна, тогда уже не помешает сделать решение для двух переменных, соответственно с трехмерными графиками.

Для примера в коде ниже взята функция y = (x-5)^2
Конечно, и так видно, что минимум располагается в точке (5; 0). Но задача — найти эту точку с помощью градиентного спуска:

Также оставляю полезную ссылку по теме: Математика для искусственных нейронных сетей для новичков, часть 2 — градиентный спуск
Для тех, кто пришел с 3 недели 1 курса Курсеры, детально статью с хабра прорабатывать не надо. Это все еще должно быть впереди в рамках курса. Главное — понять математическую основу и простейшие примеры для функций одной и двух переменных.