Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Работа с простыми мат. выражениями / 25 сообщений из 25, страница 1 из 1
13.03.2009, 07:43:43
    #35866332
Дональдак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Добрый день!

Ситуация такая: есть формула вида
Код: plaintext
f(x1) + g(x2) + ... = A, A = const.
(слагаемые простые, например, 5sin3x, x^3 и т.д., т.е. слагаемых вида sin(cos(lg(x))) нет).

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

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

Но процесс распознавания и работы с функцией мне пока представляется смутно, единственный выход, который я вижу, цепочка case'ов вида
Код: plaintext
1.
2.
3.
4.
5.
6.
switch(Function)
{
case "sin": return sin(x);
case "cos": return cos(x);
 и т.д
}

Есть подозрение, что я изобретаю велосипед или просто делаю что-то не верно.
Буду благодарен за советы и подсказки по данной проблеме.
...
Рейтинг: 0 / 0
13.03.2009, 08:37:45
    #35866388
Q
Q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Если требуется вычисление и/или поиск корней/экстремумов/etc численными методами, то
можно взять книжку Б. Страустрапа, "ЯП C++" и расширить необходимыми функциями уже имеющуюся там готовую простую реализацию компилирующего парсера и быстрого вычислителя арифметических выражений произвольной сложности.

Если алгоритмы сильно завязаны на аналитическое представление и специальную структуру функции -- вероятно, придется придумывать что-то свое... И лучше сразу вооружиться учебником матана. :)
...
Рейтинг: 0 / 0
13.03.2009, 09:35:25
    #35866463
Aklin J
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
читаем про обратную польскую запись

4 8 15 16 23 42
...
Рейтинг: 0 / 0
13.03.2009, 11:19:35
    #35866846
AlexandrPlus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Взять Maple или MathCAD - в них все написать, а вход-выход на своем инстр. прогр-ия.
Любые формулы записываются и вычисл. в них, а результат экспортир. в свою программу.
...
Рейтинг: 0 / 0
13.03.2009, 11:28:48
    #35866908
W_and_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
если необходимо основательное решение, то можно спросить у А. В. Ахо, Р. Сети, Д. Д. Ульман. "Компиляторы: принципы, технологии и инструменты"
...
Рейтинг: 0 / 0
13.03.2009, 11:45:04
    #35866993
Работа с простыми мат. выражениями
Дональдак(слагаемые простые, например, 5sin3x, x^3 и т.д., т.е. слагаемых вида sin(cos(lg(x))) нет).
Плохие новости: 5sin3x не особо-то проще, чем sin(cos(lg(x)))... дерево выражения у него даже посложнее (две двухместных функции и одна одноместная против трех одноместных).
Если реализация обязательно на С++, то без относительно полноценного парсера не обойтись. boost::spirit может сильно помочь. ну и гугл, конечно, тоже.
...
Рейтинг: 0 / 0
13.03.2009, 12:55:29
    #35867238
SQL_Lamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Дональдак,

Недавно где то видел готовый парсер.
Сейчас пытался найти - но чего -то не находится.
Вы определенно изобретаете велосипед.
Поищите готовое решение.
...
Рейтинг: 0 / 0
13.03.2009, 12:58:14
    #35867246
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
SQL_LamerДональдак,

Недавно где то видел готовый парсер.
Сейчас пытался найти - но чего -то не находится.
Вы определенно изобретаете велосипед.
Поищите готовое решение.Каждый программист в своей жизни должен написать математический парсер!
...
Рейтинг: 0 / 0
13.03.2009, 13:01:56
    #35867259
Дональдак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Спасибо всем за советы!

Сейчас их все обдумаю, попробую найти информацию.

Эта часть работы не является основной, поэтому можно обойтись без по настоящему глобального решениея.
Наиболее привлекательным пока мне видится работа с маткадом, но такого опыта у меня нет.
А на сколько сложна работа с маткадом из своего приложения в таком ключе? Т.е. на вход функция, значения аргументов, на выходе - результат.
...
Рейтинг: 0 / 0
13.03.2009, 13:02:58
    #35867263
