Привет! В этой статье я возвращаюсь к основам исчисления и возвращаюсь к интегрированию и выводу. Я реализую численный подход как для интегрирования, так и для вычислений деривации в Python.
Численные подходы являются хорошими приближениями для аналитических решений интегрирования и вывода. Поэтому они широко используются в машинном обучении (особенно в нейронных сетях), чтобы проверить, не содержит ли код ошибок. Функции в этой статье можно использовать для той же цели. Есть также готовые к использованию библиотеки, но просмотр функций в явном виде помогает нам понять, что происходит 🙂
Давайте начнем!
Интеграция
Идея
Определение определенного интеграла можно дать как
Если f — функция, определенная в интервале [a, b], а ∆x — (xi — xi+1), то определенный интеграл равен
Код
Используя приведенное выше определение определенного интеграла, мы можем принять n равным 10 000 и предположить, что оно достаточно велико. Затем мы просто делим область между x=a и x=b на 10 000 прямоугольников.
import numpy as np def integral(f, a : float, b : float) -> float: xs = np.linspace(a, b, 10_000) area_under_curve = 0 for i in range(len(xs)-1): delta_x = xs[i+1] - xs[i] f_x = f(xs[i]) area_under_curve += f_x * delta_x return area_under_curve
Пример
Чтобы проверить нашу интегральную функцию, мы можем попытаться взять интервал x^2 между x=1 и x=2. Поскольку интеграл легче вычислять как аналитический, мы можем сравнить результаты.
def x_squared(x): return x**2 def analytical_integrated_x_squared(a, b): return 1/3 * b**3 - 1/3 * a**3 analytical_integrated_x_squared(1, 2) # Returns 2.333333333333333 integral(x_squared, 1, 2) # Returns 2.3331833199988306
Мы видим, что численное приближение довольно близко к аналитическому результату. Мы можем внести небольшие изменения в наши функции, чтобы приблизить численный результат к аналитическому, но я не буду вдаваться в подробности, чтобы не усложнять статью.
Вывод
Идея
Производная функции в точке дает ее наклон в этой точке. Мы можем видеть, как мы можем вычислить этот наклон в определении производной.
Если 𝑓 ’(x) является производным 𝑓(x) относительно х, то
Код
Используя определение производной и приняв дельту за небольшое значение, мы можем аппроксимировать производную функцией, приведенной ниже.
def derivative(f, a : float) -> float: delta = 1e-10 derivative_at_a = (f(a+delta) - f(a-delta)) / (2*delta) return derivative_at_a
Пример
Чтобы проверить нашу производнуюфункцию, мы можем использовать простую функцию x^2, которая имеет производную как 2*x.
def x_squared(x): return x**2 def analytical_derivation_of_x_squared(a): return 2*a analytical_derivation_of_x_squared(5) # Returns 10 derivative(x_squared, 5) # Returns 10.00000082740371
Мы видим, что аналитический результат и наше численное приближение довольно близки.
Заключение
В этой статье мы протестировали наши функции с помощью функции, которую легко интегрировать и создать для проверки наших подходов. Однако эти функции можно использовать с гораздо более сложными функциями, где мы не можем вычислить интеграл или производную аналитически. Кроме того, мы можем использовать эти подходы, когда мы вычисляем производную сложной функции или аналитический интеграл, и мы хотим проверить, верно ли это. Примером использования этого может быть случай, когда вы хотите проверить правильность работы обратного распространения нейронных сетей.
Надеюсь, вам понравилось читать!