Численное дифференцирование высокого порядка в C++

В следующей статье описываются простые численные методы для вычисления производных в C++. Я сосредоточусь на робототехнических приложениях и просто опишу, как вычислять скорость, ускорение и рывок при движении роботов по пути с определенными временными ограничениями.
Вычислительные методы для получения производных высокого порядка не ограничиваются робототехникой. только приложения, поэтому представленные ниже методы, конечно же, применимы к любым другим областям.
Мы собираемся вычислить первую, вторую и третью производные пути, поскольку скорость, ускорение и рывок часто оцениваются, когда робот перемещается (мобильный робот или манипулятор).

Исходный код вы можете найти на моем GitHub.

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

Численное дифференцирование

Численное дифференцирование — это набор методов оценки значения
производной функции в заданной точке. Везде, где форма функции неизвестна аналитически или ее форма очень сложна, и для функций, значения которых известны только для дискретного набора аргументов, применимо числовое дифференцирование.

Метод Ньютона — простейший способ вычисления дифференциала функции f(x).
Здесь используется определение производной функции, которая аппроксимируется частным дифференциалом:

Предполагая, что при вычислении f(x) известны значения предыдущих аргументов, стоит рассмотреть аппроксимацию производной разностным частным в виде (обратное дифференцирование):

В следующей статье мы должны применить второй и третий числовой дифференциал, так как нам нужны (помимо скорости) ускорение и рывок.

Вторую производную (ускорение) можно вычислить следующим образом:

Третья производная (рывок) может быть вычислена следующим образом:

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

Сначала я использовал кубический полином с четырьмя коэффициентами. Следовательно, он может удовлетворять ограничениям на положение и скорость в начальной и конечной точках. Я не вычисляю (график) рывка, так как ускорение для кубического пути прыгает на границах и делает рывок бесконечным. (обратите внимание, что графики масштабированы)

Для оценки величины рывка я использовал следующий полином (седьмого порядка), гарантирующий, что рывок равен нулю в начале и в конце),

Для построения графика требуется включить заголовочный файл, который должен находиться в той же папке, что и ваш cpp (файл, который вы можете клонировать из моего репозитория).
Ваша программа может быть скомпилирована следующим образом:

//compile
g++ my_prog.cpp -o my_prog -I/usr/include/python3.8 -lpython3.8//

 //run
./my_prog

//folder tree

├── my_prog
├── my_prog.cpp
├── matplotlibcpp.h

Спасибо за чтение.