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

LAB4

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

ДОСТОИНСТВА ИТЕРАЦИОННЫХ МЕТОДОВ

Если метод итераций сходится, он дает следующие преимущества по сравнению с методами, рассмотренными выше.

1)Если итерации сходятся достаточно быстро, т. е. Если для решения системы требуется менее n итераций, то получаем выигрыш во времени, так как число арифметических действий, необходимых для одной итерации, пропорционально n а общее число арифметических действий в методе Гаусса, например, пропорционально n .

2)Погрешности округления в методе итераций сказываются значительно

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

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

3)Метод итераций становится особенно выгодным при решении систем,

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

4)процесс итераций приводит к выполнению однообразных операций и сравнительно легко программируется на ЭВМ.

ПРИМЕР ПРОГРАММЫ РЕШЕНИЯ СИСТЕМЫ УРАВНЕНИЙ МЕТОД ГАУССА

Метод Гаусса реализован в виде подпрограммы. Вызывается из основной программы, в которой и задается исходное уравнение.

Обратите особое внимание! Использовалась процедура с параметрами переменными (в заголовке процедуры стоят слова VAR). Это нужно для того чтобы не тратить времени и памяти на размещение внутри процедуры копии массива, а также чтобы не переполнить стек при их передаче в подпрограмму.

type ttarr=array [1..3,1..3] of real; (* объявление типов *) type tarr=array [1..3] of real;

var

n,i,j:integer; (*обявление переменных*) a1:ttarr;

x1,b1:tarr;

procedure Gauss(var A:ttarr;var X,B:tarr); (*заголовок процедуры*) var

h:real;

I,J,K:integer;

begin

 

 

 

for I:=1 to N-1 do

 

 

begin

 

 

 

for J:=I+1 to N do

 

 

begin

 

 

A[J,I]:=-A[J,I]/A[I,I];

(*нормированные кооф.*)

for k:=I+1 to N do

 

 

A[J,K]:=A[J,K]+A[J,I]*A[I,K]; (*выч. новых кооф.*)

B[J]:=B[J]+A[J,I]*B[I]

 

end;

 

 

end;

 

 

 

X[N]:=B[N]/A[N,N];

(*обратное решение. Найдена одна*)

for i:=n-1 downto 1 do

(*переменная*)

begin

 

 

 

h:=b[i];

(*определение остальных

for J:=I+1 to N do h:=h-X[J]*A[I,J]; переменных*)

X[I]:=h/A[i,i]

 

 

end;

 

 

 

end;

 

 

 

begin

(*начало основной программы*)

n:=3;

(*задание размерности и системы уравнений*)

a1[1,1]:=4; A1[1,2]:=0.24;

A1[1,3]:=-0.08; b1[1]:=8; x1[1]:=1.8;

a1[2,1]:=0.09; A1[2,2]:=3;

A1[2,3]:=-0.15; b1[2]:=9; x1[2]:=3;

a1[3,1]:=0.04; A1[3,2]:=-0.08; A1[3,3]:=4; b1[3]:=20;x1[3]:=5;

Writeln;

 

for i:=1 to n do

(*Вывод системы на экран*)

begin

 

for j:=1 to n do write(a1[i,j]:2:2,' ');