Дональдак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
SQL_Lamer, спасибо, я попробую, конечно его найти!
...
Рейтинг: 0 / 0
13.03.2009, 13:18:30
    #35867331
SQL_Lamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Яростный МечSQL_LamerДональдак,

Недавно где то видел готовый парсер.
Сейчас пытался найти - но чего -то не находится.
Вы определенно изобретаете велосипед.
Поищите готовое решение.Каждый программист в своей жизни должен написать математический парсер!

Что то есть в этом конечно.
Но такие высказывания порой пугают:
"Каждый программист должен написать мат. парсер"
"Каждый программист должен перекомпилировать ядро Линукс"
"Каждый программист должен написать свой компилятор"
и т. д.

Так жизни не хватит на все
...
Рейтинг: 0 / 0
13.03.2009, 14:00:47
    #35867496
Дональдак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Нашел решение на одном из сайтов, пример взят из Страуструпа, на первый взгяд. вполне удовлетворяет моим пожеланием.

Он работает с функциями почти любого вида. На вход можно подать строку вида, например,
Код: plaintext
A= 1 ;B= 2 ;C= 3 ;A*sin(B*cos(C))+B^ 3 
и получить число-результат операции.
...
Рейтинг: 0 / 0
13.03.2009, 15:38:46
    #35867875
AlexandrPlus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Дональдак
Наиболее привлекательным пока мне видится работа с маткадом, но такого опыта у меня нет.
А на сколько сложна работа с маткадом из своего приложения в таком ключе? Т.е. на вход функция, значения аргументов, на выходе - результат.

В каждом матпакете есть средства интегрирования с разными языками программирования.
Взять и попробовать, оценивая насколько сложно.
Объявлено в релизах MATLAB, что вообще можно транслировать программу на языке MATLAB в программу на C++.
И более - компилятор MATLAB вообще интегрируется в среду Microsoft Visual Studio.
...
Рейтинг: 0 / 0
13.03.2009, 18:27:40
    #35868494
Матер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
А название темы прикольное
...
Рейтинг: 0 / 0
15.03.2009, 09:25:25
    #35869777
Aklin J
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
ДональдакНашел решение на одном из сайтов, пример взят из Страуструпа, на первый взгяд. вполне удовлетворяет моим пожеланием.

Он работает с функциями почти любого вида. На вход можно подать строку вида, например,
Код: plaintext
A= 1 ;B= 2 ;C= 3 ;A*sin(B*cos(C))+B^ 3 
и получить число-результат операции.

ну а в чем вопрос? см. мой вышеозвученный пост ?
...
Рейтинг: 0 / 0
18.03.2009, 18:45:08
    #35877637
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Когда-то на Фортране пришлось делать для обработки больших массивов данных по матстатистике. Схема такая:
1. Создается лексический анализатор с конечным автоматом распознавания констант и с распознавателями определенного набора функций.
2. Придумывается некий псевдокод для функций, скобок, констант и прочего.
3. Создается подобие примитивного компилятора, который укладывает арифметическое выражение в обратную польскую запись.
4. Отдельно создается вычислитель псевдокода.
Прога спрашивает пользователя, чего он хочет вычислить, затем обращается к пп.1-3.
Получив результат в виде псевдокода, прога для обработки массива запускает в цикле (циклах) вторую часть - вычислитель выражения на основании аргументов массива с примитивным обработчиком всяких особых случаев.
По данной схеме была достигнута высокая скорость обработки, оставив далеко позади кучу ранее сделанных попыток, работавших правильно, но ужасно медленно.
...
Рейтинг: 0 / 0
18.03.2009, 18:49:02
    #35877646
Vowk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Еще добавлю - для п.3 необходимо создать механизм магазинной памяти.
...
Рейтинг: 0 / 0
19.03.2009, 09:26:01
    #35878289
Java Programmer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Яростный МечSQL_LamerДональдак,

Недавно где то видел готовый парсер.
Сейчас пытался найти - но чего -то не находится.
Вы определенно изобретаете велосипед.
Поищите готовое решение.Каждый программист в своей жизни должен написать математический парсер!

Ага а еще каждый мужык должен в своей жизни ... ммм как там было
Построить дом
Посадить дерево
Вырастить сына

