Адаптивные программы

 

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

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

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

Пользователь подобной программы указывает конечный интервал [a,b] и допустимую погрешность e. Программа пытается вычислить величину S, такую, что

.

В процессе вычислений интервал [a,b] разбивается на подинтервалы [xi-1,xi]. В большинстве программ новый подинтервал получается делением пополам подинтервала, полученного на более раннем этапе вычисления. Реальное число подинтервалов и их длина зависят от функции f(x) и требуемой точности e.

Типичная схема применяет к подинтервалу две различные формулы. Например, схемы, основанные на формуле Симпсона, используют основную формулу с двумя элементарными отрезками

и составную формулу с четырьмя элементарными отрезками

.

Выражения S1i и S2i являются приближениями к величине интеграла

.

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

Сокращение общего количества вычислений может быть достигнуто также за счет того, что две формулы для расчета S1i и S2i используют значения подинтегральной функции в нескольких общих точках. Например, для формулы Симпсона S2i требует вычисления в пяти точках, три из которых используются при расчете S1i, и поэтому достаточно вычислить только два новых значения функции f(x).

Для формулы Симпсона сокращение интервала вдвое увеличивает точность вычисления приблизительно в 16 раз.

.

Выразим отсюда неизвестную величину Ii S2i:

.

Проводя подобные вычисления для формул прямоугольников или трапеций, получим оценку погрешности

.

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

,

то при суммировании всех интервалов будем иметь

.

На рис. 7.6 приведена блок-схема адаптивного алгоритма вычисления определенного интеграла методом средних прямоугольников. В начале программы в качестве шага интегрирования выбирается длина всего диапазона интегрирования. Далее по двум формулам с целым и половинными шагами рассчитываются значения интеграла на участке шириной Dx.

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

Если точность расчета заметно (в приведенной схеме в 20 раз) превышает требуемую, длина шага увеличивается в 1,87 раза. В том случае, если погрешность расчета оказывается чрезмерной, длина шага уменьшается вдвое.

Коэффициенты увеличения и уменьшения шага выбраны не кратными друг другу для более гибкого изменения длины шага интегрирования. В зависимости от вида подинтегральной функции и желания программиста эти величины могут быть выбраны несколько иными.

 


Лекция 8. Решение системы линейных уравнений в среде EXCEL

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

(8.1)

Здесь х1, х2, … ,хn – неизвестные параметры, значения которых необходимо найти; а11, а12, … , а1n, а21, … , а2n, … , аnn – известные коэффициенты при неизвестных параметрах х1, х2, … ,хп. Первый индекс коэффициента означает номер строки (номер уравнения в системе), второй индекс – номер неизвестного параметра, при котором стоит данный коэффициент; b1, … bn – свободные члены в уравнениях, индекс означает номер уравнения.

Для существования единственного решения системы число уравнений равно числу неизвестных. В этом случае коэффициенты при неизвестных и свободные члены образуют матрицу размером n´n+1.

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

Алгоритмы решения задач такого типа делятся на прямые и итерационные. Прямые методы дают решения за конечное число действий. Для систем порядка n<200 применяются практически только прямые методы. Итерационные методы выгодны для систем со слабо заполненной матрицей большого порядка n@103-105.

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

.

Здесь - определитель системы для матрицы, составленной из коэффициентов при неизвестных параметрах; - определитель, в котором столбец коэффициентов при xj заменен на столбец свободных членов bi.

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

Более эффективным оказывается метод Гаусса, основанный на приведении матрицы коэффициентов к верхнему треугольному виду и последовательному вычислению корней, начиная с хn и заканчивая х1. Этот метод надежен, достаточно прост, легко программируется и использовался раньше чаще всего.

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

 

Алгебра матриц

Матрица – это математический объект, записываемый в виде прямоугольной таблицы элементов, и являющийся совокупностью строк и столбцов. В общем случае матрица имеет вид

. (8.2)

Элементы матрицы ai1, ai2, …, ain составляют i-ю строку, элементы a1j, a2j, …, amj - j-й столбец, элемент матрицы aij находится в i-ой строке и j-ом столбце.

Матрица, состоящая из одной строки, называется матрицей-строкой или строчной матрицей. Она имеет вид

. (8.3)

Матрица, состоящая из одного столбца, называется матрицей-столбцом или вектор-столбцом. Она имеет вид

