|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.09.2012, 11:47 | #11 | |
Пользователь
Регистрация: 27.04.2012
Сообщений: 18
|
Цитата:
|
|
19.09.2012, 12:51 | #12 | ||
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Цитата:
Цитата:
Код:
Тут подробный алгоритм: http://algolist.manual.ru/syntax/revpn.php Правильно его модифицировав можно легко(быстро) считать и значения функций и производные n-го порядка. Последний раз редактировалось Kostia; 19.09.2012 в 12:54. |
||
19.09.2012, 13:02 | #13 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Я уже предлагал не строить никаких деревьев, а разбирать выражение рекурсивно. Я так делал на c#, время работы вполне приличное (в том смысле, что на глаз не видно за какое время считает). Суть там та же, но под другим углом зрения. Я ведь так понимаю Вам нужна интерпретация, а не компиляция. Ваш метод нужен именно для компиляции. При разборе следует использовать одну функцию, которая разбирает выражения вызывая саму себя, до тех пор пока не спустится до примитивов и только тогда возвращает конкретные промежуточные результаты вычислений. Ваш пример:
Цитата:
Соответственно для вычисления функция вызывает саму себя для a и для b. В следующем шаге вычисляется a (или b без разницы): a=a1*b1, где a1=-x, b1=sin(sqrt(abs(x))). Ну и так далее. По сути Вы также спускаетесь по дереву (только немного другого вида), однако само дерево не строится, все промежуточные вычисления сразу же используются для решения операции более высокого уровня.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 19.09.2012 в 13:09. |
|
19.09.2012, 13:26 | #14 | |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Цитата:
Лично я хранил в обратной польской, а задача стояла в поиске нуля функции, минимума(максимума) разными метода и естественно для некоторых методов требовались первые и вторые производные. Правда я схалявил в плане оптимизации в пользу удобства, как то так: Код:
остальные думаю понятно Ах, да, у меня все просто было, т.к. функция одной переменной =) Раз Utkin расписал свой вариант, распишу свой Преобразовываем -x*sin(sqrt(abs(x)))-y*sin(sqrt(abs(y))) в $x$#unar_minus#$x$#abs##sqrt##sin##*#$y$#abs##sqrt##sin##-# В общем все просто, команды заключены в ##, переменные в $$, а константы у меня лично просто болтаются. Опять таки ВНИМАНИЕ, это если вы хотите удобно работать со строкой, более удобная форма хранения это массив объектов(element, varible: public element, operation: public element, const: public element). Далее вы просто бежите по строке(или массиву) слева на право и переменные(значения переменных) и константы толкаете в стек, затем когда встречаете операцию, применяете ее к одному или нескольким элементам стека, т.е. выталкиваете из стека необходимое кол-во значений, работаете с ними и пихаете обратно в стек результат, в конце концов у вас в стеке должен остаться только один элемент, который и является решением. Последний раз редактировалось Kostia; 19.09.2012 в 14:02. |
|
19.09.2012, 13:38 | #15 | ||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
ЗЫ. Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Решение математического выражения | DeadWarlock | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 18.09.2012 18:23 |
вычисление математического выражения | Gunina | Помощь студентам | 4 | 12.09.2012 17:34 |
чтение из файла математического выражения | Student1992 | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 14.11.2011 02:40 |
решение математического выражения | akum905 | Общие вопросы C/C++ | 0 | 12.11.2011 00:04 |
Cоздание дерева математического выражения | CilCatblack | Общие вопросы C/C++ | 3 | 20.04.2009 14:22 |