Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 30
1

Нахождение производной (символьное дифференцирование)

14.04.2018, 10:44. Показов 2466. Ответов 11

Нужно написать программу для нахождения производной с двумя переменными.
Например: (2x+1)' = 2; (cosx)' = -sinx; (tgx)' = 1/cos^2x и т. д. (т. е. по таблице производной).

Каким способом это можно сделать и с чего начать?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2018, 10:44
Ответы с готовыми решениями:

Символьное дифференцирование
Требуется реализовать класс Expression с чисто виртуальными методами Expression *diff(); и void...

Символьное дифференцирование cos и sin
Здравствуйте. Хочу написать символьное дифференцирование cos и sin. Производную sin определяю через...

Класс "Символьное дифференцирование"
Помогите пожалуйста с созданием такого класса. НОВЫЕ ПОНЯТИЯ: наследование, виртуальные методы. ...

Нахождение производной
Задача: по заданному дереву построить дерево производную. Не могу придумать алгоритм. Не могли бы...

11
Модератор
Эксперт С++
11071 / 9128 / 5485
Регистрация: 18.12.2011
Сообщений: 24,400
14.04.2018, 10:49 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
const string fs[3]={"2x+1","cosx","tgx"};
const string der[3]={"2","-sinx","1/cos^2(x)"};
string inp;
cin>>inp;
for(int i=0;i<3;i++)
{
   if(inp==fs[i])
   {
      cout<<der[i];
      break;
   }
}
0
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 30
14.04.2018, 10:55  [ТС] 3
Это ведь не вся таблица, да и комбинации выражений из двух переменных могут быть разными.
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
14.04.2018, 11:00 4
Цитата Сообщение от FeelsRainMan Посмотреть сообщение
с чего начать?
Скажем, нужно начать с лексического анализа введенного выражения и построения синтаксического дерева. А пробежавшись по дереву, уже можно вычислить производную.
0
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 30
14.04.2018, 11:05  [ТС] 5
Окей, но как именно? Есть ли какой-нибудь пример или нечто похожее, работающее по такому принципу?
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
14.04.2018, 11:31 6
FeelsRainMan, попробуй вбить в поиск "парсер математических выражений" или "метод рекурсивного спуска".
Сложность будет зависеть от смысла, который ты вкладываешь во фразу:
Цитата Сообщение от FeelsRainMan Посмотреть сообщение
производной с двумя переменными
0
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 30
14.04.2018, 19:05  [ТС] 7
Цитата Сообщение от nonedark2008 Посмотреть сообщение
попробуй вбить в поиск "парсер математических выражений" или "метод рекурсивного спуска"
Чего-то совсем не понятно что и как.
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
15.04.2018, 01:13 8
Цитата Сообщение от FeelsRainMan Посмотреть сообщение
Чего-то совсем не понятно что и как.
А конкретнее? Тебе надо в строке определить что есть где: где числа, где переменные, где функции и где операции.
Для этого нужен парсер. Его задача пробежаться по строке и вернуть поток лексем. Этот поток лексем передается лексическому анализатору, который проверяет корректность выражения и строит синтаксическое дерево. Такое дерево может быть построено методом рекурсивного спуска.

По-хорошему это все так делается. А по плохому... не знаю, никогда не пробовал. Если еще не поздно, то уточни у своего преподавателя то, что он надеется увидеть в твоей программе.
1
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 30
15.04.2018, 16:33  [ТС] 9
Просто впервые слышу о парсере и не понимаю как его применить к моей задаче.
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
15.04.2018, 22:38 10
Цитата Сообщение от FeelsRainMan Посмотреть сообщение
Просто впервые слышу о парсере и не понимаю как его применить к моей задаче.
Достаточно открыть любой пример на любом языке по теме.
Самый банальный вариант: создаешь перечисление с элементами типа: константа, переменная, операция, откр/закр скобка, функция и т.п.
И тебе нужно создать обработчик, который, получив на вход строку, предоставляет следующую информацию:
а вот сейчас идет константа со значением 3, а после операция умножения, потом открывающая скобка, а потом переменная с именем x и т.д. Короче, размечаешь что есть что в строке.
А потом исходная строка уже не нужна, ты работаешь только с потоком лексем.
1
0 / 0 / 0
Регистрация: 27.11.2017
Сообщений: 30
17.04.2018, 16:52  [ТС] 11
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Достаточно открыть любой пример на любом языке по теме.
Собственно, так и сделал. Погуглил, посмотрел коды (например: http://coliru.stacked-crooked.... c0f0a8558e ) и немного разобрался (хотя бы появилось общее представление).
Цитата Сообщение от nonedark2008 Посмотреть сообщение
И тебе нужно создать обработчик, который, получив на вход строку, предоставляет следующую информацию:
а вот сейчас идет константа со значением 3, а после операция умножения, потом открывающая скобка, а потом переменная с именем x и т.д.
Я так понял это и есть этот обработчик.
И что теперь?
Цитата Сообщение от nonedark2008 Посмотреть сообщение
А потом исходная строка уже не нужна, ты работаешь только с потоком лексем.
Как этот поток преобразовать в производную?
0
1360 / 997 / 316
Регистрация: 28.07.2012
Сообщений: 2,759
17.04.2018, 21:30 12
Цитата Сообщение от FeelsRainMan Посмотреть сообщение
Я так понял это и есть этот обработчик.
Что-то типа того. Пример, который ты нашел, сразу строит синтаксическое дерево.
Цитата Сообщение от FeelsRainMan Посмотреть сообщение
Как этот поток преобразовать в производную?
Довольно просто. Твое выражение представлено в виде дерева. В корне у тебя узел какого-то типа (операция, функция и т.п.), дети представляют из себя аргументы этих операций (Скажем, в узле лежит плюс, а в двух его детях - его аргумент слева и справа). Ну и по тому же примеру, производная по операции сложения - это сумма производных правой и левой частей. Т.е. для каждой типа узла тебе нужно его производную выразить через его детей.
Советую порисовать синтаксические деревья, сразу понятно станет.

Добавлено через 1 минуту
FeelsRainMan, должен получиться аналог eval из примера.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2018, 21:30

Нахождение производной
Здравствуйте, ищу помощи в написании кода для нахождения производной Напишите пожалуйста пример...

Нахождение первой производной
Добрый вечер! У меня возник вопрос, каким методом легче реализовать нахождение первой производной...

Нахождение производной функции
Народ как найти производные функцый ? В программе

Нахождение минимального корня 2й производной
Нужно найти минимальный корень 2й производной на отрезке, допустим от -10 до 10. deltaX =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.