Ну кому то нравится вариант с тещами и печенью - но суть одна - будете писать парсер на вышеупомянутое времени не хватит :)
...
Рейтинг: 0 / 0
22.03.2009, 19:17:55
    #35884264
Дональдак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Aklin J, читаю сейчас в википедии об этом. Просто сначала хотел пойти простым путем, но к сожалению все они оказались слишком медленными.
Моя программа в среднем делает десятки тысяч итераций, на каждой вычисляя значения одних и тех же функций, а те готовые реализации, которые я нашел в интернете или каждый раз заново распознают функцию, или просто работают слишком тихо.
...
Рейтинг: 0 / 0
22.03.2009, 21:22:19
    #35884375
Q
Q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
Тогда можно воспользоваться C#/VB# с их Reflection.Emit или даже cc/javac c банальной записью исходника в файл. :) Но огромного ускорения ожидать не стоит: вычислитель Страустрапа из ненужных накладных расходов имеет только вызовы функций. Их устранение даст гораздо меньший эффект, чем матан с чисметом, если, конечно, в этих дисциплинах вообще известны методы решения ваших задач с большим порядком скорости...
...
Рейтинг: 0 / 0
22.03.2009, 22:13:56
    #35884405
PC_2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
рекурсивный парсер от силы 300-400 строчек кода и день другой работы,
что за паника у здешней публики, не понимаю
...
Рейтинг: 0 / 0
22.03.2009, 22:21:08
    #35884410
паникер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
PC_2рекурсивный парсер от силы 300-400 строчек кода и день другой работы
лол.
открой для себя уже алгоритм Дейкстры наконец, он не такой уж и новый чтобы о нем не слышать, и прекрати изобретать кривые гигантские нестабильные велосипеды, вымогая деньги за целых один-два рабочих дня.
...
Рейтинг: 0 / 0
22.03.2009, 22:32:23
    #35884421
PC_2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
паникерPC_2рекурсивный парсер от силы 300-400 строчек кода и день другой работы
лол.
открой для себя уже алгоритм Дейкстры наконец, он не такой уж и новый чтобы о нем не слышать, и прекрати изобретать кривые гигантские нестабильные велосипеды, вымогая деньги за целых один-два рабочих дня.

я так не считаю. Здесь человеку наверно для курсового или еще для чего ( ну не задали же ему писать коммерческий компилятор ! ) нужно обычный парсер написать.
Так вы на него накинулись в соревнованиях кто моднее слова знает.
Ну возьмите предложите ему еще несколько томов Кнута прочитать, с Дейкстером разобраться, скурить книгу Страуструпа. Лекари, с таким лечением у человека начисто отбиваете желание чтото написать, развиваете панику, а зачот или что там еще должен быть сдан в срок.
...
Рейтинг: 0 / 0
23.04.2009, 17:14:37
    #35950675
sherzod_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
никто не слышал про

bison и lex?

десять минут набора для поставленной задачи

правда разбираться с ними придется месяц
но это один раз и и оправдается в многократном размере.
...
Рейтинг: 0 / 0
23.04.2009, 17:38:45
    #35950761
паникер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с простыми мат. выражениями
PC_2я так не считаю. Здесь человеку наверно для курсового или еще для чего ( ну не задали же ему писать коммерческий компилятор ! ) нужно обычный парсер написать.
Так вы на него накинулись в соревнованиях кто моднее слова знает.
Ну возьмите предложите ему еще несколько томов Кнута прочитать, с Дейкстером разобраться, скурить книгу Страуструпа. Лекари, с таким лечением у человека начисто отбиваете желание чтото написать, развиваете панику, а зачот или что там еще должен быть сдан в срок.
Какие к черту несколько томов, о том и речь, что алгоритм Дейкстры - это простейшая штуковина на 1 (один!) экран псевдокода, позволяющая делать разборы выражений любой сложности с учетом приоритета операторов, содержащие многоаргументные функции и так далее. И стек он использует в простом явном виде. Так что со своей рекурсией и 300-400 строками кода (кривым разваливающимся огромным велосипедом) отбиваете желание что-либо делать именно вы.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Работа с простыми мат. выражениями / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]