Производная

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
Дрюль
Сообщения: 18
Зарегистрирован: 15 окт 2004, 16:14

20 янв 2005, 15:12

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

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

Что-то вроде следующего фрагмента (так как эта функция стопудово работать не будет (реализовать ещё не пробовал), просьба считать её псевдокодом :) ):


string deriv (tree *root) {
if (isdigit(root->data))
return '0';
string oper = root->data;
switch (oper[0]) {
case 'x': return '1';
case '+':
case '-': return deriv(root->left) + oper + deriv(root->right);
case '*': '(' + deriv(root->left) + ")*(" + str(root->right) + ")+(" + deriv(root->right) + ")*(" + str(root->left) + ')';
case '/': "((" + deriv(root->left) + ")*(" + str(root->right) + ")-(" + deriv(root->right) + ")*(" + str(root->left) + "))/((" + str(root-right) + ")*(" + str(root-right) + "))";
default : return oper + '(' + str(root-left) + ")*(" + deriv(root->right) + ')';
}
}
где string str(tree *root) {...} - функция перевода дерева в строчку, а root->data типа string.
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

20 янв 2005, 15:53

Больше специфики. Функция - полином?

Производную функции sin(1/x)*e^x/ ln x * J0(x) * delta
где J0 - бессель а delta - дельта-функция дирака оно тоже будет
находить?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

20 янв 2005, 15:54

Для того, чтобы работать с полиномами, возьмите PCCTS, там есть ПРИМЕР разбора полинома.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Дрюль
Сообщения: 18
Зарегистрирован: 15 окт 2004, 16:14

20 янв 2005, 16:46

Нет, функция - не полином
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

20 янв 2005, 19:26

Тоды надо:

1. Трясти спецификацию, типа как именно представлена функция. А именно - какие функции там могут содержаться.

2. Описывать грамматику разбора мат. выражения. Чтобы облегчить задачу, можно уже готовую грамматику PCCTS взять за основу и туда добавлять то, что надо (sin/cos/exp/ln)
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Ответить