суббота, 18 января 2014 г.

muParser

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

Самому писать распознаватель выражений писать не хотелось, и к тому же я усвоил, что существует множество Open Source проектов направленных на решение всевозможных задач. А значит и можно найти готовый и бесплатный распознаватель выражений.

Достаточно быстро нашелся подходящий мне проект под названием muParser. Официальный сайт - http://muparser.beltoforion.de/. Что меня привлекло в этом парсере:
1. Наличие примеров.
2. Наличие документации на сайте.
3. Простота использования.
4. Кроссплатформенность.

Сразу скажу, что muParser я не сравнивал с аналогами. Вопрос высокой эффективности остро не стоял, так как время вычисления выражения muParser'ом существенно меньше временных затрат остальной части программы. 

Здесь я опишу процесс установки в ОС Ubuntu Linux 12.04 64-bit.
1. Скачиваем дистрибутив библиотеки в официального сайта. После скачивания у меня в папке Downloads появился архив muparser_v2_2_3.zip. 
2. Копируем архив во временную папку temp
cp Downloads/muparser_v2_2_3.zip temp/
3. Переходим в папку temp и распаковываем архив 
cd ~/temp
unzip muparser_v2_2_3.zip
4. Переходим в папку извлеченную из архива
cd muparser_v2_2_3
Рекомендую прочитать содержимое файла License.txt. В файле Install.txt описана процедура установки. 
5. Запускаем скрипт configure и указываем в параметрах запуска, что хотим собрать динамически подключаемую библиотеку и примеры.
./configure --enable-shared=yes --enable-samples=yes --enable-debug=no
6 Запускаем утилиту
make
7. Устанавливаем muParser
sudo make install
В папке /usr/local/include появятся заголовочные файлы парсера.
В папке /usr/local/lib появится динамически подключаемая библиотека libmuparser.so
8. Обновляем кэш динамических библиотек
sudo ldconfig
9. Проверяем работоспособность примеров
./sample/example1/example1
example2 написан для Windows

В качестве демонстрации возможностей muParser'а я написал рисовалку графиков для функций одного действительного переменного. Для визуализации использовал freeglut.

Программа требует ввести выражение для функции, далее выводит кривую графика функции. 

Поскольку muParser понимает только основные элементарные функции я зарегистрировал в своей программе первые пять полиномов Лежандра, которые называются P0, P1, P2, P3, P4.

Так как у меня не стояла задача писать универсальный построитель графиков, то программа может вывести только одну кривую на промежутке [-1, 1], подписи осей отсутствуют.


Рисунок 1 - Скриншот терминала
Рисунок 2 - Скриншот построителя графиков. Полином Лежандра 4-й степени

Теперь построим 11 первых слагаемых  разложения функции

в ряд Фурье


Рисунок 3 - Скриншот терминала

Рисунок 4 - 11 первых членов Фурье разложения

Исходники можно скачать по ссылке

Для сборки выполнить в консоли следующее

g++ -O3 main.cpp Legendre.cpp colors.cpp -lmuparser -lGL -lglut -o muParserTest

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

Комментариев нет:

Отправить комментарий