. (8.4)

Две матрицы называются равными, если они имеют одинаковые размеры и элементы одной матрицы равны соответствующим элементам другой матрицы. Таким образом, , если .

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

Различают несколько частных видов матриц. Нулевой матрицей называется матрица, у которой все элементы равны нулю. Ее обозначают буквой О:

. (8.5)

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

. (8.6)

Диагональная матрица, у которой каждый элемент главной диагонали равен единице, называется единичной и обозначается буквой Е:

. (8.7)

Квадратная матрица называется треугольной, если все элементы, расположенные по одну сторону от главной диагонали, равны нулю. При этом матрица вида

(8.8)

называется верхней треугольной, а матрица вида

(8.9)

называется нижней треугольной матрицей.

Над матрицами возможны следующие операции:

- сложение матриц;

- вычитание матриц;

- умножение матрицы на число;

- умножение матрицы на матрицу;

- транспонирование матрицы;

- обращение матрицы.

Рассмотрим эти операции отдельно.

1.2.1. Сложение и вычитание матриц

Эти операции возможны только для матриц одинаковых размеров. Суммой двух матриц и называется матрица , в которой каждый элемент соответствует выражению . Сумма матриц А и В обозначается С = А+В. Соответственно определяется операция вычитания матрицы В из матрицы А. С= А В , где элементы матрицы С равны .

 

Произведением матрицы на число a или числа a на матрицу называется матрица , у которой элементы имеют значение .

В данной операции порядок умножения (a на А или А на a) не имеет значения.

Перемножать можно только согласованные между собой матрицы. Матрица называется согласованной с матрицей , если число столбцов матрицы А равно числу строк матрицы В, т.е. если n = k. Следует заметить, что если матрица А согласована с матрицей В, то это не означает, что матрица В согласована с матрицей А. Взаимное согласование существует только для квадратных матриц одинаковых размеров.

Пусть имеем три матрицы

.

Здесь матрица А согласована с матрицей В и не согласована с матрицей С. Матрица В не согласована с матрицами А и С. Матрица С согласована с матрицей А и не согласована с матрицей В.

Произведением матрицы на матрицу называется матрица , в которой элементы определяются выражением

. (8.10)

Произведение матрицы А на матрицу В обозначается АВ и называется произведением матрицы А на матрицу В справа или произведением матрицы В на матрицу А слева. Из (1.10) следует, что элемент матрицы АВ, находящийся в i-й строке и j-м столбце равен сумме произведений элементов i-й строки матрицы А на элементы j-го столбца матрицы В.

Из вышеприведенного примера возможно произведение матрицы на матрицу , в результате чего получаем матрицу АВ размером 2´1:

.

Произведение матрицы на матрицу справа дает матрицу размером 4´3:

Для квадратных матриц А и В при их взаимной согласованности в общем случае произведения :

,

.

 

Интересно отметить, что произведение двух ненулевых матриц может быть нулевой матрицей. Для произведения чисел этого быть не может.

Из определения операции умножения матриц следует, что

.

Матрица, полученная из данной матрицы А заменой каждой ее строки столбцом с тем же номером, называется транспонированной к матрице А и обозначается Ат. Если

,

то

.

Отметим, что если матрица А имеет размеры , то транспонированная матрица имеет размеры . Транспонированные матрицы обладают следующими свойствами:

(Ат)т = А;

()т = т;

(А+В)т =Ат + Вт;

(АВ)т = ВтАт .

 

Матрица В называется обратной квадратной матрице А, если , где Е - единичная матрица. Обычно матрицу, обратную матрице А, обозначают
А-1.

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

Систему уравнений

можно записать в матричной форме

или

, (8.11)

где А – квадратная матрица коэффициентов уравнения размером n´n;
n – количество неизвестных, равное количеству уравнений системы; Х - матрица-столбец корней уравнения размером n´1, т.е. неизвестных параметров, подлежащих определению; В – матрица-столбец свободных членов системы размером n´1.

Если уравнение (1.11) слева умножить на обратную матрицу А-1, то получим:

,

или окончательно

. (8.12)

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

 

Процедура нахождения корней системы линейных уравнений в Exel

1) Загрузить Exel.

2) На рабочем листе в ячейки ввести массив коэффициентов при неизвестных размером n´n.

