Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LAB4

.pdf
Скачиваний:
3
Добавлен:
12.02.2015
Размер:
646.51 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА 4.

ИПОЛЬЗОВАНИЕ ПРОЦЕДУР И ФУНКЦИЙ. РАБОТА С МАССИВАМИ. РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ

Массив

Массив это упорядоченные данные одного типа. Массив состоит из элементов, имеющих порядковые номера, называемые индексами. Например, объекты одинакового типа можно обозначить одним общим именем "A", тогда элементы объекта будут A[1], A[2] и т. д. В квадратных скобках указывается индекс (порядковый номер элемента). К элементам массива можно обращаться только по индексу. Если элементы имеют один индекс, то массив называется одномерным (вектор). Массивы с двумя независимыми индексами называются двумерными (матрицами, таблицами). Значения элементов двумерного массива обычно выводят на экран в виде таблицы. Массивы, имеющие три независимых индекса трехмерным и т.д.

Описание массивов: Type

Vector: array[1..3] of real; { задание типа массив с именем Vector }

Var

A:Vector; { объявление массива А типа Vector }

B:array[1. . 30] of Integer; { объявление массива В без имени } C, D: array[1. . 3] of real;

S:array[1. . 30] of string[12];

Инициализация массива или присвоение значений элементам массива:

1.Через операции присвоения в программе A[1]:=5; A[2]:=4; A[3]:=4.5; и т.д.

2.Если известна зависимость, по которой изменяются значения элементов массива, то присвоение значений удобно проводить в операторах цикла с параметром или с условием. Например, присвоим значения элементам массива "y" по

зависимости: y=sin(x), где x= Pi * i/180, 0<= i <=180 .

For i:= 0 to 180 Do y[i]:= sin(Pi * i/180);

3.Присвоение случайных значений. Например, в диапазоне от -30 до +40 ста элементам массива "R":

Randomize; For i:= 1 to 100 Do R[i]:= - 30 + Random(71);

4.Присвоение значений с клавиатуры. Например, семи элементам массива "A" оператором Readln:

For i:= 1 to 7 Do

begin Write( ' Введите A[ ' , i , ' ] = ' ); Readln( A [i] ) end;

5. Ввод из файла

 

Assign(F1,'File1.dat'); { назначить F1 файл File1.dat }

Reset(F1); i:= 1;

{ открыть файл File1.dat для чтения }

While not (EOF(F1)) =True do { выполнять пока не достигнем конца файла

File1.dat }

begin read(F1, X[i]); I+1 end;{ считать данные из файла

File1.dat }

Close (F1);

{ закрыть файл File1.dat }

Поэлементная обработка массивов

Вцикле удобно определять:

1.сумму элементов массива, и, удовлетворяющие некоторому условию, например:

s:= 0; for i:= 1 to 100 do s:= s + a[i]; { s - сумма элементов массива }

2.наибольший (наименьший) элемент

a_max:= a[1]; for i:= 1 to 100 do { поиск наибольшего элемента a[j] }

if a[i] > a_max then begin a_max:= a[i]; j:= i end;

3. создавать новые массивы j:= 0; k:= 0;

for i:=1 to 100 do {создание новых массивов с элементами: b[j] >=0, c[k] <0}

j:= 0; k:= 8; for i:= 1 to 100 a[k]}

if a[i] >= 0 then begin j:= j+1; b[j]:= a[i] end else begin k:= k+1; c[k]:= a[i] end;

