2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Алгоритм для расчета формул
Сообщение10.09.2010, 18:33 
Существует набор несложных формул, которые при подстановке данных вычисляют определенные величины.
Нужно это реализовать программно (я делаю это на PHP).
Для записи формул использую простую запись вида Х1+Х2+Х3. Когда нужно провести расчеты через функцию preg_replace в цикле поочередно заменяю X1, X2 ..на реальные цифры (введенные пользователем, сохраненные ранее - это не важно)
Затем использую функцию
Код:
eval ('$calculation_result ='. $trans_formula.';')

где $trans_formula - текст формулы с подставленными данными.

Этот механизм выглядит как-то примитивно и у меня ощущение, что я пытаюсь заново придумать велосипед. Возможно, существуют какие-то готовые алгоритмы, методики, подходы для реализации этой задачи? Необязательно писать код - хотя бы общий алгоритм. Спасибо.

 
 
 
 Re: Алгоритм для расчета формул
Сообщение11.09.2010, 16:50 
Аватара пользователя
У вас такое огромное количество формул, что перевести их в функции нельзя?

 
 
 
 Re: Алгоритм для расчета формул
Сообщение11.09.2010, 19:04 
Все дело в том, что пользователи имеют возможность создавать собственные формулы. А потом проводить по ним какие-то расчеты. Если бы все формулы были бы определены наперед, я бы конечно использовал функции.
На других форумах посоветовали использовать обратную польскую нотацию. Если не найду решения лучше - наверное так и сделаю. Однако хотелось бы спросить совета и здесь. Возможно, сам мой подход(сохранение формулы как строки, подстановка значений, интерпретация) неверен и существует какое-то другое решение? Наверняка подобные задачи уже когда-то ставились и были успешно решены.

 
 
 
 Re: Алгоритм для расчета формул
Сообщение11.09.2010, 19:16 
Аватара пользователя
Ну, сам подход, в общем-то, логичен. Но сразу видны проблемы с безопасностью, если формулы пользователей недостаточно проверяются.

Обычный подход - делать парсер формул в какое-то внутреннее представление, ту же обратную польскую или дерево, и свой evaluator, принимающий это представление и словарь имя-значение.

 
 
 
 Re: Алгоритм для расчета формул
Сообщение22.09.2010, 20:48 
Xaositect писал(а):
Обычный подход - делать парсер формул в какое-то внутреннее представление, ту же обратную польскую или дерево, и свой evaluator, принимающий это представление и словарь имя-значение.

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

Лексический анализатор я бы реализовал как конечный автомат в явном виде. Imho, в результате получился бы довольно компактный код, читающийся лучше чем лапша с регулярными выражениями.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group