3) Ввести массив свободных членов в виде столбца размером n´1.

4) Выделить ячейки под элементы обратной матрицы. Размер выделенной области должен соответствовать размеру исходной матрицы n´n.

5) Не снимая выделения, в панели инструментов щелкнуть мышкой по значку fx – мастер функций. На экране появится меню «мастер функций – шаг 1 из 2». Необходимо выбрать категорию «математические», в ней выделить функцию «МОБР» и нажать клавишу «ОК». Появится меню «Аргументы функции» с окном «Массив». Необходимо в окне указать границы массива исходной матрицы. Проще это сделать выделением массива с помощью мышки. Затем нажать клавишу «ОК».

6) В верхней ячейки выделенной области появится одно число. Для получения значений всей обратной матрицы надо сначала нажать клавишу F2, а затем комбинацию клавиш Ctrl+Shift+Enter. В ячейках выделенной области появятся значения обратной матрицы A-1.

7) Умножить обратную матрицу A-1 на матрицу столбец В. Для этого необходимо выделить область для корней уравнения размером n´1.

8) Не снимая выделения, в панели инструментов щелкнуть мышкой по значку fx – мастер функций. На экране появится меню «мастер функций – шаг 1 из 2». Необходимо выбрать категорию «математические», в ней выделить функцию «МУМНОЖ» и нажать клавишу «ОК». Появится меню «Аргументы функции» с двумя окнами «Массив1» и «Массив2». Необходимо в первом окне указать границы массива обратной матрицы, а во втором окне – границы столбца свободных членов. Затем нажать клавишу «ОК».

9) В верхней ячейки выделенной области появится одно число. Для получения значений всей обратной матрицы надо сначала нажать клавишу F2, а затем комбинацию клавиш Ctrl+Shift+Enter. В ячейках выделенной области появятся значения корней системы.

 

 

Лекция 9. Интерполяция

Инженеру часто приходится работать с таблицами, в которых приводятся значения некоторой функции f(x) в зависимости от фиксированных значений одного или двух параметров. Табличное представление функции может быть связано с тем, что данные получены экспериментально и лишь для некоторых дискретных значений аргумента, либо с тем, что объем таблиц ограничен и в них можно привести лишь некоторые данные. Хотя частота узлов таблицы может быть достаточно малой, тем не менее в практических расчетах требуется использовать значения функции, для которых аргумент находится между узлами. Операция определения промежуточного значения функции внутри интервала по ее значениям на границах интервала называется интерполяцией.

При интерполяции табличные значения функции f(x) аппроксимируются приближенной функцией j(х,а), которая совпадает с f(x) по крайней мере в двух ближайших узлах таблицы и легко вычисляется. В дальнейшем при всех значениях аргумента искомое значение функции f(x) определяют вычислением значений j(х,а). Близость функций f(х) и j(х,а) обеспечивают введением в аппроксимирующую функцию свободных параметров а(а12,…аn) и соответствующим их выбором.

Если потребовать, чтобы функция j(х,а) совпадала в n выбранных узлах таблицы с f(x), то получим систему уравнений

, 1 £ i £ n ,

из которой можно определить параметры ai. Если j(х,а) линейно зависит от параметров ai , то такая интерполяция называется линейной.

На практике чаще всего для интерполяции используются следующие функции:

Ø последовательность степеней x:

, то есть интерполяционный многочлен ;

Ø последовательность тригонометрических функций: ;

Ø последовательность показательных функций:

.

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

К интерполированию приходится прибегать и в том случае, когда для функции f(x) известно ее аналитическое представление или существует способ вычисления значения функции для любого значения х из отрезка [a,b], но вычисления каждого значения сопряжено со значительными затруднениями. В таких условиях вычисляют несколько значений f(xi) и по ним строят интерполирующую функцию j(х,а), а затем с помощью ее вычисляют приближенные значения f(x) в остальных точках.

 

Однопараметрическая интерполяция.

Рассмотрим случай, когда функция f(х) зависит только от одного параметра x. Например, имеем таблицу данных

X ¥
Y 0,16 0,22 0,27 0,29 0,31 0,32 0,36 0,40 0,48

Независимо от того, проводим ли вычисления вручную или составляем программу для компьютера, необходимо разработать метод для определения значений y в зависимости от произвольного значения x, например для х=2,33.