writeln(b1[i]:2:2,'

',x1[i]:2:2);

end;

 

writeln;writeln;

 

Gauss(A1,x1,b1);

(*решение системы методом Гаусса*)

for i:=1 to n do

writeln(' ',x1[i]:2:7) (*Вывод решения на экран*) end.

ПРИМЕР ПРОГРАММЫ РЕШЕНИЯ СИСТЕМЫ УРАВНЕНИЙ МЕТОДОМ ИТТЕРАЦИЙ

Используем метод итераций для решения того же уравнения. Структура программы такая же. Процедура решения уравнения указанным методом называется Iter. При начальных значениях заданных в переменных х1[1], х1[2], х1[3]

type ttarr=array [1..3,1..3] of real; type tarr=array [1..3] of real;

var

s,n,i,j:integer; (*s-специально объявлена за пределами процедуры*) e:real;

a1:ttarr;

z,x1,b1:tarr;

procedure Itter(var A:ttarr;var X,B:tarr;e:real); (*Заголовок процедуры*)

var

 

 

 

I,J,K:integer;

 

begin

 

 

 

s:=0;

(*количество итераций*)

repeat

 

 

 

k:=0;

(*Сброс флага точности результата*)

for i:=1 to n do

 

begin

 

 

 

x[i]:=-b[i];

 

for j:=1 to n do x[i]:=x[i]+a[i,j]*z[j]; (*вычисление итерации*)

if abs(x[i]/a[i,i])>=e then k:=1; (*проверка точности и сброс*)

x[i]:=z[i]-x[i]/a[i,i]

(*флага*)

end;

 

 

 

for i:=1 to n do z[i]:=x[i]; (*замена на новое приближение*)

s:=s+1;

 

 

 

until k=0;

(*Конец итераций*)

end;

 

 

 

begin

 

(*основная программа*)

n:=3;e:=1e-4;

 

a1[1,1]:=4;

A1[1,2]:=0.24;

A1[1,3]:=-0.08; b1[1]:=8; x1[1]:=2;

a1[2,1]:=0.09; A1[2,2]:=3;

A1[2,3]:=-0.15; b1[2]:=9; x1[2]:=3;

a1[3,1]:=0.04; A1[3,2]:=-0.08; A1[3,3]:=4;

b1[3]:=20;x1[3]:=5;

Writeln;

 

for i:=1 to n do begin

for j:=1 to n do write(a1[i,j]:2:2,' '); writeln(b1[i]:2:2,' ',x1[i]:2:2);

end;

writeln;writeln;

itter(A1,x1,b1,e); for i:=1 to n do

writeln(' ',x1[i]:2:7) (*вывод решения*) Writeln('Кол-во итераций=',s:3)

end.

ПРИМЕР ПРОГРАММЫ РЕШЕНИЯ СИСТЕМЫ УРАВНЕНИЙ МЕТОДОМ ЗЕЙДЕЛЯ

Модифицируем предыдущую программу для решения системы методом Зейделя.

type ttarr=array [1..3,1..3] of real; type tarr=array [1..3] of real;

var s,n,i,j:integer; e:real; a1:ttarr; z,x1,b1:tarr;

procedure Itter(var A:ttarr;var z,B:tarr;e:real); var

I,J,K:integer;

x:tarr; begin s:=0; repeat k:=0;

for i:=1 to n do begin

x[i]:=-b[i];

for j:=1 to n do x[i]:=x[i]+a[i,j]*z[j]; if abs(x[i]/a[i,i])>=e then k:=1; x[i]:=z[i]-x[i]/a[i,i];

z[i]:=x[i] (*отличия здесь*) end;

s:=s+1; until k=0;

end;

 

begin

 

n:=3;e:=1e-4;

 

a1[1,1]:=4; A1[1,2]:=0.24;

A1[1,3]:=-0.08; b1[1]:=8; x1[1]:=2;

a1[2,1]:=0.09; A1[2,2]:=3;

A1[2,3]:=-0.15; b1[2]:=9; x1[2]:=3;

a1[3,1]:=0.04; A1[3,2]:=-0.08; A1[3,3]:=4; b1[3]:=20;x1[3]:=5; Writeln;

for i:=1 to n do begin

for j:=1 to n do write(a1[i,j]:2:2,' '); writeln(b1[i]:2:2,' ',x1[i]:2:2);

end;

writeln;writeln;

itter(A1,x1,b1,e); for i:=1 to n do

writeln(' ',x1[i]:2:7); writeln('КОЛ-ВО ИТЕРАЦИЙ=',s:3)

end.

Текстовые файлы

Вприкладных программах, как правило, имеется большое число входных

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

мы. Напомним, что файлом называется именованная область внешней па-

мяти ЭВМ, содержащая различные данные. Доступ к данным в файле может быть прямым или последовательным в зависимости от типа файла. Рассмотрим работу с данными текстовых файлов.

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

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

ASCII коды.

б) Строки текстового файла заканчиваются символом #13- Enter и #10- воз-

врат каретки, вводятся оба при нажатии на клавиатуре клавиши Enter (при-

знак EOLn – End Of Line).

