Санкт-Петербургский Государственный Электротехнический
Университет «ЛЭТИ»
Кафедра МОЭВМ
Лабораторная работа по программированию
«Аналитическое дифференцирование»
О Т Ч Е Т
Факультет КТИ
группа 3341
студент Марьяскин Е.
Санкт-Петербург
2005 г.
Постановка задачи.
Содержательная постановка задачи.
Вывести производную функции, записанной во входном текстовом файле.
Пример решения задачи.
Если во входном файле строка X^2-a*X, то на выходе должно быть 2*X-a
Входные данные.
Файл, имя которого задается с клавиатуры, содержащий строку с дифференцируемой функцией. Также входными данными является переменная дифференцирования, задаваемая пользователем.
Выходные данные.
Файл Fout.txt, отображающий этапы выполнения дифференцирования и окончательный результат.
Сценарий диалога с пользователем.
На каждом шаге анализа входной строки и дифференцирования пользователь информируется о процессе работы программы специальными программными сообщениями. Кроме того после каждого дифференцирования пользователю предлагается продолжить дифференцировать полученную функцию.
Описание алгоритма.
Изначально, входная строка разбивается на операции и операнды. Из них составляется массив, который содержит сведения о том, операция это, или операнд. Если операция – хранится ее индивидуальный код и приоритет выполнения. Если операнд – его значение. Попутно с заполнением массива, также происходит проверка на корректность строки. В программе обрабатываются следующие операции:
Х+У Вычисление суммы Х и У
Х-У Вычисление разности Х и У
Х*У Вычисление произведения Х и У
Х/У Вычисление отношения Х к У
^ Вычисление Х в степени У(У – численная константа)
√(Х) Вычисления квадратного корня из Х
Sin(X) Вычисление синуса Х
Cos(X) Вычисление косинуса Х
log(X) Вычисление натурального логарифма Х
exp(X) Вычислениеeв степени Х
asi(X) Вычисление арксинуса Х
atg(X) Вычисление арктангенса Х
Остальные из основных функций легко выражаются через вышеозначенные.
Затем из этого массива формируется дерево по принципу приоритета операций и с учетов вычисления слева-направо. Т.е. в корне окажется самая правая из операций самого низкого приоритета. Каждый элемент дерева содержит три параметра: знак операции этого узла(или сведения о константе), часть функции, представляемую поддеревьями этого элемента и производную этой части функции. После введения пользователем переменной дифференцирования в дереве заполняются значения функций и их производных для листьев дерева: там и только там оказываются операнды. Далее находится первый в обходе элемент, у которого есть сыновья, но нет внуков, и в нем вычисляются функция и производная. Их всегда можно выразить через функции и производные сыновей. Затем сыновья удаляются. Этот процесс продолжается, пока в дереве не останется 1 элемент. Производная «дошедшей» до него части функции и есть искомая строка.
Константы представляются как строки и не подлежат приведению подобных, т.е. программа не представит, например, 5+2 как 7, но во всех вычислениях константы «0», «1» и «-1» обрабатываются отдельно, что позволяет значительно упростить конечный вид формулы.