Возьмем для аппроксимации степенной многочлен, причем запишем в виде

.

Если ограничиться линейной интерполяцией по двум точкам, то получим систему двух уравнений

Решая ее относительно а0 и а1, будем иметь

.

Отсюда формула для линейной интерполяции

. (9.1)

Поиск значения y(x) интерполяцией по двум точкам и появление возможной погрешности показано на рисунке 5.1.

Формулу для линейной интерполяции можно также получить, рассматривая два подобных треугольника с катетами (y1-y0, x1-x0) и (y-y0, x-x0). Из условия подобия

получаем сразу искомую зависимость (5.1).

 

 

Более точной является интерполяция по трем точкам. В этом случае формула интерполяционного многочлена приобретает вид

, (9.2)

а коэффициенты интерполяции находятся из условия

по формулам

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

 

Двухпараметрическая интерполяция.

Аналогичным образом проводится интерполяция, когда функция зависит от двух параметров х1 и х2. Для этого случая таблица данных представляет двухмерный массив для у и одномерные массивы для х1 и х2:

  x1,1 x1,2 x1,k x1,n1
X2,1 y1,1 y1,2 y1,k y1,n1
X2,2 y2,1 y2,2 y2,k y2,n1
X2,i yi,1 yi,2 yi,k yi,n1
X2,n2 yn2,1 yn2,2 yn2,k Yn2,n1

 

Предположим, что значения параметров х1 и х2 находятся в области

.

Это означает, что искомая точка находится внутри прямоугольника с вершинами y1=yi,k; y2=yi,k+1 ; y3=yi+1,k ; y4=yi+1,k+1 .

Расчетная схема двухпараметрической интерполяции показана на рис.5.2. Для того, чтобы избежать громоздких вычислений, сначала проводят интерполяцию по одному параметру при фиксированном другом, например по х1, и определяют значения функции в точках y5 и y6 , а затем по второму параметру при фиксированном первом и находят окончательное значение функции в искомой точке y7.

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

. (9.3)

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

Следует обратить внимание еще на одну проблему. Интерполяция обычно является вспомогательной задачей и применяется для вычисления значений некоторой функции, используемой в основной задаче. Координаты точки, в которой необходимо определить значение функции, могут оказаться вне диапазона табличных значений. В этом случае выбор варианта продолжения программы интерполяции должен основываться на физической сущности решаемой задачи.

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

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

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

Общая блок-схема интерполяции представлена на рис.9.3.

 

 

Лекция 10. Численное дифференцирование.

 

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

Во всех этих случаях вместо функции f(x) рассматривают интерполирующую функцию j(х) и считают производную от f(x) приближенно равной производной от j(х). Естественно, что производная от f(x) будет найдена с некоторой погрешностью.

Существуют два основных источника возможного появления значительных погрешностей при численном дифференцировании. Функцию f(x) можно записать в виде

, (10.1)

где j(х) – интерполирующая функция, а R(x) – остаточный член интерполяционной формулы. Предполагая, что f(x) и j(х) имеют производные k-того порядка, можно найти эти производные, дифференцируя тождество (5.1) k раз:

. (10.2)

Так как за приближенное значение принимается величина , то величина погрешности численного дифференцирования будет равна .

При замене f(x) интерполирующей функцией j(х) предполагается, что остаточный член (то есть величина R(x)) мал, но из этого совсем не следует, что мало . Производные от малой функции могут быть весьма большими. Особенно это относится к производным высших порядков. Данная ситуация иллюстрируется на рис.10.1.

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

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

 

Формулы численного дифференцирования.

Первая производная наиболее просто вычисляется при аппроксимации функции f(x) прямой линией. В этом случае касательная к кривой в одной точке заменяется секущей, проходящей через две точки кривой. Для точки х1 производная может быть рассчитана по формулам:

, (10.3)

или

. (10.4)

Эти формулы равноправны, хотя могут привести к различным результатам, как это показано на рис.6.2. Если интервалы x2-x1 и х1-х0 равны, то более точной будет формула

. (10.5)

При расчетах по неравномерной сетке можно вычислить производные по формулам (6.3) и (6.4), а затем усреднить их с учетом весовых коэффициентов:

.

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

для первой формулы ,

для второй формулы .

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

