Символьное дифференцирование

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Символьное дифференцирование

Сообщение avelon » 15.02.2011 18:21:41

Имеется обратная польская запись некоторой функции, как вычислить аналитическую производную?
avelon
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.11.2010 20:00:06

Re: Символьное дифференцирование

Сообщение Kitayets » 16.02.2011 16:26:03

в чём сложность? или это опять контрольное задание для не очень ответственного студента?

вы сами без программы призводную от функции аналитически брать умеете?

или вас смущает обратная польская запись?

или вы ищете готовое решение?
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Символьное дифференцирование

Сообщение avelon » 16.02.2011 21:23:33

аналитически на бумажке без проблем решу.
это не контрольное задание. я сам химик и приходиться писать проги под свои задачи. есть конечно математические пакеты где легко берется производная, но это не удобно+большой объем экспериментальных данных, что приводит к очень муторной работе, хотелось бы автоматизировать этот труд.
обратная польская нотация не смущает, но не понятно как по ней брать производную
готовое решение это крайний случай, лучше самому писать, чтобы раз разобраться и на всегда
можно и без обратной польской нотации предложить алгоритм если кто знает
avelon
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.11.2010 20:00:06

Re: Символьное дифференцирование

Сообщение Mr.Smart » 16.02.2011 21:34:41

Вычисление производится на стеке. Алгоритм не заурядный и довольно простой. Алгоритм можно посмотреть тут [url]http://ru.wikipedia.org/wiki/Обратная_польская_запись#.D0.92.D1.8B.D1.87.D0.B8.D1.81.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F_.D0.BD.D0.B0_.D1.81.D1.82.D0.B5.D0.BA.D0.B5[/url].
Ссылка плохо вставляется.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Символьное дифференцирование

Сообщение avelon » 16.02.2011 21:52:00

по ссылке со способом вычисления выражения то все понятно, но не доходит как это употребить к правилам дифференцирования
avelon
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.11.2010 20:00:06

Re: Символьное дифференцирование

Сообщение hinst » 16.02.2011 23:03:54

Mr.Smart, почему в википедии алгоритм на Delphi в хрен-знает-сколько раз длиннее, чем на C++? что за бардак...
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Символьное дифференцирование

Сообщение Mr.Smart » 16.02.2011 23:25:21

hinst не знаю. Википедию не правлю :oops: Да не очень-то мне данный ресурс симпатизирует...

Добавлено спустя 19 минут 35 секунд:
avelon, а вы начните с простого +-*/() - далее вам помогут, если будут проблемы.

п.с. Я удивляюсь людям, которые сами не пробовав чего либо просят помочь.
Последний раз редактировалось Mr.Smart 17.02.2011 13:37:22, всего редактировалось 1 раз.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Символьное дифференцирование

Сообщение Kitayets » 17.02.2011 12:35:15

google великая сила!
4-ая ссылка по запросу "дифференцирование":
http://ice_diff.chat.ru/gl2/gl2.htm

Добавлено спустя 57 минут 28 секунд:
hinst писал(а):Mr.Smart, почему в википедии алгоритм на Delphi в хрен-знает-сколько раз длиннее, чем на C++? что за бардак...

там с примерами всё туго.
Про хаскель судить сложно, но вроде там вычисление выражения записанного в ОПН. Т.е. на входе "2 3 +" - на выходе 5.
Примеры же на с++ и делфи - перевод выражения из обычной нотации в ОПН, т.е. на входе "2 + 3 + х" - на выходе "2 3 х +". Пример на делфи длиннее потому, что обрабатывает ещё и скобки. Т.е. пример на делфи "круче", чем на с++.

При этом - не думаю, что алгоритм дифференцирования зависит от нотации. Мне кажется тут 2 этапа (для функции одной переменной):
1. привезти функцию к полиномиальному виду
2. пройтись по каждому члену полинома и применить к нему правила дифференцирования (из школьной таблички).
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Символьное дифференцирование

Сообщение avelon89 » 25.02.2011 01:10:05

написал программу переводящую все в ОПН.
задаем функцию в программе например x^3+2*x+x-2
на выходе строка x 3.0 ^2.0 x *+x +2.0 -
вроде как правильно получается))
как дальше дефференцировать пошагово кто нибудь может рассказать?
avelon89
незнакомец
 
Сообщения: 2
Зарегистрирован: 07.11.2010 19:25:57

Re: Символьное дифференцирование

Сообщение Kitayets » 25.02.2011 18:18:16

avelon89 писал(а):написал программу переводящую все в ОПН.
задаем функцию в программе например x^3+2*x+x-2
на выходе строка x 3.0 ^2.0 x *+x +2.0 -
вроде как правильно получается))
как дальше дефференцировать пошагово кто нибудь может рассказать?


