Re: Дифференцирование функции. С чего начать?
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 20.03.07 13:20
Оценка: +3 :)))
Здравствуйте, Ujniy, Вы писали:

U>Всем доброе время суток! Подскажите пожалуйста, как ПРАВИЛЬНО найти производную функции

U>одной переменной, что можно прочитать по этому поводу? На входе строка или массив, например
U>"arctg(1/x) — x^2" на выходе, соответственно должно быть "(-1 – 2*x^3 – 2*x )/ (x^2 + 1)".

Казалось бы, причём тут SICP?
... << RSDN@Home 1.2.0 alpha rev. 672>>
Дифференцирование функции. С чего начать?
От: Ujniy  
Дата: 18.03.07 16:54
Оценка:
Всем доброе время суток! Подскажите пожалуйста, как ПРАВИЛЬНО найти производную функции
одной переменной, что можно прочитать по этому поводу? На входе строка или массив, например
"arctg(1/x) — x^2" на выходе, соответственно должно быть "(-1 – 2*x^3 – 2*x )/ (x^2 + 1)".
Re: Дифференцирование функции. С чего начать?
От: Vintik_69 Швейцария  
Дата: 18.03.07 16:59
Оценка:
Здравствуйте, Ujniy, Вы писали:

U>Всем доброе время суток! Подскажите пожалуйста, как ПРАВИЛЬНО найти производную функции

U>одной переменной, что можно прочитать по этому поводу? На входе строка или массив, например
U>"arctg(1/x) — x^2" на выходе, соответственно должно быть "(-1 – 2*x^3 – 2*x )/ (x^2 + 1)".

Основная идея — парсим выражение в дерево, дальше идем по дереву, применяя правила дифференцирования и строя другое дерево — дерево производной. Полученное дерево выводим.
Re[2]: Дифференцирование функции. С чего начать?
От: Ujniy  
Дата: 18.03.07 17:07
Оценка:
Здравствуйте, Vintik_69, Вы писали:

V_>Здравствуйте, Ujniy, Вы писали:


U>>Всем доброе время суток! Подскажите пожалуйста, как ПРАВИЛЬНО найти производную функции

U>>одной переменной, что можно прочитать по этому поводу? На входе строка или массив, например
U>>"arctg(1/x) — x^2" на выходе, соответственно должно быть "(-1 – 2*x^3 – 2*x )/ (x^2 + 1)".

V_>Основная идея — парсим выражение в дерево, дальше идем по дереву, применяя правила дифференцирования и строя другое дерево — дерево производной. Полученное дерево выводим.



Большое спасибо за ваш ответ! Не подскажите книгу или другой источник с примером?
И возможно ли стек использовать вместо дерева? Я, признаюсь, с деревьями не работал пока...
Re[3]: Дифференцирование функции. С чего начать?
От: k55 Ниоткуда  
Дата: 19.03.07 07:53
Оценка:
Здравствуйте, Ujniy, Вы писали:


U>Большое спасибо за ваш ответ! Не подскажите книгу или другой источник с примером?

U>И возможно ли стек использовать вместо дерева? Я, признаюсь, с деревьями не работал пока...

Книга называется "Красный дракон". http://www.ozon.ru/context/detail/id/146264/
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re[3]: Дифференцирование функции. С чего начать?
От: Кодт Россия  
Дата: 19.03.07 11:55
Оценка:
Здравствуйте, Ujniy, Вы писали:

U>И возможно ли стек использовать вместо дерева? Я, признаюсь, с деревьями не работал пока...


С деревьями будет наиболее очевидно. Но и со стеком можно, правда, на выходе всё равно будет дерево.

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

Грамматика у нас операторная, поэтому элементы стека — это чередующиеся операторы и операнды.
Операнд — это пара (выражение, его производная).

Правила трансформации такие:
(f,f') "+" (g,g') --> (f+g, f'+g')
(f,f') "*" (g,g') --> (f*g, f*g'+f'*g)
откуда они берутся: если исходное выражение было f*g, то, зная f,f', g,g', мы узнаём и результат комбинации f*g, и производную этой комбинации fg'+f'g
Ну и так далее:
"fun" (f,f') --> (fun(f), fun'(f)*f')
(f,f') "^" "const" --> (f^const, const*f^(const-1))

Маленькая выгода: мы можем хранить операнды прямо в виде строк, а не в виде синтаксических деревьев.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Дифференцирование функции. С чего начать?
От: What Беларусь  
Дата: 20.03.07 12:40
Оценка:
Здравствуйте, Ujniy, Вы писали:
U>Большое спасибо за ваш ответ! Не подскажите книгу или другой источник с примером?
U>И возможно ли стек использовать вместо дерева? Я, признаюсь, с деревьями не работал пока...
У Кнута есть описание этого алгоритма, к сожалению не помну какой том.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Дифференцирование функции. С чего начать?
От: LaptevVV Россия  
Дата: 22.03.07 09:28
Оценка:
Здравствуйте, What, Вы писали:

W>Здравствуйте, Ujniy, Вы писали:

U>>Большое спасибо за ваш ответ! Не подскажите книгу или другой источник с примером?
U>>И возможно ли стек использовать вместо дерева? Я, признаюсь, с деревьями не работал пока...
W>У Кнута есть описание этого алгоритма, к сожалению не помну какой том.
В первом.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Дифференцирование функции. С чего начать?
От: demi США  
Дата: 26.03.07 21:20
Оценка:
Здравствуйте, Vintik_69, Вы писали:

V_>Здравствуйте, Ujniy, Вы писали:


U>>Всем доброе время суток! Подскажите пожалуйста, как ПРАВИЛЬНО найти производную функции

U>>одной переменной, что можно прочитать по этому поводу? На входе строка или массив, например
U>>"arctg(1/x) — x^2" на выходе, соответственно должно быть "(-1 – 2*x^3 – 2*x )/ (x^2 + 1)".

V_>Основная идея — парсим выражение в дерево, дальше идем по дереву, применяя правила дифференцирования и строя другое дерево — дерево производной. Полученное дерево выводим.


Делал я такую штуку таким же методом. Этот этап прост. Над чем парился — это упрощения выражений. Уж очень неудобоваримые эти деревья в текстовом виде. И так и сяк, но до идеала не дошел. И дело не только в том, что человеку плохо видно. Даже если с производной будет иметь делло только машина, иногда хочется трансформировать ее так, чтобы ее выисление было бы максимально быстрым.
Не стыдно попасть в дерьмо, стыдно в нём остаться!
Re: Дифференцирование функции. С чего начать?
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 28.03.07 07:10
Оценка:
Здравствуйте, Ujniy, Вы писали:

U>Всем доброе время суток! Подскажите пожалуйста, как ПРАВИЛЬНО найти производную функции

U>одной переменной, что можно прочитать по этому поводу? На входе строка или массив, например
U>"arctg(1/x) — x^2" на выходе, соответственно должно быть "(-1 – 2*x^3 – 2*x )/ (x^2 + 1)".

ну если по-быстрому, чтобы лабу сдать, то первая же ссылка в гугле: http://pascal.sources.ru/math/analize.htm
А так по символьным вычислениям достаточно много литературы. Указанный "красный дракон" имеет к этому отношение постолько-поскольку. Конкретно символьное дифференцирование было рассмотрено в книге А. Шеня — не помню правда точно как называется — одна из первых в двух томах. Зарубежных гораздо больше:
Cohen J.S. Computer algebra and symbolic computation 2003
Fischer, Warsitz. Complexity of derivatives generated by symbolic differentiation
Smith. Symbolic derivatives without recursion
"Что не завершено, не сделано вовсе" Гаусс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.