. (10.6)

При x2-x1=х1-х0 она сводится к формуле (10.5).

Также можно аппроксимировать функцию f(x) степенным многочленом, например, многочленом второй степени:

.

Коэффициенты а0, а1, а2 рассчитываются по формулам:

Дифференцируя многочлен, получаем

При x =х1 эта формула сводится к выражению

. (10.7)

Для равноотстоящих узлов, когда x2-x1=х1-х0=h, получаем

. (10.8)

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

Для расчета второй производной необходимо, как минимум, уже три точки.

. (10.9)

Для равноотстоящих узлов, когда x2-x1=х1-х0=h, получаем

. (10.10)

При выборе типа аппроксимации следует исходить из того, что вычисление по формулам более высокого порядка не всегда дает положительный эффект. Во-первых, расчет по более сложным формулам охватывает большее количество точек и требует большего объема машинной памяти, большего времени вычисления и поэтому он менее экономичен. Во-вторых, формулы более высокого порядка заметно эффективнее только при мелкой сетке, когда шаги дифференцирования x2-x1, х1-х0, относительно малы. В случае грубой сетки преимущество в точности быстро уменьшается.

С одной стороны ясно, что для увеличения точности вычислений необходимо стремиться к уменьшению шага дифференцирования. Это возможно только в том случае, если имеется возможность вычислять значения функции f(x) для любого х. При табличном представлении функции f(x) такая возможность отсутствует. С другой стороны, при наличии погрешностей в значениях функции уменьшение шага дифференцирования может привести даже к увеличению погрешности определения производной. При этом на точность расчета может существенным образом повлиять выбор порядка аппроксимирующего многочлена. Превосходство формул высокого порядка зависит от гладкости функций. Если есть разрывы функций или случайные колебания, то погрешности у формул высокого порядка могут оказаться выше, чем при использовании формул более низкого порядка.


2 Семестр.

Лекция 11. Язык программирования Турбо-Паскаль

 

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

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

Программы, переводящие написанные с помощью операторов тексты в машинные коды, разделяются на два класса:

Ø интерпретаторы;

Ø компиляторы.

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

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

Первые версии языков программирования высокого уровня (БЕЙСИК, Паскаль) работали с интерпретаторами, более поздние, получившие дополнение «Турбо», оснащаются компиляторами.

Язык Паскаль, названный в честь французского математика и философа Блэза Паскаля (1623-1662), был создан как учебный язык программирования в 1968-1971 годах Никлаусом Виртом в Высшей технической школе в Цюрихе. Широкое применение язык получил после появления версии Турбо-Паскаль, созданной американской фирмой Борланд. Эта фирма объединила очень быстрый компилятор с редактором текста и добавила к стандартному Паскалю мощное расширение. Существует несколько версий языка. Каждая новая версия добавляет к существующей дополнительные возможности для программиста. Последняя версия языка Турбо-Паскаль 7.0 была представлена фирмой Борланд в 1992 г.

Система программирования Турбо-Паскаль представляет собой единство двух объектов:

1) собственно язык Паскаль с компилятором;

2) интегрированная инструментальная оболочка, обеспечивающая комфорт и высокую скорость работы при составлении программ на языке Турбо-Паскаль. Эта программная оболочка, представляющая сервисные услуги, называется средой Турбо-Паскаля.

Среда Турбо-Паскаля постоянно совершенствуется, сам язык Паскаль меняется значительно медленнее.

 

Начало работы с Турбо-Паскалем.

Система Турбо-Паскаль довольно значительна по объему. При развертывании системы на жестком диске обычно создается отдельный каталог с именем TP, TP60, TP70, PAS и т.д., в который помещаются все файлы. Внутри каталога в старших версиях организуется несколько подкаталогов. Обычно имеются BGI, BIN, DOC. В основном каталоге или в подкаталоге BIN находится файл turbo.exe, который содержит готовую к работе диалоговую систему программирования Турбо-Паскаль. Для нормальной работы в диалоговой среде требуется также основная библиотека, содержащаяся в файле turbo.tpl и справочная служба в файле turbo.hlp.

При запуске файла turbo.exe операционная система загрузит программу в оперативную память и передаст ей управление.

Структура основного экрана среды Турбо-Паскаля.