с) Признаком конца файла является код #26 (управляющий символ Ctrl+Z, если файл вводится с клавиатуры) записываемый в его конец (признак EOF – End Of File). При записи в файл данные записываются подряд, а управляющие символы устанавливаются автоматически оператором Writeln. Управляющие символы работают при просмотре/редактировании файла на экране или при печати, но при этом, как правило, не показываются.

Запись информации и считывание ее из текстового файла происходит с помощью процедур ввода и вывода Writeln (или Write) и Readln (или Read) через

файловую переменную.

1.Файловая переменная "F" описывается в разделе переменных

Var f:Text;

2.Файловая переменная "F" связывается с именем файла на диске, процедурой:

Assign(F, 'Имя_файла');

Например: Assign(F, 'file. dat'); связывает с переменную "F" с файлом "file. dat", если файл находится в текущем каталоге, а в противном случае перед его именем указывают маршрут (префикс): 'C:\Pascal\Work\file.dat'. Связывание файловой переменной "F" с именем файла на диске означает обращение к этому файлу при каждом использовании переменной в файловых процедурах.

3. Файл открывается:

а) для записи данных процедурой – ReWrite(F);

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

Assign(F,‘Имя_файла’);. Процедурой Write(F,y1,y2,…);

или Writeln(F,y1,y2,…); из указанных переменных данные записываются в файл. Процедура Writeln(F,y1,y2,…); дополнительно устанавливает в конце выводимых данных управляющие символы: #13, #10. Здесь обозначено y1,y2,… - список переменных. Повторное применение процедуры стирает содержимое файла и устанавливает указатель на начало файла.

б) для считывания данных процедурой – Reset(F);

При первом обращении к файлу внутренний указатель устанавливается на начало файла, и данные считываются с начала файла процедурой Read(F, y1,y2,…); или Readln(f, y1,y2,…); (при каждом обращении к файлу указатель увеличивается на единицу). Процедура Readln(f, y1,y2,…); после считывания данных в указанные переменные переводит указатель за управляющие символы: #13, #10, игнорируя возможно оставшиеся в строке данные. Следовательно, процедура Readln(F); пропускает все данные записанные до управляющих символов #13, #10. Повторное применение оператора Reset(F); снова устанавливает указатель на начало файла для считывания данных, содержимое файла при этом не меняется.

Конец файла можно определить с помощью функции EOF(F), которая возвращает TRUE, если внутренний указатель файла переменной F достиг метки “конец файла” (иначе FULSE).

с) для добавления данных в конец файла процедурой – Append(F);

На диске должен существовать файл с именем, указанным в операто-

ре Assign(F,’Имя_файла’);.

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

Close(F);

Записывает метку “конец файла” (EOF – End Of File). Если программа не закроет, по какой либо причине файл, то возможна потеря данных.

!!! Если в процедурах ввода/вывода не указывается переменная "F" то происходит вывод данных на экран или их считывание с клавиатуры с отображением на экране.

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

Программа ниже выводит в текстовый файл File1.dat пары значений чисел вводимых с клавиатуры. Ввод пары нулевых значений завершает программу.

Program Wwod;

 

var

 

a,b:Real;

 

F1:Text;

{ файловя переменная F1 для работы с текстовым фай-

лом}

 

{ закрыть файл File2.dat } { закрыть файл File1.dat }
{закончить цикл при вводе a=0 и b=0}
{ закрыть файл File1.dat }

Begin

{ назначить переменой F1, имя файла: File1.dat }

Assign(F1,'File1.dat');

ReWrite(F1);

{ открыть файл File1.dat для записи }

Writeln(‘Введите построчно a и b’); { вывести первую строчку на экран}

Writeln(F1,' A, B');

{ вывести первую строчку в файл}

repeat

{ считать с клавиатуры элементы a и b }

readln(a, b);

If (a<>0)and(b<>0) then writeln(F1,a:6:2,’ ‘,b:8:3);{записать пару элементов в файл}

until (a=0) and (b=0); ); Close (F1); Writeln(‘Файл записан’)

End.

Следующий пример программы читает из предыдущего текстового файла пары чисел, складывает их (условная обработка) и затем все снова записывает в текстовый файл “File2.dat”.

Program Obrabotka_I_Zapis; Const C1=100;

var

X,Y,Z: Real;{ }

F1, F2:Text; { файловые переменные F1 и F2 для работы с текстовыми файлами}

S:String;

 

 

Begin

 

