Дифференциирование
От: RiNSpy  
Дата: 18.06.05 18:07
Оценка:
Здравствуй, All,

Нужно написать ф-цию, которая бы брала производную от математической ф-ции. То есть на входе есть string типа "((3*x+x^2-5)/(6*x^3-x/2+4)*(5*x+6)+5*x)+x", на выходе моя ф-ция должна давать string c производной. На входной string есть ограничения — в нем не могут быть сложные функции(типа "x^(3*x+2)"), но зато могут быть вложенные скобки. Из мат. функций используются только сложение, вычитание, деление, умножение, возведение в степень, sin(x) и cos(x). Подскажите pls как к этой проблеме подступиться, интересно, какое здесь есть наиболее красивое решение. Да, ф-цию пишу на c++.

Cпасибо за любые советы.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Дифференциирование
От: RiNSpy  
Дата: 18.06.05 18:41
Оценка:
Здравствуйте, RiNSpy, Вы писали:

RNS>Здравствуй, All,


RNS>Нужно написать ф-цию, которая бы брала производную от математической ф-ции. То есть на входе есть string типа "((3*x+x^2-5)/(6*x^3-x/2+4)*(5*x+6)+5*x)+x", на выходе моя ф-ция должна давать string c производной. На входной string есть ограничения — в нем не могут быть сложные функции(типа "x^(3*x+2)"), но зато могут быть вложенные скобки. Из мат. функций используются только сложение, вычитание, деление, умножение, возведение в степень, sin(x) и cos(x). Подскажите pls как к этой проблеме подступиться, интересно, какое здесь есть наиболее красивое решение. Да, ф-цию пишу на c++.


Первое, что приходит в голову:

Написать класс Function:

class Function()
{
public:
    ...
    string f;
    void Split();
    bool Diff();
    int GetOperation();
    Function* GetOperand();
    Function** functions;
    ...
private:
    ...
}