do {создание массива номеров "M" для элементов: a[i] >

if a[i] > a[k] then begin j:= j+1; M[j]:= i end;

Двумерные массивы

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

Var A: array[1..30, 1..7] of byte;

Рассмотрим пример работы с двумерными массивами.

Описанная выше таблица может быть представлена в виде набора элементов строк ( 30) и столбцов ( 7 ):

Массив значений можно, например, задать с использованием функции

Random, например:

for i:= 1 to N do for j:= 1 to M do A[i, j]:= random(4)+2;

Для вывода элементов массива "A" на экран удобно использовать вложенный цикл:

for i:= 1 to N do

begin writeln; for j:= 1 to M do write(A[i,j]:7, ' _ _')

end;

Для расчета массива "SS" - сумм "M" элементов в каждой из "N" строк массива "A" (NxM) можно применить операторы:

for i:= 1 to N do

begin SS[i]:= 0;

for j:= 1 to M do SS[i]:= SS[i] + A[i, j] end;

Здесь для каждого индекса "i" от 1 до N происходит суммирование элементов A[i, j] по индексу "j" от 1 до M.

При модификации массива "A" изменяется расположение данных в исходном массиве, например, в случае вставки данных из линейного массива "B" в колонку с номером "M1" необходимо сдвинуть данные в колонках J >= M1 используя операторы:

for i:= 1 to N do begin

for j:=M+1 downto M1+1 do A[i,j]:=A[i,j-1]; A[i,M1]:=B[i] end;

При создании новых массивов согласно некоторым условиям выбираются данные из элементов исходного массива. Например, для создания массива "В" из четных столбцов массива "A" можно использовать операторы:

for j:= 1 to M do If (j Mod 2) = 0 then for i:= 1 to N do B[i,j Div 2]:= A[i,j];

Для создания массива "В", состоящего из строк массива "A", удовлетворяющих условию A[i,1] > C, где C - заданное число, можно использовать операторы:

k:= 0;

for i:= 1 to N do

If A[i,1] > C then begin k:= k + 1; for j:= 1 to M do B[k,j]:= A[i,j] end;

Пример 1.

Организация ввода элементов одномерного массива с клавиатуры.

PROGRAM Primer_1;

const K=5; { Количество элементов в массиве }

type M = Array [1...К] of Integer; { Описание типа массива} var A:M;

PROCEDURE Wwod_Hass (var S:M); {вв.с клавиатуры эл.массива} var I: Integer;

BEGIN

WrlteLn ('Введите элементы массива А: '); For i:=1 to К do

begin Write ('Введите ',i, 'элемент массива '}; ReadLn(S[i]) end

END;

PROCEDURE Wywod_Mass (S:M); {выв. на экран эл. массива} var i: Integer;

BEGIN

Write ('Вот Ваш массив: '); For i:=1 to К do Write (S[i],' ') END;

BEGIN

Wwod_Mass (A); { Вызов процедуры ввода элементов массива } Wywod_Hass (A) { Вызов процедуры вывода элементов массива} END

Пример 2.

Организация ввода элементов двухмерного массива с клавиатуры

PROGRAM Primer_2;

const M = 2; { Количество строк в массиве }

N = 3; { Количество столбцов в массиве } type Т = Array [1..M,1..N] of Integer; {типа массива} var A: T;

PROCEDURE Wwod_Mass (var S. T); {вв. с клав-ры эл. массива} var i,j:Integer;

BEGIN

WriteLn ('Введите массив: "); For i:= 1 to M do

For j:= 1 to N do begin

Write (-Введите S[-,i, ,j, ']: '); ReadLn (S[i,J]) end

ENd;

PROCEDURE Wywod_Mass (S: T); {выв на экран эл. массива } var i,j: Integer;

BEGIN

WriteLn ('Вот Ваш массив: '); For i:=1 to M do begin

For j:= 1 to N do Write (S[i,j], ' '); WriteLn end

END;

BEGIN

Wwod_Mass (A); { Вызов процедуры ввода элементов массива } Wywod Mass (A) { Вызов процедуры вывода элементов массива } END.

РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ

Сэтой задачей в физике, пожалуй, чаще всего сталкиваются на практике.

Вобщем случае система линейных уравнений имеет вид

а11 x1 + a12 х2 +... +а1n хn 1 а21 x1 + a22 x2 +... +а2n хn 2

. . . . . . . . .

аn1 х1 + аn2 х2 +... +аnn xn n.

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

МЕТОД ИСКЛЮЧЕНИЯ ГАУССА

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

гается сложением и вычитанием уравнений после умножения их на соответствующие постоянные множители. Выполняя эту процедуру вручную, нетрудно ошибиться, однако она позволяет построить удобный алгоритм численного решения на ЭВМ. Одним из используемых для этого методов является метод Гаусса. Применяя его, сначала нормируют первое уравнение, деля его коэффициенты на а , Затем первое уравнение умножают на первые коэффициенты, а всех других уравнений и последовательно вычитают из остальных уравнений. В результате первая переменная будет исключена из всех уравнений, кроме первого. На следующем этапе решения такая же процедура применяется к остальным n - 1 уравнениям. В результате из оставшихся n - 2 уравнений исключается вторая неизвестная. Всю процедуру повторяют до тех пор, пока после n шагов вся система не будет приведена к треугольному виду. Математически эту процедуру можно описать следующим образом. На k-м шаге процесса исключения новые нормированные коэффициенты k-го уравнения имеют вид

bk , j = ak , j , bk ,k

а новые коэффициенты в следующих уравнениях будут иметь вид bi,j =aij -aik bkj>k.

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

Х1 + Х2 + Х3 - Х4 = 2 Х1 - Х2 - Х3 + Х4 = 0 2X1 + X2 - X3 +2X4 = 9 ЗX1 + X2 +2Х3 - X4 = 7

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

А1

1 1 1 -1

2

А2

1 -1 -1 1

0

А3

2 1 -1 2

9

А4

3 1 2 -1

7

Исключая члены, содержащие х1 , получим

В1 1 /1

1 1 1 -1 2

В2 2 1

0 -2 -2 2

-2

В3 3 -2B1

0 -1 -3 4

5

В4 4 -ЗВ1

0 -2 -1 2 1

 

После исключения членов с х2

имеем

 

В1

1 1 1 -1

2

 

С2 2 /(-2)

0 1 1 -1 1

 

С3 3 2

0 0 -2 3 6

 

С4 4 +2С2

0 0 1 0

3

 

Исключение членов с х3

дает

 

 

 

 

В1

1

1

1

-1

2

С2

0

1

1

-1

1

D3 3 /(-2)

0

0

1

-3/2 -3

D4 =C4 -D3

0

0

0

3/2

6

Дойдя до последнего ряда, получим

В1

1

1

1

-1

2

С2

0

1

1

-1

1

В3

0

0

1 -3/2 -3

Е4 =2D4 /3

0

0

0

1

4

Возвращаясь к форме уравнений, получим

х1 + х2 + х3 - х3 = 2, x2 + x3 - x4 = 1, x3 - (3/2) x4 =-3,

x4 = 4,

откуда, подставляя значение х в 3-е уравнение, х - во 2-е и т.д., находим решение системы уравнений

х1 =1, х2 =2, х3 =З, х4 =4.

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

МЕТОД ПРОСТОЙ ИТЕРАЦИИ

Пусть система линейных уравнений

Ах=b

каким-либо образом приведена к виду

х= Cx+f,

где С - некоторая матрица, а f - вектор-столбец. Исходя из произвольного вектора х ,

 

 

x

(0)

 

 

 

 

1

 

х

(0)

x

(0)

 

 

=

2

 

 

 

...

 

 

 

 

(0)

 

 

 

xn

 

строим итерационный процесс

х(k+1) = Сх(k)

+f (k=0,1,2,...),

 

 

или в развернутой форме

 

 

 

 

x1(k+1)

=c11

x1(k) + c12

x2(k)

+...+ c13

x3(k)

+ f1

. . . . . . . . . . . . . . .

xn(k+1)

=c1n

x1(k) + c1n

x2(k)

+...+ c1n

x3(k)

+ fn

Производя итерации, получим последовательность векторов х(1) ,

x(2) ,..., x(k) ,...

Доказано , что если элементы матрицы С удовлетворяют одному из усло-

вий

n ci, j ≤β<1 (i=1,2,...,n)

j=1

или

n ci , j β < 1 (i=1,2,...,n)

j=1

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

х = klim→∞ X (k ) .

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

является приближенным решением. Оценка погрешности этого приближенного решения х можно определить по формуле:

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

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

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

ai , j 0 (i=1,2,...,n),

то систему (9.1) можно записать в виде

х1 = 1 (b1 - a12 x2 -...- a1n xn ),

a11

х2 =

1

 

(b2 - a21 x1 -...- a2n xn ),

a22

 

 

 

 

 

. .

 

.

.

.

.

хn =

1

 

(b1 - a12 x2 -...- a1n xn ),

an,n

 

 

 

 

 

В этом случае элементы матрицы С определяются следующим образом:

cij = −

aij

(ij), cii =0,

aii

 

 

и тогда условия (9.4) и (9.5) соответственно приобретают вид

n

aij

 

α <1

(i=1,2, ...,n),

aii

j=1

 

 

 

ij

aij

 

 

 

 

 

 

 

n

 

 

 

 

 

β <1

(i=1,2, ...,n),

 

 

 

aii

 

 

 

j=1

 

 

 

 

 

ij

 

 

 

 

 

 

 

 

 

 

Неравенства (9.7), (9.8) будут выполнены, если диагональные элементы матрицы А удовлетворяют условию

ii |> aij (i=1,2, ..., n),

ij

т.е. если модули диагональных коэффициентов для каждого уравнения системы больше суммы модулей всех остальных коэффициентов (не считая свободных членов).

В т о р о й с п о с о б (на примере оценки погрешности)

Решить систему

 

 

 

 

 

 

 

1,02 х1

-

0,05 х2

-

0,10 х3

= 0,795,

-0,11 х1

+ 1,03

х2

-

0,05

х3

=0,849,

-0,11 х1

-

0,12

х2

+ 1,04

х3

=1,398,

произведя три итерации. Указать погрешность полученного результата.

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

х1 = 0,795 - 0,02 х1 + 0,05 х2 + 0,10 х3 х2 = 0,849 + 0,11 х1 - 0,03 х2 + 0,05 х3 х3 = 1,398 + 0,11 х1 + 0,12 х2 - 0,04 х3

условия сходимости (9.4) для полученной системы выполнены. Действительно,

3 c1, j =0,02+0,05+0,10=0,17 < 1,

j=1

3 c2, j =0,11+0,03+0,05=0,19 < 1,

j=1

3 c3, j =0,11+0,12+0,04=0,27 < 1

j=1

Берем в качестве начального вектора х(0) столбец свободных членов, округлев его элементы до двух знаков после запятой:

0,8

х(0) = 0,851,4

Далее последовательно находим: при k=1

х1(1) =0,795-0,016+0,0425+0,140=0,96150,962, х2(1) =0,849+0,088-0,0255+0,070=0,98150,982, x3(1) =1,398+0,088+0,1020-0,056=1,532;

при k=2

х1(2) =0,978060,978, х1(2) =1,001961,002, х3(2) =1,560381,560;

при k=3

х1(3) =0,980, х2(3) =1,004, х3(3) =1,563.

Значения неизвестных при k = 2 и k = -3 отличаются не более чем на 310-3 ; поэтому, если в качестве приближенных значений неизвестных взять

х1 =0,980, х2 =1,004, x3 = 1,563,

то погрешность этих приближенных значений не превзойдет

0,27

3 103 <11, 103

1 0,27

 

МЕТОД ЗЕЙДЕЛЯ

Метод Зейделя является модификацией метода простой итерации. Он заключается в том, что при вычислении (k+1)-го приближения неизвестного х при i>1 используются уже вычисленные ранее (k+1)-е приближения неизвестных х х, ..., х . Таким образом, для системы вычисления по методу Зейделя ведутся по формулам

x1(k+1)

=c11x1(k) + c12 x2(k)

+...

+ c1n xn(k) +f1

x2(k+1)

=c21x1(k+1)

+ c22

x2(k)

+...

+c2 n-1 xn-1(k)+ c2n xn(k) +f2

. . . . . . . . . . . . . . . .

 

 

 

xn(k+1)

=cn1x1(k+1)

+ cn2

x2(k+1)

+... +cn n-1 xn-1(k+1)+ cn n xn(k) +f2

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]