После запуска системы на экране появляется окно, обрамленное двойной рамкой. Над окном и под ним размещаются две строки. Верхняя строка содержит меню возможных режимов работы, нижняя строка - краткую справку о назначении функциональных клавиш. Окно предназначено для ввода и корректировки текста программ. В верхней части окна приводится имя того файла, из которого был прочитан текст программы или имя NONAME00.PAS, если текст не читался с диска. Также существуют два специальных поля, используемых для работы с мышью. Эти поля выделены квадратными скобками. Слева изображается поле [¯] или [×], справа - [n]. Слева также высвечивается цифра =1=, обозначающая номер окна. В среде Турбо-Паскаль 7.0 одновременно можно работать с несколькими программами или частями одной программы, каждая из которых может располагаться в отдельном окне редактора. Среда позволяет использовать до девяти окон одновременно. На правой и нижней границах окна находятся линейки прокрутки, позволяющие с помощью мыши двигать просматриваемый текст в окне. Кроме того, передвижение окна по тексту на одну страницу вверх/вниз может осуществляться клавишами PgUp/PgDn, а на одну строку - клавишами управления курсором. Любое окно можно закрыть нажатием левой кнопки мыши на поле закрытия окна [n], а также с помощью комбинации клавиш Alt+F3 или соответствующей операцией, выбранной в меню Window.

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

 

Система меню Турбо-Паскаля.

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

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

Для перехода из состояния редактирования к выбору из главного меню надо нажать клавишу F10 или щелкнуть мышкой по строке меню. Непосредственно активизировать опцию главного меню можно, набрав комбинацию клавиш Alt+<буква>, определяющая кодовое слово и выделенная в строке меню красным цветом. В частности, для выбора команды в опции File необходимо нажать Alt+F.

Строка меню содержит имена следующих меню:

Ø File: позволяет выполнять все основные операции с файлами (создавать новые, загружать имеющиеся, сохранять созданные и отредактированные файлы, выводить на принтер содержимое этих файлов);

Ø Edit: позволяет выполнить все основные операции редактирования текста (копировать, вставлять, удалять фрагменты текста, а также восстанавливать первоначальный вариант редактируемого текста);

Ø Search: позволяет осуществлять поиск фрагментов текста и при необходимости производить замену найденного текста новым;

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

Ø Compile: позволяет осуществлять компиляцию программы, которая находится в рабочей зоне;

Ø Debug: содержит команды, облегчающие поиск ошибок в программе;

Ø Tools: позволяет выполнять некоторые программы, не выходя из среды Турбо-Паскаля;

Ø Options: позволяет установить необходимые для работы параметры компилятора и среды Турбо-Паскаля;

Ø Window: позволяет выполнять все основные операции с окнами (открывать, закрывать, перемещать, изменять размер);

Ø Help: позволяет получить имеющуюся в системе справочную информацию.

Кроме главного меню в Турбо-Паскале 7.0 существует локальное меню, содержащее наиболее часто используемые команды из меню File, Edit, Help. Локальное меню открывается при помощи клавиш Alt+F10 или при помощи правой кнопки мыши.

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

Ø F1 Help - обращение к справочной службе;

Ø F2 Save - сохранение на диске файла из активного окна;

Ø F3 Open - открытие нового окна и загрузка в него выбранного файла;

Ø Alt+F9 Compile - компиляция программы из активного окна;

Ø F9 Make - Компиляция и редактирование связей программы;

Ø Alt+F10 Local Menu - вызов локального меню.

 

Работа с файлами в среде Турбо-Паскаля.

Основной формой хранения текстов являются файлы. Для обмена данными между редактором среды Турбо-Паскаля предназначены функциональные клавиши F2 (запись в файл) и F3 (чтение из файла). При создании нового файла среда Турбо-Паскаля присваивает ему стандартное имя NONAME00.PAS. Для сохранения текста программы в файле нужно нажать клавишу F2 или выбрать в главном меню опцию File и в ней пункт Save. В этот момент среда проверит имя файла и если это имя стандартное, т.е. NONAME, спросит, не нужно ли его изменить: на экране появится небольшое окно запроса с надписью в верхней части

 

 

Ниже надписи располагается поле для ввода имени файла, в котором можно написать любое имя. Если в имени файла не указано расширение, то среда присвоит файлу стандартное расширение .pas.

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