То есть Split ищет "подфункции 1-ого порядка" внутри функции, выделяет их в объекты класса Function, записывает указатели на них в functions. Также в классе Function хранится информация об операции, которая выполняется над данной ф-цией(+, -, *, /), и указатель на ф-цию, с которой эта операция выполняется(то есть если есть "(x+3)*(2*x+5)" то this.f="x+3", this.GetOperation вернет 3 что значит *, this.GetOperand->f вернет "2*x+5".
Я на правильном пути?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Дифференциирование
От: fefelov Россия  
Дата: 18.06.05 21:22
Оценка: +1
Здравствуйте, RiNSpy, Вы писали:

RNS>Нужно написать ф-цию, которая бы брала производную от математической ф-ции.


Я бы встроил в программу интерпретатор Пролога и делегировал бы дифференцирование ему.
Re: Дифференциирование
От: ansi  
Дата: 19.06.05 00:26
Оценка: 2 (1) +1
Здравствуйте, RiNSpy, Вы писали:

RNS>Здравствуй, All,


RNS>Нужно написать ф-цию, которая бы брала производную от математической ф-ции. То есть на входе есть string типа "((3*x+x^2-5)/(6*x^3-x/2+4)*(5*x+6)+5*x)+x", на выходе моя ф-ция должна давать string c производной. На входной string есть ограничения — в нем не могут быть сложные функции(типа "x^(3*x+2)"), но зато могут быть вложенные скобки. Из мат. функций используются только сложение, вычитание, деление, умножение, возведение в степень, sin(x) и cos(x). Подскажите pls как к этой проблеме подступиться, интересно, какое здесь есть наиболее красивое решение. Да, ф-цию пишу на c++.


RNS>Cпасибо за любые советы.


Я так думаю, надо построить дерево выражения. Как строить дерево, если не знаешь, ищи по ключевым словам польская нотация, постфиксная польская запись, алгоритм Дейкстры (точно есть на http://algolist.manual.ru в разделе компиляторов и разбора выражений).

Ну а дальше все довольно просто...
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Ace Of Base — Unspeakable";
Re[2]: Дифференциирование
От: What Беларусь  
Дата: 20.06.05 07:33
Оценка:
Здравствуйте, ansi, Вы писали:

A>Я так думаю, надо построить дерево выражения. Как строить дерево, если не знаешь, ищи по ключевым словам польская нотация, постфиксная польская запись, алгоритм Дейкстры (точно есть на http://algolist.manual.ru в разделе компиляторов и разбора выражений).


A>Ну а дальше все довольно просто...

Кстати, алгоритм нахождения производной по дереву выражения хорошо расписан у Кнута.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: Дифференциирование
От: Aviator  
Дата: 20.06.05 09:38
Оценка:
Здравствуйте, What, Вы писали:

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


A>>Я так думаю, надо построить дерево выражения. Как строить дерево, если не знаешь, ищи по ключевым словам польская нотация, постфиксная польская запись, алгоритм Дейкстры (точно есть на http://algolist.manual.ru в разделе компиляторов и разбора выражений).


A>>Ну а дальше все довольно просто...

W>Кстати, алгоритм нахождения производной по дереву выражения хорошо расписан у Кнута.

Кстати Кнут существует в электронном виде ?
Re[4]: Дифференциирование
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.06.05 12:16
Оценка:
Здравствуйте, Aviator, Вы писали:
A>Кстати Кнут существует в электронном виде ?
Кстати да. Кстати, собственно язык TEX был изобретен исключительно ради того, чтобы Кнут был в электронном виде. Есть на lib.ru; у самого кнута есть вроде только бета-версия четвертого тома.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Дифференциирование
От: Аноним  
Дата: 20.06.05 18:33
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

A>>Кстати Кнут существует в электронном виде ?
S>Кстати да. Кстати, собственно язык TEX был изобретен исключительно ради того, чтобы Кнут был в электронном виде. Есть на lib.ru; у самого кнута есть вроде только бета-версия четвертого тома.

Жаль он в техе.. А в каком-нибудь pdf/ps/chm не существует ?
Re[6]: Дифференциирование
От: Silent Bob  
Дата: 20.06.05 19:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Жаль он в техе.. А в каком-нибудь pdf/ps/chm не существует ?


В формате DjVu я недавно качал с адресов:

http://dl2.rapidshare.de/files/1349265/29830652/tom_1.FWC.rar
http://dl2.rapidshare.de/files/1349384/31122903/Tom2.FWC.rar
Пароль на архивы "firewood.net.ru"

Не знаю, работают ли ссылки до сих пор — в любом случае, новые ссылки можно найти на firewood.net.ru
Re[7]: Дифференциирование
От: Аноним  
Дата: 20.06.05 20:02
Оценка:
Здравствуйте, Silent Bob, Вы писали:

SB>Здравствуйте, Аноним, Вы писали:


А>>Жаль он в техе.. А в каком-нибудь pdf/ps/chm не существует ?


SB>В формате DjVu я недавно качал с адресов:


SB>http://dl2.rapidshare.de/files/1349265/29830652/tom_1.FWC.rar

SB>http://dl2.rapidshare.de/files/1349384/31122903/Tom2.FWC.rar
SB>Пароль на архивы "firewood.net.ru"

SB>Не знаю, работают ли ссылки до сих пор — в любом случае, новые ссылки можно найти на firewood.net.ru


А не могли ли Вы поделится этими книжками ? Они не очень большого объёма ?
можно на сюда
Re[8]: Дифференциирование
От: Silent Bob  
Дата: 21.06.05 06:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Silent Bob, Вы писали:


SB>>Здравствуйте, Аноним, Вы писали:


А>>>Жаль он в техе.. А в каком-нибудь pdf/ps/chm не существует ?


SB>>В формате DjVu я недавно качал с адресов:


SB>>http://dl2.rapidshare.de/files/1349265/29830652/tom_1.FWC.rar

SB>>http://dl2.rapidshare.de/files/1349384/31122903/Tom2.FWC.rar
SB>>Пароль на архивы "firewood.net.ru"

SB>>Не знаю, работают ли ссылки до сих пор — в любом случае, новые ссылки можно найти на firewood.net.ru


А>А не могли ли Вы поделится этими книжками ? Они не очень большого объёма ?

А>можно на сюда

По 7 мегов каждая. Ночью залью.
Re[9]: Дифференциирование
От: Аноним  
Дата: 21.06.05 06:32
Оценка:
Здравствуйте, Silent Bob, Вы писали:

SB>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Silent Bob, Вы писали:


SB>>>Здравствуйте, Аноним, Вы писали:


А>>>>Жаль он в техе.. А в каком-нибудь pdf/ps/chm не существует ?


SB>>>В формате DjVu я недавно качал с адресов:


SB>>>http://dl2.rapidshare.de/files/1349265/29830652/tom_1.FWC.rar

SB>>>http://dl2.rapidshare.de/files/1349384/31122903/Tom2.FWC.rar
SB>>>Пароль на архивы "firewood.net.ru"

SB>>>Не знаю, работают ли ссылки до сих пор — в любом случае, новые ссылки можно найти на firewood.net.ru


А>>А не могли ли Вы поделится этими книжками ? Они не очень большого объёма ?

А>>можно на сюда

SB>По 7 мегов каждая. Ночью залью.

Спасибо, буду ждать Только единственная просьба — можно каждый файла на два разбить по 3.5 метра ? Ну если сложно то не обязательно
Re: Дифференциирование
От: LuciferMoscow Россия  
Дата: 21.06.05 06:44
Оценка:
Здравствуйте, RiNSpy, Вы писали:

RNS>Здравствуй, All,


RNS>Нужно написать ф-цию, которая бы брала производную от математической ф-ции. То есть на входе есть string типа "((3*x+x^2-5)/(6*x^3-x/2+4)*(5*x+6)+5*x)+x", на выходе моя ф-ция должна давать string c производной. На входной string есть ограничения — в нем не могут быть сложные функции(типа "x^(3*x+2)"), но зато могут быть вложенные скобки. Из мат. функций используются только сложение, вычитание, деление, умножение, возведение в степень, sin(x) и cos(x). Подскажите pls как к этой проблеме подступиться, интересно, какое здесь есть наиболее красивое решение. Да, ф-цию пишу на c++.


RNS>Cпасибо за любые советы.

У меня есть написанное построение дерева из выражения(ногами не пинай сильно, это опыт Х-летней давности)
Нужно — могу выслать(стучитсь в приват)
Re[2]: Дифференциирование
От: RiNSpy  
Дата: 21.06.05 09:50
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

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


RNS>>Здравствуй, All,


RNS>>Нужно написать ф-цию, которая бы брала производную от математической ф-ции. То есть на входе есть string типа "((3*x+x^2-5)/(6*x^3-x/2+4)*(5*x+6)+5*x)+x", на выходе моя ф-ция должна давать string c производной. На входной string есть ограничения — в нем не могут быть сложные функции(типа "x^(3*x+2)"), но зато могут быть вложенные скобки. Из мат. функций используются только сложение, вычитание, деление, умножение, возведение в степень, sin(x) и cos(x). Подскажите pls как к этой проблеме подступиться, интересно, какое здесь есть наиболее красивое решение. Да, ф-цию пишу на c++.


RNS>>Cпасибо за любые советы.

LM>У меня есть написанное построение дерева из выражения(ногами не пинай сильно, это опыт Х-летней давности)
LM>Нужно — могу выслать(стучитсь в приват)
Пинать не буду, скажу спасибо если вышлешь на RiNSpy[dog]GMail.com

P.S. А на рсдн есть приват?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: Дифференциирование
От: Aviator  
Дата: 21.06.05 10:09
Оценка:
есть старые исходники готового класса для парсинга/дифференцирования ICQ 299500398
Re: Дифференциирование
От: Аноним  
Дата: 21.06.05 20:55
Оценка:
Здравствуйте, RiNSpy, Вы писали:

RNS>Здравствуй, All,


RNS>Нужно написать ф-цию, которая бы брала производную от математической ф-ции. То есть на входе есть string типа "((3*x+x^2-5)/(6*x^3-x/2+4)*(5*x+6)+5*x)+x", на выходе моя ф-ция должна давать string c производной. На входной string есть ограничения — в нем не могут быть сложные функции(типа "x^(3*x+2)"), но зато могут быть вложенные скобки. Из мат. функций используются только сложение, вычитание, деление, умножение, возведение в степень, sin(x) и cos(x). Подскажите pls как к этой проблеме подступиться, интересно, какое здесь есть наиболее красивое решение. Да, ф-цию пишу на c++.


RNS>Cпасибо за любые советы.

Смотрите, Т.е. задача сводится к распознаванию строки и почленного дифференцирования.
1. Вам надо разобрать выражение. Я бы рекомендовал обратиться к обратной польской записи.
2. Процедура дифференцирования впринципе не сложна. Т.е. дифференцирование по частям.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.