Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерпретатор математических формул 
:(
    Опции темы
psyco
Дата 26.4.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.12.2008

Репутация: нет
Всего: нет



Здравствуйте! Пишу интерпретатор математических выражений. Входные данные - текст формулы и аргумент х, в котором нужно найти значение этой функции. Вкратце покажу как реализовал(C#):
Код

string RPNConvert(string s);              /*преобразовывает входную строку в обратную польскую нотацию*/
double RPNSolve(string s);                /*вычисляет конечное значение с обратной польской нотации*/
string Constants(string s,double x);  /*во входной строке ищет константы, вырезает их и вставляет вместе них числа*/
string TAFT(string s);                         /*во входной строке ищет математические функции(тригоном., арифм.), делит на _функцию и _аргумент,вызывает саму себя с аргументом _аргумент */
double RPNCore(string s,double x);   /*принимает входную строку и число х, выдает f(x)*/

1. Входная строка и аргумент х поступают на RPNCore
2. RPNCore вызывает Constants, заменяя все символьные константы на числа
3. RPNCore вызывает TAFT, заменяя все символьные функции на числа
4. RPNCore вызывает RPNConvert, преобразовывая строку в обратную польскую нотацию
5. RPNCore вызывает RPNSolve, вычисляя по обратной польской нотации значение функции в точке х.
На примере: x+sin(pi*x), в точке x=1
1.
2. x+sin(pi*x)->1+sin(3.14*1)
3. 1+sin(3.14*1)->1+0
4. 1+0-> 1 0 +
5. 1 0 + -> 1
Все работает, как мог оптимизовал. Среднее время нахождения результата простеньких выражений порядка 5-10мс (знаю, много).
Проблема состоит в том, что при табуляции математического выражения и входного аргумента х, например х=[-10,10], с количеством точек n=500, программа работает около 15 сек !!! Табуляция происходит так: вызываю RPNCore с текстом математического выражения и х=-10, записываю первое значения, увеличиваю х: х=-9.96 вызываю RPNCore, записываю следующее значение и т.д.
Подскажите, пожалуйста, как можно было бы ускорить работу? (может быть через многопоточность, или все намного проще?) Заранее благодарен!

Это сообщение отредактировал(а) psyco - 26.4.2011, 23:37
PM MAIL   Вверх
Pavia
Дата 27.4.2011, 05:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Переводишь строку во внутреннее представления в котором легко производить вычисления.
RPNCore - выкинуть из цикла. Парсинг самое медленное, его надо выполнять один раз, оставить только вычисления.

Цитата
5-10мс (знаю, много). 
 медленно должно быть раз в 100 быстрее. Возьми профайлер и посмотри что тормозит. А потом оптимизируй.
PM MAIL   Вверх
psyco
Дата 27.4.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.12.2008

Репутация: нет
Всего: нет



Цитата

Переводишь строку во внутреннее представления в котором легко производить вычисления.

Это конечно самый оптимальный вариант, но как это реализовать я не представляю. Насколько я понимаю нужно строку перевести в формат функции, а потом ее табулировать. Можете подсказать какие-то основные идет насчет этого? Спасибо
PM MAIL   Вверх
Sartorius
Дата 27.4.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.