avelon89 - почему вы так прицепились к ОПН?

ОПН - это вообще средство для промежуточного представления выражений, которое имеет бонус при вычислении выражения. Вам то как раз и не нужно вычислять его! Вам нужно такое представление, которое позволит Вам дифференцировать его.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Символьное дифференцирование

Сообщение avelon » 25.02.2011 19:17:17

насколько я знаю. можно дифференцировать через деревья и через ОПН. выбрал ОПН.
нашел вот такую статью. кто нибудь может помочь разобраться с алгоритмом, а то я прочитал но не со всем понял как его реализовать(

Добавлено спустя 2 минуты 36 секунд:
да и ОПН тоже имеет тоже самое представление что и дерево выражения. так что без разницы что выбирать. но у меня уже реализован ОПН, зачем мне заново писать код для дерева
Вложения
derivation.rar
внутри архива статья
(211.74 КБ) Скачиваний: 570
avelon
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.11.2010 20:00:06

Re: Символьное дифференцирование

Сообщение avelon » 04.03.2011 18:03:55

у кого нибудь есть идеи?
avelon
незнакомец
 
Сообщения: 7
Зарегистрирован: 07.11.2010 20:00:06

Re: Символьное дифференцирование

Сообщение Kitayets » 10.03.2011 11:04:55

2 avelon

там в abstract же написано - простой алгоритм для численного решения производной функции БЕЗ генерации компьютерного представления дифференцированного выражения. Т.е. автор статьи как раз разработал алгоритм вычисления производной функции без стадии аналитического символьного дифференцирования.

т.е. статья Вам не подходит.

Для более конкретного разговора - дайте пример нескольких функций которых Вам необходимо дифференцировать в приложении. Штуки 3 - 1 простую, 1 среднюю и 1 самую сложную которая встречается в Ваших данных.

Добавлено спустя 11 минут 42 секунды:
кстати в статье в первом параграфе написано, что "обычно", в те времена (начало 80'х), вычислительные пакеты сначала аналитически находили производную функцию переводя исходную функцию в удобное "алгебраическое" (инфиксную нотацию) представление и вычисляли производную по частям.

т.е. точно так, как я Вам советовал выше http://freepascal.ru/forum/viewtopic.php?f=13&t=6762&p=51501#p50758

Добавлено спустя 2 часа 28 секунд:
и всётаки советую ещё раз почитать: http://ice_diff.chat.ru/ написано муторно но верно, там же есть список литературы - http://ice_diff.chat.ru/lit.htm.

в двух словах - используется представление функций в виде кодового списка, или программы (схемы) Канторовича. где каждый элемент содержит одну бинарную операцию (арифметическую операцию) и два значения (операнда) или одну унарную операцию, примененную к одному операнду. Каждая строка (элемент) кодового списка представляет элементарную задачу для дифференцирования.

Рассматривается алгоритм создания такого представления из ОПН и алгоритм дифф. по кодовым спискам., на выходе получается кодовый список - который можно вывести обратно в ОПН.

Читать довольно сложно, потому что во первых рассматривается общий случай - дифференцирование произвольной степени по произвольному количеству переменных. Во вторых описывается программа которая на входе получает программу на одном из языков программирования (с расширениями) с функциями, и работая квк препроцессор анализируя подставляет в неё уже дифф. функции.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Символьное дифференцирование

Сообщение daesher » 09.05.2011 20:09:56

"Прикрутил" обратную польскую нотацию (перевод в неё) к моему vvfstat.sf.net, правда, совершенно для других целей
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Символьное дифференцирование

Сообщение Kitayets » 10.05.2011 09:03:04

Кстати в FCL есть модуль symbolic - в котором есть кое-чего интересного, включая ОПН.

вот из доки:

Код: Выделить всё
Key features:
--------------
...
- Expression parsing and conversion:
      - Infix to RPN
      - infix to Parsetree
      - Parsetree to infix
      - Parsetree to RPN

- Symbolic Expression handling.
   - Simple operators on expressions + / * - ^
   - Derivation of simple functions (all operators + most functions in math
     unit)
   - taylor polynomal.
   - Precalculate Newton. (almost non-feature :-)
   - Primitives for rearranging
                - Identifying of terms.
                - Simple simplying (2*2*x -> 4*x)
                - (de)factoring (*)
                - Rearrange so that when converted to RPN, maximal stack depth
                  for evaluation is 4. This also needs a detector routine
                  (determine required RPN stack room)
   - Operator overloading possible?

- High speed evaluating. (parse once, evaluate often principle)
   - Infinite variables
   - Infinite (symbolic) constants.
   - Fast (hopefully)
   - Structure designed so that a lowlevel (processor dependant) version of
      the core evaluating routine is possible.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru