Главная > Математика > Математика. Ее содержание, методы и значение. Том 2
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

§ 2. ПРОГРАММИРОВАНИЕ И КОДИРОВАНИЕ В БЫСТРОДЕЙСТВУЮЩИХ ЭЛЕКТРОННЫХ МАШИНАХ

Основные принципы программирования.

1. При расчетах на электронных машинах выбранный математический метод приближенного решения задачи необходимо представить как последовательный ряд арифметических действий. Осуществление этих действий на машине обеспечивается программой вычислений, состоящей, как уже было сказано, из ряда команд. Естественно, конечно, что если для выполнения каждого арифметического действия предусматривать свою команду, то программа вычислений будет весьма громоздкой и даже одно ее написание отнимет время того же порядка, что и выполнение самих действий при ручном счете. Поэтому при программировании стремятся сравнительно небольшим числом команд обеспечить выполнение большого числа арифметических действий.

Для уяснения структуры команд и методов составления программ рассмотрим на простейшем примере те операции, которые выполняются при решении задачи с использованием ручного счета.

Мы остановимся на примере решения методом Эйлера следующего дифференциального уравнения первого порядка с заданными начальными условиями

По этому методу весь диапазон значений х разбивается на ряд интервалов одинаковой длины и в пределах каждого интервала принимается, что производная остается постоянной, равной ее значению в начале интервала. При такой предпосылке вычисления для интервала ведутся по формулам

Проведя вычисления для интервала, переходят к вычислениям для интервала. Вычисления начинают с заданных начальных значений Последовательность операций приведена в табл. 1.

Таблица 1. Необходимые операции для решения уравнения (1) методом Эйлера

При ручном счете используются лишь первые три операции, а остальные не записываются и подразумеваются сами собой, например указание о повторении расчетов с начала для следующего интервала, указание об окончании расчетов и т. При расчете на машине все эти операции должны быть точно сформулированы (операции 4—7). Таким образом, в машине, помимо выполнения арифметических действий, должны быть предусмотрены также и действия управления (операции 4—7). Действия управления имеют или вполне определенный характер (например, операции 4 и 5), или же условный характер, зависящий от полученного результата (например, операции 6 и 7). Так как последние две операции связаны между собой (нужно выполнять либо одну, либо другую), то в машине такие две операции объединяются в одну (операция сравнения), которая формулируется следующим образом: «Если величина х меньше то необходимо повторить вычисления, начиная с операции 1. Если же величина х равна или больше то необходимо прекратить вычисления». Таким образом, последовательность дальнейших вычислений зависит от величины текущего значения х, получаемого в процессе расчета.

2. Рассмотрение арифметических операций табл. 1 показывает, что для выполнения какого-либо арифметического действия необходимо указать, какое действие должно быть произведено с числами, какие числа должны быть взяты и куда следует направить полученный результат, так как он используется в дальнейших вычислениях.

Коды чисел хранятся в запоминающем устройстве машины, следовательно, должны быть указаны номера соответствующих ячеек: откуда надо взять числа и куда направить полученный результат. Это приводит к наиболее естественной «трехадресной системе команд».

В трехадресной системе команд определенная часть разрядов кода отводится для задания операций, т. е. указания действия, которое надо произвести с числами (код операции). Оставшиеся разряды кода команды делятся на три равные группы, называемые «адресами команды» (рис. 4).

Рис. 4. Структура трехадресной системы команд.

Код первого адреса указывает номер ячейки запоминающего устройства, из которой надо взять первое число, код второго адреса — номер ячейки, из которой надо взять второе число, код третьего адреса — номер ячейки запоминающего устройства, в которую следует направить полученный результат.

Коды команд управления вычислительным процессом также могут быть представлены в трехадресыой системе. Так, команда «передача числа на печать» должна иметь в коде операции номер этой операции; в первом адресе — номер ячейки запоминающего устройства, в которой хранится число, отправляемое на печать, и в третьем адресе — номер печатающего устройства (во втором адресе код отсутствует). Команда, определяющая тот или иной дальнейший ход вычислительного процесса, называется «командой сравнения». Код операции этой команды указывает, что необходимо сравнить два числа, номера которых заданы в первом и во втором адресах команды. Если первое число меньше второго, то следует перейти к команде, номер которой указан в третьем адресе команды сравнения. Если же первое число больше или равно второму, то по выполнении данной команды необходимо перейти к следующей по номеру команде.

Коды команд, так же как и коды чисел, хранятся в запоминающем устройстве машины и следуют один за другим в порядке их номеров, если только нет указания об изменении хода вычислений (например, при операции сравнения).

Рассмотрим, как будет выглядеть программа вычислений для рассмотренного выше примера. Примем следующее распределение кодов чисел в ячейках запоминающего устройства:

В соответствии с предыдущей таблицей получим следующую программу вычислений (табл. 2).

Таблица 2. Программа вычислений для решения уравнения (1) методом Эйлера

Коды команд хранятся в запоминающем устройстве (для рассматриваемого примера с 1-й ячейки по 7-ю). В устройство управления машиной поступает команда, хранящаяся в 1-й ячейке запоминающего устройства. В соответствии с этой командой производится умножение числа, находящегося в 11-й ячейке, на число в 15-й, т. е. подсчитывается величина Полученный результат направляется в оперативную 16-ю ячейку. По выполнении этой операции в устройство управления поступает команда из следующей по номеру ячейки запоминающего устройства, т. е. из 2-й ячейки. По этой команде находится величина которая направляется вместо прежнего значения у, т. е. в 15-ю ячейку. Аналогично, по 3-й команде находится новое значение 4-я и 5-я команды осуществляют печать вновь

полученных значений ; 6-я команда определяет дальнейший ход вычислительного процесса. По этой команде производится сравнение числа, находящегося в 14-й ячейке, с числом в 13-й ячейке, т. е. сравнивается полученное значение с конечным значением Если необходимо повторить вычисления для следующего интервала, т. е. вернуться к начальной, в данном случае 1-й команде. Номер этой команды, к которой следует перейти, если первое число меньше второго, указывается в адресе команды сравнения. Если же расчеты произведены до значения то команда сравнения вызовет переход к следующей по номеру команде, т. е. к 7-й, которая остановит процесс вычислений.

Перед началом вычислений в запоминающее устройство должны быть введены коды команд (в ячейки 1—7), коды постоянных (в ячейки 11—13), а также начальные данные, т. е. значения (в ячейки 14 и 15).

По выполнении расчетов для первого интервала в 14-й и 15-й ячейках вместо величин будут уже находиться т. е. значения переменных для начала следующего интервала. Таким образом, при повторении тех же самых команд программы будут произведены вычисления для следующего интервала и т. д.

Рассмотренный пример показывает, что, благодаря циклическому повторению ряда команд, можно при сравнительно небольшой программе выполнить большой объем вычислений. Метод циклического повторения отдельных участков программы широко используется при программировании решения задач.

3. Другой распространенный метод, позволяющий существенно сократить объем программы, сводится к автоматическому изменению адресов некоторых команд. Поясним сущность этого метода на примере подсчета многочлена.

Пусть требуется подсчитать значение многочлена:

При вычислении на машине этот многочлен удобнее представить в виде

Пусть значения коэффициентов располагаются в ячейках 20—26, а значение х в 31-й ячейке запоминающего устройства. Программа вычислений, составленная тривиальным способом, дана в табл. 3.

Как видно, в программе имеется чередование операций умножения и сложения. Все команды умножения, за исключением 1-й, совершенно одинаковы: надо помножить число, хранящееся в 27-й ячейке, на число, хранящееся в 31-й, и результат направить в 27-ю ячейку. Все команды сложения имеют одинаковые 1-й и 3-й адреса. Номера же ячеек во

Таблица 3. Программа вычислений многочлена

адресе при переходе от одной команды сложения к другой каждый раз меняются на единицу: во 2-й команде число берется из 21-й ячейки, в 4-й команде — из 22-й и т. д.

Программу вычислений можно существенно сократить, если обеспечить автоматическое изменение номеров ячеек во адресе команд сложения. Коды команд хранятся в соответствующих ячейках, и их можио рассматривать как некоторые числа. Прибавляя к ним соответствующие величины, можно осуществить автоматическое изменение адресов команд. При таком методе программа подсчета многочлена будет иметь вид, приведенный в табл. 4.

Таблица 4. Программа вычислений многочлена

Первая команда служит для передачи числа из 20-й ячейки в 27-ю, для того чтобы иметь стандартную команду умножения. По выполнении 2-й и 3-й команд получаем значения Для дальнейших вычислений необходимо предварительно изменить на единицу 2-й адрес

команды сложения (3-й команды), что и выполняется 4-й командой. По этой команде выбирается число, находящееся в 3-й ячейке, т. е. как раз требуемая команда сложения (3-я команда), и к ней прибавляется величина, хранящаяся в 28-й ячейке. Чтобы получить изменение 2-го адреса 3-й команды на единицу, в 28-й ячейке должна храниться величина:

Таким образом, по выполнении 4-й команды получим следующее значение 3-й команды:

Вновь полученное значение запоминается в 3-й ячейке вместо прежнего значения команды сложения.

Получив новое значение команды сложения, можно повторить вычисления, начиная с команды умножения, т. е. со 2-й команды. Для этой цели служит 5-я команда сравнения. Эта команда сравнивает вновь полученную команду 3-й ячейки с величиной, хранящейся в 29-й ячейке. В 29-й ячейке хранится величина:

Это сравнение первоначально дает, что первая величина (в 3-й ячейке) меньше, чем вторая (в 29-й ячейке) и, следовательно, процесс вычисления перейдет ко 2-й команде, указанной в 3-м адресе команды сравнения. Таким образом, автоматически будут повторяться команды умножения (2-я команда) и сложения (3-я команда), причем каждый раз номер ячейки во 2-м адресе команды сложения будет изменяться на единицу (выполняется 4-й командой).

Повторение цикла будет происходить до тех пор, пока 2-й адрес команды сложения (3-й команды) не достигнет величины 27, что произойдет через шесть повторений цикла. При этом 3-я команда будет иметь вид

т. е. код команды будет такой же, как и в 29-й ячейке. Команда сравнения (5-я команда) отметит при этом равенство величин, хранящихся в 3-й и 29-й ячейках, и, следовательно, процесс вычислений перейдет к следующей по номеру команде, т. е. к 6-й. На этом подсчет многочлена будет закончен.

Метод автоматического изменения номеров ячеек в адресах некоторых команд, осуществляемый программой, широко применяется при

решении самых разнообразных задач. Наряду с методом циклического повторения, он дает возможность сравнительно небольшим числом команд осуществлять очень большой объем вычислений.

4. Помимо рассмотренной трехадресной системы команд, во многих машинах применяется одноадресная система. При одноадресной системе в каждой команде, помимо кода операции, имеется лишь один адрес. Для выполнения какого-либо арифметического действия с двумя числами и отсылки полученного результата в запоминающее устройство требуется три команды: 1-я команда вызывает одно из чисел из запоминающего устройства в арифметическое устройство, 2-я вызывает второе число и производит заданное действие с числами, 3-я отправляет полученный результат в запоминающее устройство. При вычислениях полученный результат часто используется лишь для выполнения следующего арифметического действия. В этих случаях не требуется отправлять полученный результат в запоминающее устройство, а для выполнения следующего действия не надо вызывать первое число. Поэтому число команд программы при одноадресной системе получается примерно лишь в два раза больше, чем при трехадресной. Так как каждая одноадресная команда требует меньшего числа разрядов, чем трехадресная, то место в запоминающем устройстве, занятое под программу, при обеих системах команд будет примерно одинаковым (обычно при одноадресной системе команд в каждой ячейке запоминающего устройства хранятся две команды). Различие в системах команд необходимо учитывать при сравнении скоростей работы машин. При одной и той же скорости выполнения операций одйоадресная машина будет производить вычисления примерно в два раза медленнее, чем трехадресная.

Помимо этих систем, некоторые машины имеют двухадресную и четырехадресную систему команд.

5. Обычно решение задачи разбивается на несколько этапов. Многие из этих этапов являются общими для ряда задач. Примерами могут служить: вычисление элементарных функций по заданному аргументу, определение приращения функций по заданной производной при решении обыкновенных дифференциальных уравнений, вычисление определенного интеграла по подсчитанной подинтегральной функции.

Естественно, что для таких типовых этапов целесообразно иметь раз навсегда разработанные стандартные подпрограммы. Если в ходе решения какой-либо задачи требуется произвести стандартные вычисления, то следует в соответствующий момент передать вычисления на одну из стандартных подпрограмм. По окончании вычислений по стандартной подпрограмме необходимо вернуться к выполнению основной программы в прерванном месте.

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

многих задач сводится лишь к составлению небольших основных программ, связывающих между собой отдельные стандартные подпрограммы.

6. На электронных счетных машинах решаются задачи, требующие для своего выполнения десятков и даже сотен миллионов арифметических действий. Ошибка хотя бы в одном действии может привести к неправильным результатам. Естественно, что осуществить ручной контроль при таком большом объеме вычислений практически невозможно. Поэтому функции контроля выполняются самой машиной. Существуют методы, позволяющие аппаратно контролировать правильность производимых действий и автоматически останавливать машины в случае ошибки. Однако эти методы аппаратного контроля приводят к существенному увеличению аппаратуры и обычно не охватывают всех звеньев машины. Более перспективны методы контроля, предусматриваемые непосредственно самой программой вычисления.

Одним из методов такого контроля является применяемое при ручном счете повторение вычислений — «счет в две руки». Если при независимом повторении вычислений получаются те же результаты, то это достаточная гарантия отсутствия случайной ошибки. Разумеется, что наличие систематической ошибки при этом не будет выявлено. Для того чтобы исключить систематическую ошибку, перед решением задачи на машине производят контрольные вычисления с заранее известными ответами. Эти вычисления должны охватывать все звенья машины. Правильность полученных результатов при койтрольных вычислениях служит гарантией отсутствия систематической ошибки.

Помимо «счета в две руки», в зависимости от типа задачи могут применяться более сложные методы контроля. Так, например, при определении траектории полета снаряда, кроме решения систем дифференциальных уравнений для двух составляющих скорости, можно дополнительно решать дифференциальное уравнение для полной скорости и на каждом шаге интегрирования производить проверку по формуле:

При решении обыкновенных дифференциальных уравнений, помимо вычислений с шагом интегрирования можно производить второй подсчет с шагом интегрирования Это дает гарантию не только отсутствия случайной ошибки при вычислениях, но также и оценку правильности выбора шага. При вычислении таблиц по рекуррентным формулам иногда можно вычислить некоторые опорные значения другими методами. Верный выход на опорные значения — достаточная гарантия правильности всех подсчитанных промежуточных значений. В ряде

случаев контроль может вестись по разностям между получаемыми значениями.

При составлении программ необходимо предусматривать тот или иной вид логического контроля произведенных вычислений.

<< Предыдущий параграф Следующий параграф >>
Оглавление