Вызов программы с дискового файла производится нажатием клавиши клавишу F3. При этом открывается диалоговое окно, представленное на рис. 8. Для загрузки требуемой программы надо в поле ввода имени Name указать маршрут и имя файла с текстом этой программы.

Если в имени отсутствует расширение, то среда добавит стандартное .pas.

Нужный файл вы можете выбрать также из поля выбора File. Активизация полей (перевод мигающего курсора в выбранную область) производится клавишей Tab.

Попав на поле выбора, надо стрелками управления курсором выбрать требуемый файл и нажать клавишу Enter. Если ваш файл находится в другом каталоге, то перейти к нему можно через родительский каталог, выбрав (..\).

Клавиша Open в диалоговом окне используется для команды чтения файла, ее действие аналогично нажатию клавиши Enter. Клавиша Replace используется для замены существующего в поле имени файла на имя из поля выбора. Нажатие клавиши Cancel отменяет команду вызова файла, клавиша Help вызывает справочную систему диалогового окна.

Операции с файлами можно производить с помощью главного меню File. После его активизации на экране появляется подменю:

Команда New открывает окно редактора и присваивает ему имя NONAME00.PAS.

Команда Open открывает окно редактора и помещает в него указанный дисковый файл. Ее действие аналогично нажатию клавиши F3.

Команда Save записывает содержимое активного окна в дисковый файл, то есть в то место, откуда программа была ранее вызвана. Опция вызывается непосредственно из редактора клавишей F2.

При выборе команды Save as содержимое активного окна записывается в дисковый файл под новым именем, для указания маршрута и нового имени в диалоговом окне открывается поле ввода.

Команда Save all сохраняет на диске файлы во всех окнах редактора.

Команда Change dir позволяет сменить текущий каталог пользователя. В поле выбора текущего окна этой опции приводится дерево каталогов текущего диска. Перемещаясь по нему, можно указать на нужный каталог, после чего сменить текущий каталог.

Команда Print печатает содержимое активного окна на принтере.

Команда Print setup производит настройку среды Турбо-Паскаля на работу с конкретным типом принтера.

Команда DOS Shell позволяет выйти в DOS, не закрывая Турбо-Паскаля. Для возврата в Турбо-Паскаль надо набрать Exit.

Команда Exit завершает работу с Турбо-Паскалем. Действие этой команды аналогично нажатию клавиш Alt+x.

Выполнение программы.

Компиляция и запуск программы осуществляется комбинацией клавиш Ctrl+F9 или вызовом команды Run из меню Run. Последний способ может быть выполнен нажатием клавиш Alt+R (вход в меню Run, при этом маркер автоматически устанавливается на строке Run), R или клавиш Alt+R, Enter. Если компилятор обнаружит в программе синтаксическую ошибку, он выдаст соответствующее сообщение (Error ...) на экран, указав место ошибки. Сообщение Unexpected End of File (Неожиданный конец файла) скорее всего указывает на отсутствие точки в конце текста программы.

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

1) По окончании работы программы перейти из режима редактирования в режим просмотра, для чего нажать клавиши Alt+F5 или выбрать в меню Debug команду User Screen (экран пользователя). Для перехода в режим редактирования достаточно нажать любую клавишу.

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

Если в процессе работы программы возникнет необходимость остановить работу (например в случае «зацикливания»), то этого можно достичь нажав клавиши Crtl+C или Ctrl+Break.

Завершение работы в среде Турбо-Паскаль.

Для выхода из Турбо-Паскаля необходимо набрать Alt+x или выбрать команду Exit в меню File и нажать клавишу Enter.

 

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

Алфавит языка Турбо-Паскаль составляют:

1. Буквы латинского алфавита A, B, C, ..., Z, a, b, c, ..., z.

2. Арабские цифры от 0 до 9.

3. Символ подчеркивания «_».

Из этих символов, и только из них, конструируются идентификаторы, то есть имена типов, переменных, констант, процедур, функций, модулей и меток переходов.

4. Символ пробела, являющийся разделителем ключевых слов и имени.

5. Управляющие символы, то есть коды ASCII с номерами от 0 до 31. Эти символы могут использоваться при описании строчных и символьных констант. Некоторые символы могут применяться в качестве разделителей. В любом месте программы, где можно разместить один символ-разделитель, их можно разместить сколько угодно, компилятором они воспринимаются как один разделитель.

