powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Работа с простыми мат. выражениями
25 сообщений из 25, страница 1 из 1
Работа с простыми мат. выражениями
    #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
Работа с простыми мат. выражениями
    #35866388
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Если требуется вычисление и/или поиск корней/экстремумов/etc численными методами, то
можно взять книжку Б. Страустрапа, "ЯП C++" и расширить необходимыми функциями уже имеющуюся там готовую простую реализацию компилирующего парсера и быстрого вычислителя арифметических выражений произвольной сложности.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

bison и lex?

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

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


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