Привет! В этой статье я возвращаюсь к основам исчисления и возвращаюсь к интегрированию и выводу. Я реализую численный подход как для интегрирования, так и для вычислений деривации в 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

Мы видим, что аналитический результат и наше численное приближение довольно близки.

Заключение

В этой статье мы протестировали наши функции с помощью функции, которую легко интегрировать и создать для проверки наших подходов. Однако эти функции можно использовать с гораздо более сложными функциями, где мы не можем вычислить интеграл или производную аналитически. Кроме того, мы можем использовать эти подходы, когда мы вычисляем производную сложной функции или аналитический интеграл, и мы хотим проверить, верно ли это. Примером использования этого может быть случай, когда вы хотите проверить правильность работы обратного распространения нейронных сетей.

Надеюсь, вам понравилось читать!

Обо мне