М. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие
![]()
|
5.Задания практикумаВсе практические задания предполагают программирование типичных задач анализа и преобразования символьных данных: записей математических выражений, программ или их фрагментов. 5.1.Дифференцирование выраженияТребуется составить рефал-программу, выполняющую дифференцирование заданного выражения, включающего алгебраические операции и известные математические функции. Дифференцирование производится по одной из входящих в это выражение переменных. Входные данные программы имеют вид Dпеременная: выражение, после буквы D указывается имя переменной дифференцирования, а после двоеточия – дифференцируемое выражение, например: Dy:sin(x+2*y)*y^-4+(8*a-b)*sqrt(sin(y-2)+cos(y+9)) Синтаксис дифференцируемого выражения описывается с помощью следующих БНФ-правил: выражение ::= слагаемое | выражение знак_суммирования слагаемое знак_суммирования ::= + | – слагаемое ::= множитель | слагаемое знак_умножения множитель знак_умножения ::= * | / множитель ::= целое_без_знака | переменная | переменная^степень | имя_функции(выражение) | (выражение) | (выражение)^степень переменная ::= идентификатор степень ::= знак целое_без_знака знак ::= пусто | + | – имя_функции ::= sin | cos | ln | exp | sqrt | arcsin | arccos Рефал-программа должна выполнять следующие действия: Проверку синтаксической правильности заданного выражения согласно приведённым БНФ; дифференцирование введённого выражения по заданной переменной; упрощение результата дифференцирования (вычисление арифметических операций над числами, удаление нулевых слагаемых и единичных множителей, единичных степеней, лишних скобок, а также приведение подобных слагаемых и сокращение дробей); вывод на экран результирующего выражения. В случае ввода синтаксически неверного выражения в качестве ответа должно быть выдано диагностическое сообщение. Должны быть выявлены и диагностированы следующие виды синтаксических ошибок: нарушен баланс открывающих и закрывающих скобок; пропущен знак операции или её операнд; употребление неизвестной функции; неправильная запись выражения со степенью; неверная запись множителя – числа, идентификатора, обращения к функции. 5.2.Решение системы линейных уравненийДана система из n линейных уравнений с m неизвестными, n и m ≥ 1, например (m=2, n=2): 3*x+2*x-16/(1+7)*y=11 x+2*y=7 Коэффициентами при переменных уравнения могут быть как числа, так и составленные из них арифметические выражения (с использованием операций умножения, сложения, вычитания, деления и круглых скобок). Необходимо составить рефал-программу, решающую эту систему методом исключения переменных. В общем случае решение системы включает в себя следующие шаги: Все уравнения системы преобразуются к каноническому виду: a*x+b*y+c*z+...+d=0 где a, b, c, d – числа. В одном из уравнений некоторая переменная выражается через другие переменные: x=-(b*y+c*z+...+d)/a = -b/a*y-c/a*z-...-d/a. Полученное для этой переменной выражение подставляется в остальные уравнения системы вместо всех вхождений указанной переменной. В результате выполнения этих трёх шагов получается формула для вычисления значения одной из переменных системы по значениям других переменных, а также новая равносильная система уравнений, содержащая на одно уравнение и на одну переменную меньше, чем предыдущая. Далее шаги 1-3 повторяются для этой новой системы уравнений, и так продолжается до тех пор, пока не останется одно уравнение или пока не обнаружится противоречие. Противоречие (неверное равенство) возникает, когда система не имеет решения (например, в ходе преобразований получено уравнение 6‑4=0). В этом случае рефал-программа должна в качестве ответа выдать сообщение Система уравнений не имеет решения Если в ходе преобразований одно из уравнений превратилось в тождество (0=0), то исходная система уравнений была избыточна, а это уравнение можно исключить из решаемой системы. Если в ходе преобразований системы получено одно уравнение с одной переменной, то из этого уравнения вычисляется значение этой переменной. Значения остальных переменных вычисляются по полученным в ходе преобразований формулам. В этом случае рефал-программа должна выдать решение системы уравнений в виде строк вида имя_переменной=значение, например, для системы уравнений, приведённой выше в качестве примера, ответом будет: x=3 y=2 Если же в результате преобразований системы уравнений остаётся одно уравнение, но оно содержит более одной переменной (например, x+y+2=0), то это означает, что исходная система имеет бесконечное множество решений. В этом случае рефал-программа должна вывести на печать имена свободных переменных (которые могут принимать любые значения) и формулы для вычисления остальных переменных системы по значениям этих свободных переменных. Например, для заданной системы уравнений: x+2*y-z=2 2*x-y+3*z=-6 рефал-программа может выдать результат в виде: x=-z-2 y=z+2 z – свободная переменная |