{ назначить переменой F1, имя файла: File1.dat }

Assign(F1,'File1.dat');

Assign(F2,'File2.dat');

{ назначить переменой F2, имя файла: File2.dat }

Rewrite(F2);

 

{ открыть файл File2.dat для записи

}

 

 

 

Reset(F1);

 

 

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

}

 

 

 

Readln(F1,S);

{ прочитать первую строку в файле File1.dat }

S :=S + ’

Z’;

{ добавить в строку ‘ Z’ }

Writeln(S);

{ вывод строку на экран }

Writeln(F2,S); { вывод строку в файл File2.dat }

While not (EOF(F1)) =True do

{ выполнять пока не достигнем конца файла

File1.dat }

 

 

 

begin

readln(F1, X, Y);{ считать данные из файла File1.dat } Z:= X+Y; {пример расчета нового значения }

writeln(X:6:2,’ ‘,Y:8:3,’ ‘, Z:8:3);{ вывести данные на экран } writeln(F2,X:6:2,’ ‘,Y:8:3,’ ‘,Z:8:3);{ записать данные в файл File2.dat }

end; Close (F2); Close (F1);

ЗАДАНИЯ ДЛЯ ВЫПОЛНЕНИЯ

I. Произвести решение уравнений методом Гаусса, методом простой итерации и методом Зейделя.

1)

20,9 x1

+

1,2 x2

+

2,1 x3 +

0,9 x4

=21,70

1,2 x1

+ 21,2 x2

+

1,5 x3 +

2,5 x4

=27,46

2,1 x1

+

1,5 x2

+ 19,8 x3 +

1,3 x4

=28,76

0,9 x1

+

2,5 x2

+

1,3 x3 +

32,1 x4

=49,72

2)

 

 

 

 

 

 

 

10,9 x1

+

1,2 x2

+

2,1 x3

+

0,9 x4

= 7,0

1,2 x1

+ 11,2 x2

+

1,5 x3

+

2,5 x4

= 5,3

2,1 x1

+

1,5 x2

+

9,8 x3

+

1,3 x4

=10,3

0,9 x1

+

2,5 x2

+

1,3 x3

+

12,1 x4

=24,6

3)

 

 

 

 

 

 

 

 

4 ,00 x1

+

0,24 x2

- 0,08 x3 +

0,16 x4

= 8

0,09 x1

+

3,00 x2

-

0,15 x3

-

0,12 x4

= 9

0,04 x1

-

0,08 x2

+ 4,00 x3

+

0,06 x4

=20

0,02 x1

+

0,06 x2 + 0,04 x3

- 10,00 x4 = 1

4)

 

 

 

 

 

 

 

 

8,714 x1

+

2,180 x2

- 5,684 x3

= 49,91

-1,351 x1

+ 10,724 x2

- 5,224 x3 = 50,17

0,040 x1

- 0,459 x2

+ 6,799 x3

= 32,68

5)

 

 

 

 

 

 

 

 

3 ,82 x1

+

1,02 x2

- 0,75 x3 +

0,81 x4

= 15,655

1,05 x1

+

4,53 x2

-

0,98 x3

-

1,53 x4

= 22,705

0,73 x1

-

0,85 x2

+ 4,71 x3

+

0,81 x4

= 23,480

0,88 x1

+

0,81 x2 + 1,28 x3

-

3,58 x4

= 16,110

II. Представить преподавателю 2-е рабочие программы для работы с одномерными и 3 – для работы с двумерными массивами из списка задач (задачи 1-52).

III Представить преподавателю 1 программу обработки файлов (задачи 53-60).

Список задач

1. Даны два числа М и N и два упорядоченных массива A[1]≤A[2]≤....≤A[M] и B[1]≤B[2]≤....≤B[M] Образовать из этих элементов упорядоченный массив

C[1]≤C[2]....≤C[M+N].

Указание. Эта важная задача принципиально должна быть выполнена за M+N действий. Возьмем из А и В по первому элементу. Меньший из них занесем в С и заменим следующим из того же массива. Снова выберем меньший из двух, занесем в С и т.д. После каждого сравнения в С добавляется элемент - значит, сравнений будет меньше, чем M+N . Нужно только позаботиться о том, чтобы программа работала верно и при исчерпании одного из массивов.

