Производная: скорость изменения и наклон касательной
Производная отвечает на вопрос «как быстро меняется функция в данной точке» — это наклон её графика.
Производная f'(x) — мгновенная скорость изменения функции в точке x. Геометрически это наклон касательной к графику в этой точке.
От средней скорости к мгновенной
Представьте машину: средняя скорость — это путь, делённый на время. Чтобы узнать скорость прямо сейчас, берём всё меньший интервал времени. Производная — это «скорость прямо сейчас» для любой функции. Формально: берём приращение h, считаем, насколько изменилась функция, (f(x+h) − f(x)) / h, и устремляем h к нулю. В коде мы не можем взять «ноль», но можем взять очень маленькое h — получится численная производная.
# Численная производная: симметричная разность (точнее обычной)
def derivative(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
def f(x):
return x * x # производная по формуле: 2x
for x in [0, 1, 2, 3]:
approx = derivative(f, x)
print(f"x={x}: численно f'(x) = {round(approx, 5)}, точно 2x = {2 * x}")
Вывод:
x=0: численно f'(x) = 0.0, точно 2x = 0 x=1: численно f'(x) = 2.0, точно 2x = 2 x=2: численно f'(x) = 4.0, точно 2x = 4 x=3: численно f'(x) = 6.0, точно 2x = 6
Численная производная совпала с формулой (x²)' = 2x. Мы получили правило дифференцирования экспериментально, не зная его заранее.
Знак и величина производной
Производная несёт два сигнала, и оба критичны для оптимизации:
- Знак: положительная производная → функция растёт (идём вверх по склону), отрицательная → убывает (вниз).
- Величина: большая по модулю → крутой склон, функция меняется быстро; около нуля → почти плоско.
Чтобы спустить функцию в минимум, нужно идти против знака производной: если наклон положительный, шагаем влево; если отрицательный — вправо. Это и есть зерно градиентного спуска.
import math
def derivative(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
# Проверим производные известных функций
print("d/dx sin(x) при x=0 =", round(derivative(math.sin, 0), 5), " (cos 0 = 1)")
print("d/dx sin(x) при x=pi =", round(derivative(math.sin, math.pi), 5), " (cos pi = -1)")
print("d/dx exp(x) при x=0 =", round(derivative(math.exp, 0), 5), " (exp 0 = 1)")
def cube(x): return x ** 3
print("d/dx x^3 при x=2 =", round(derivative(cube, 2), 4), " (3·2^2 = 12)")
Вывод:
d/dx sin(x) при x=0 = 1.0 (cos 0 = 1) d/dx sin(x) при x=pi = -1.0 (cos pi = -1) d/dx exp(x) при x=0 = 1.0 (exp 0 = 1) d/dx x^3 при x=2 = 12.0 (3·2^2 = 12)
Наклон касательной наглядно
Касательная — прямая, которая в точке x0 «прислоняется» к графику с тем же наклоном. Её уравнение: y = f(x0) + f'(x0)·(x − x0). Вблизи x0 касательная почти совпадает с функцией — на этом основана вся идея «линейного приближения», которым пользуется оптимизация.
def derivative(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
def f(x): return x * x
x0 = 3
slope = derivative(f, x0) # ~6
def tangent(x): return f(x0) + slope * (x - x0)
# Около x0 касательная близка к функции
for x in [2.9, 3.0, 3.1]:
print(f"x={x}: f(x)={round(f(x), 4)}, касательная={round(tangent(x), 4)}")
Вывод:
x=2.9: f(x)=8.41, касательная=8.4 x=3.0: f(x)=9.0, касательная=9.0 x=3.1: f(x)=9.61, касательная=9.6
Итог
- Производная — мгновенная скорость изменения функции, наклон касательной.
- Численно её считают через малое приращение:
(f(x+h) − f(x−h)) / (2h). - Знак говорит, растёт функция или убывает; модуль — насколько круто.
- Чтобы минимизировать функцию, идут против знака производной — это основа градиентного спуска.