Нужно написать ф-цию, которая бы брала производную от математической ф-ции. То есть на входе есть 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++.
Здравствуйте, 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++.
То есть Split ищет "подфункции 1-ого порядка" внутри функции, выделяет их в объекты класса Function, записывает указатели на них в functions. Также в классе Function хранится информация об операции, которая выполняется над данной ф-цией(+, -, *, /), и указатель на ф-цию, с которой эта операция выполняется(то есть если есть "(x+3)*(2*x+5)" то this.f="x+3", this.GetOperation вернет 3 что значит *, this.GetOperand->f вернет "2*x+5".
Я на правильном пути?
Здравствуйте, 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";
Здравствуйте, ansi, Вы писали:
A>Я так думаю, надо построить дерево выражения. Как строить дерево, если не знаешь, ищи по ключевым словам польская нотация, постфиксная польская запись, алгоритм Дейкстры (точно есть на http://algolist.manual.ru в разделе компиляторов и разбора выражений).
A>Ну а дальше все довольно просто...
Кстати, алгоритм нахождения производной по дереву выражения хорошо расписан у Кнута.
Здравствуйте, What, Вы писали:
W>Здравствуйте, ansi, Вы писали:
A>>Я так думаю, надо построить дерево выражения. Как строить дерево, если не знаешь, ищи по ключевым словам польская нотация, постфиксная польская запись, алгоритм Дейкстры (точно есть на http://algolist.manual.ru в разделе компиляторов и разбора выражений).
A>>Ну а дальше все довольно просто... W>Кстати, алгоритм нахождения производной по дереву выражения хорошо расписан у Кнута.
Здравствуйте, 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 не существует ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 метра ? Ну если сложно то не обязательно
Здравствуйте, 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пасибо за любые советы.
У меня есть написанное построение дерева из выражения(ногами не пинай сильно, это опыт Х-летней давности)
Нужно — могу выслать(стучитсь в приват)
Здравствуйте, 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
есть старые исходники готового класса для парсинга/дифференцирования 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. Процедура дифференцирования впринципе не сложна. Т.е. дифференцирование по частям.