2.В массиве Х[1..N] каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все нули, затем все единицы и. наконец, все двойки (дополнительного массива не заводить!).

3.Дан двухмерный массив А[1..m,1..n]. Написать программу построения одномерного массива В[1..m], элементы которого соответственно равны а) суммам элементов строк, б) произведениям элементов строк, в) средним арифметическим элементов строк.

4.Найти наибольший элемент данного массива и указать номер этого элемента.

5.Расположить элементы данного массива в обратном порядке (первый элемент меняется с последним, второй - с предпоследним и т.д. до середины; если массив содержит нечетное количество элементов, то средний остается без изменения).

6.В данном массиве поменять местами элементы, стоящие на нечетных местах, с элементами, стоящими на четных местах

7.Найти сумму элементов, стоящих на четных местах в заданном массиве.

8.Элементы массива А записать в виде массивов В и С, причем в массив В записать элементы, стоящие на нечетных местах в массиве А, а в массив С записать элементы, стоящие на четных местах в массиве А

9.Определить, сколько чисел входят в данный массив только по одному разу (более, чем по одному разу).

10. Массив А[1..30,1..7] содержит два (и только два) одинаковых числа. Требуется напечатать их индексы. (Обратите внимание на то, чтобы никакой элемент массива не сравнивался сам с собой)

11. Массив А[1..5,1..7] содержит вещественные числа. Требуется ввести целое число К и вычислить сумму элементов А[I,J], для которых I+J=K. Прежде, однако следует убедиться, что значение К позволяет найти решение, в противном случае нужно напечатать сообщение об ошибке.

12. Заполнить двухмерный массив Т[1..n,1..n] последовательными целыми числами от 1 до n2, расположенными по спирали, начиная с левого верхнего угла и продвигаясь по часовой стрелке,

1 2 3 4 5 6

20 21 22 23 24 7

19 32 33 34 25 8

18 31 36 35 26 9

17 30 29 28 27 10

16 15 14 13 12 11

13. Дан массив А[1..N,1..N]. Составить программу, которая прибавила бы каждому элементу данной строки элемент, принадлежащий этой строке и главной диагонали 14. В данном одномерном массиве целых чисел найти максимальное значение и

все номера членов последовательности, равных ему.

15. В данном двухмерном массиве А[1..n,1..n] с целыми коэффициентами для каждой строки найти максимальное значение элемента в этой строке, напечатать этот элемент и его индексы.

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

17. В данной последовательности целых чисел найти количество различных четных неотрицательных чисел.

18. Написать программу замены положительных элементов вещественного мас-

сива Y[1..N] на 0.

19. В данном двухмерном массиве А[1..n,1..n] с целыми коэффициентами для каждого столбца найти минимальное значение элемента в этом столбце, напечатать этот элемент и его индексы.

20. В данном числовом массиве найти число повторений элемента, равного заданному.

21. В данной последовательности целых чисел найти количество различных чисел.

22. Найти максимальный элемент среди отрицательных элементов массива А[1..7].

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

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

25.Для вещественного массива Y[1..n] определить порядковые номера целых элементов.

26.Для вещественного массива Y[1..n] подсчитать количество его целых элементов.

27.Вычислить след заданной квадратной матрицы A[N,N]. След квадратной матрицы - это число, равное сумме элементов главной диагонали.

28.Для вещественного (целого) массива А[1..N] найти сумму всех элементов, имеющих: а) четные порядковые номера; б) нечетные порядковые номера.

29.Составить программу, увеличивающую ненулевые элементы линейного вещественного массива Y[1..N] на 1.

30.Для линейного вещественного массива Y[1..N] подсчитать количество элементов, имеющих ненулевую дробную часть.

31. Для линейного целого (вещественного!) массива А[1..N] найти сумму всех элементов: а) равных заданному числу 0; б) не равных заданному числу D; в) больше заданного числа D; г) не больше заданного числа 0; д) меньше заданного числа D; е) не меньше заданного числа D.

32. Из массива А[1..N, 1..N] сформировать массив В[1..N2 ], "развернув" его по столбцам (по строкам).

33.Осуществить циклическую перестановку элементов массива: первый элемент должен стать вторым, второй - третьим и т.д., последний - первым. Нового массива не заводить.

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

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