6. Специальные символы, участвующие в построении различных конструкций языка:
+ - * / ( ) [ ] { } < > . , ‘ : ; ^ @ # $

7. Составные символы, воспринимаемые как один символ:
<= >= := (* *) (. .) ..

8. Разделители и пробелы между элементами составных символов недопустимы.

Символы с расширенными кодами от 128 до 255, где находятся символы алфавита русского языка и символы псевдографики, а также некоторые символы из основной таблицы ASCII (&, !, %, ~, ²), не входят в алфавит языка. Тем не менее, они могут использоваться в тексте программы, но только в разделе комментариев или в виде значений констант строк и констант символов.

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

Ø Идентификатор должен начинаться буквой или именем подчеркивания.

Ø Турбо-Паскаль не различает строчные и заглавные буквы.

Ø Начиная со второй позиции, в идентификаторе можно применять наряду с буквами арабские цифры.

Ø Пробел в Турбо-Паскале является разделителем и не может стоять внутри идентификатора. Для создания идентификаторов, состоящих из двух слов, можно воспользоваться большими буквами, например ReadText, или символом подчеркивания Read_Text, но не пробелом Read Text.

Ø Применение других символов (букв неанглийского алфавита, знаков препинания, элементов псевдографики и т.д.) в идентификаторах не допускается.

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

Ø Турбо-Паскаль имеет большое количество зарезервированных слов, например, Begin, End, Program и т.д. Эти слова не могут быть использованы в качестве идентификаторов.

 

Общая структура программы в Турбо-Паскале.

 

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

1) Раздел объявлений и соглашений (декларируемая часть).

2) Раздел текстов процедур и функций.

3) раздел основного блока.

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

 

Заголовок программы.

 

Программа в Турбо-Паскале начинается со слова Program и имени программы. Слово Program зарезервировано в Турбо-Паскале и не может использоваться ни в каких других целях, кроме объявления имени программы. В версии 7.0 эта строка не обязательна и ее можно опустить, однако рекомендуется использовать имена программ, обычно указывая в имени номер версии программы. Следующее за оператором Program имя является идентификатором и обладает всеми его свойствами. В частности, внутри тела программы не могут быть объявлены объекты, имя которых совпадает с именем программы. Само имя программы в дальнейшем нигде не используется.

 

 

Глобальные директивы компилятора.

 

В этом разделе программы компилятору можно дать указания, определяющие его режим работы. Эти указания оформляются в тексте программы как комментарии, начинающиеся парой символов «{$». Далее следует имя, состоящее из одной или нескольких букв. Команда завершается символом «}».Эти команды могут содержать указания на включение в текст программы фрагментов других программ, информацию для отладчика или сведения о необходимости использования математического сопроцессора.

Например, {$R-} - отключить проверку диапазонов индексов массивов,

{$N+} - использовать сопроцессор.

Открывающие скобки, символ «$» и ключ (буква со знаком) должны быть написаны без пробелов между ними.

 

Оператор Uses.

 

Турбо-Паскаль имеет библиотеку подпрограмм, так называемых модулей, которые позволяют выполнить некоторые дополнительные операции. Имеется 10 стандартных модулей для режима DOS:

Ø System - модуль содержит процедуры и функции стандартного Паскаля.

Ø DOS и WinDos - модули, поддерживающие большинство функций операционной системы.

Ø Crt - модуль содержит подпрограммы управления дисплеем.

Ø Printer - модуль позволяет выводить информацию на принтер, используя операторы Write и Writeln.

Ø Overlay - модуль для работы с динамической памятью.

Ø Strings - модуль для работы со строками.

Ø Graph - модуль для работы с графикой.

Ø Turbo3, Graph3 - модули для работы с программами версии Турбо-Паскаль 3.0.

Оператор Uses служит для подключения модулей в программу. Форма записи:

Uses <список модулей>, например Uses Crt, Printer;

Названия модулей в списке разделяются запятой.

Оператор Uses может быть использован в программе только один раз. Если он присутствует, то должен открывать раздел описаний основной программы или следовать за кодовым словом interface в модуле. Если библиотеки модулей не используются, то оператор Uses не ставится.

 

Объявления глобальных меток, констант, типов и переменных.