Численное дифференцирование высокого порядка в 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
Спасибо за чтение.