Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2012, 11:47   #11
wol4aravio
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 18
По умолчанию

Цитата:
Обратная польская нотация не понравилась?
Не не понравилась))) интересовался просто, есть ли более быстрые алгоритмы, это бы очень пригодилось
wol4aravio вне форума Ответить с цитированием
Старый 19.09.2012, 12:51   #12
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Не не понравилась))) интересовался просто, есть ли более быстрые алгоритмы, это бы очень пригодилось
Цитата:
переводится в постфиксную форму, по которой потом строится дерево выражения
Постфиксная форма == обратная польская нотация, разве не?
Код:
                           -
                          / \
                         /   \
                        *     E
                       / \
                      /   \
                     /     \
                    /       \
                   +         +
                  / \       / \
                 /   \     /   \
                A     B   C     D
Есть тоже что и AB+CD+*E- (Капитан том 5 :D )
Тут подробный алгоритм: http://algolist.manual.ru/syntax/revpn.php
Правильно его модифицировав можно легко(быстро) считать и значения функций и производные n-го порядка.

Последний раз редактировалось Kostia; 19.09.2012 в 12:54.
Kostia вне форума Ответить с цитированием
Старый 19.09.2012, 13:02   #13
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я уже предлагал не строить никаких деревьев, а разбирать выражение рекурсивно. Я так делал на c#, время работы вполне приличное (в том смысле, что на глаз не видно за какое время считает). Суть там та же, но под другим углом зрения. Я ведь так понимаю Вам нужна интерпретация, а не компиляция. Ваш метод нужен именно для компиляции. При разборе следует использовать одну функцию, которая разбирает выражения вызывая саму себя, до тех пор пока не спустится до примитивов и только тогда возвращает конкретные промежуточные результаты вычислений. Ваш пример:
Цитата:
-x*sin(sqrt(abs(x)))-y*sin(sqrt(abs(y)))
Есть выражение вида a-b, где a=-x*sin(sqrt(abs(x))), b=y*sin(sqrt(abs(y)))
Соответственно для вычисления функция вызывает саму себя для a и для b. В следующем шаге вычисляется a (или b без разницы):
a=a1*b1, где a1=-x, b1=sin(sqrt(abs(x))). Ну и так далее. По сути Вы также спускаетесь по дереву (только немного другого вида), однако само дерево не строится, все промежуточные вычисления сразу же используются для решения операции более высокого уровня.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 19.09.2012 в 13:09.
Utkin вне форума Ответить с цитированием
Старый 19.09.2012, 13:26   #14
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Я уже предлагал не строить никаких деревьев, а разбирать выражение рекурсивно. Я так делал на c#, время работы вполне приличное (в том смысле, что на глаз не видно за какое время считает).
Если потребуется многочисленные вычисления значения функции, то лучше хранить выражение уже разобранным в какой либо форме(обратная польская например), а уж разбирать его можно как угодно.
Лично я хранил в обратной польской, а задача стояла в поиске нуля функции, минимума(максимума) разными метода и естественно для некоторых методов требовались первые и вторые производные. Правда я схалявил в плане оптимизации в пользу удобства, как то так:
Код:
solve(const char *pol_str, double x, int der = 0);
где der - производная
остальные думаю понятно
Ах, да, у меня все просто было, т.к. функция одной переменной =)

Раз 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.
Kostia вне форума Ответить с цитированием
Старый 19.09.2012, 13:38   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Если потребуется многочисленные вычисления значения функции, то лучше хранить выражение уже разобранным в какой либо форме(обратная польская например), а уж разбирать его можно как угодно.
Это будет удобно только если все выражения известны заранее либо если в выражении используется много одинаковых аргументов иначе от оптимизации не будет толку. Но проблема в том, что выражения вводит юзер, а он скорее всего не будет вводить неоптимизированные выражения. То есть вероятность наступления случая когда будет применима оптимизация мала, в тоже время как расходы на ее проведения будут всегда.

ЗЫ.
Цитата:
т.к. функция одной переменной =)
В моих функциях было произвольное число аргументов (я писал язык программирования).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение математического выражения 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