Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodicheskie_ukazania_k_KR.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
344 Кб
Скачать
☆

Задача 1.1.

Дана исходная матрица m*n (m, n <=7) с элементами типа REAL. Сформировать другую матрицу такого же размера, у которой внутренние элементы являются средним арифметическим разности соседних элементов исходной матрицы, а наружные элементы оставлены без изменения. Найти максимальное отклонение между соответствующими элементами матриц.

На листинге 1.1 приведен полный текст этой программы, включая две вспомогательные процедуры формирования матрицы и форматированного вывода матрицы. Поскольку далее эти процедуры не будут включаться в листинги задач, следует сделать ряд комментариев. В процедуре ввода используется генератор случайных чисел, формирующий элементы матрицы как действительные числа из диапазона от -10.0 до +10.0. При формировании другой последовательности оператор присваивания во внутреннем цикле необходимо заменить. Например, если необходимо, чтобы элемент был равен индексам, конечно в их формальном, математическом представлении, то можно использовать следующий оператор a[i,j]:=10*i+j. В процедуре вывода следует настраивать формат вывода так, чтобы матрица целиком помещалась на экране монитора. Наконец, если тип элементов матрицы отличен от REAL, то следует выполнить необходимую коррекцию.

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

Листинг 1.1. Заголовок программы опущен.

Const m=5; n=7;

Type Ta=array[1..m,1..n] of real;

// Процедура ввода.

Procedure InA(m, n : word; Var a : Ta);

Var i, j : word;

Begin

Randomize;

for i:=1 to m do

for j:=1 to n do a[i,j]:=10-20*random;

End;

// Процедура вывода.

Procedure OutA(m, n : word; a : Ta);

Var i, j : word;

Begin

for i:=1 to m do

begin

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

writeln;

end;

writeln;

End;

// Процедура обработки.

Procedure RazA(m, n : word; a : Ta;

Var b : Ta; Var smax : real);

Var i, j : word;

s:real;

Begin

b:=a;

smax:=0;

for i:=2 to m-1 do

for j:=2 to n-1 do

begin

b[i,j]:=(a[i+1,j]-a[i-1,j]+a[i,j+1]-a[i,j-1])/2;

s:=abs(a[i,j]-b[i,j]);

if s>smax then smax:=s;

end;

End;

// Глобальные переменные и основная программа.

Var a, b:Ta;

smax:real;

BEGIN

// Ввод и вывод исходной матрицы.

InA(m,n,a);

OutA(m,n,a);

// Обработка.

RazA(m,n,a,b,smax);

// Вывод результата.

OutA(m,n,b);

writeln(' smax=', smax:10:3);

readln;

END.

Задача 1.2.

Создать процедуру формирования из исходной матрицы n*n с элементами типа DOUBLE результирующей матрицы n-1*n-1 путем вычеркивания строки idel и столбца jdel. С использованием этой процедуры создать процедуры вычисления определителей второго, третьего и четвертого порядка. Решить систему из четырех линейных уравнений по правилу Крамера1.

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

Итак, ключевым моментом в методе Крамера является способ получения матрицы меньшей размерности d путем вычеркивания idel строки и jdel столбца исходной матрицы a. Алгоритм этих действий может быть построен двояко, смотря по тому признаку, чьи индексы используются при формировании результата, то ли исходной матрицы, то результирующей. Далее представлена «точка зрения» результирующей матрицы, для которой формируются свои индексы. Правило здесь простое - пока соответствующий индекс меньше вычеркиваемого, он остается равным индексу исходной матрицы, в противном случае - увеличивается на единицу.

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

Наконец, чтобы максимально упростить проверку результатов, в процедуре ввода InA генерацию исходной матрицы рекомендуется выполнять круглыми целыми значениями, например a[i,j]:=3-random(7). В основной программе формируется и выводится исходная матрица 3*3, три матрицы 2*2 вместе с их определителями и определитель исходной матрицы.

Листинг 1.2а. Текст отладочного варианта программы. Заголовок и раздел описания P&F с текстом подпрограмм InA и OutA опущен.

Const nmax = 11;

Type Ta = array[1..nmax,1..nmax] of double;

// Здесь размещается текст процедур InA и OutA.

// Процедура вычисления определения матрицы d

Procedure ADop(a : Ta; n : word; idel, jdel :word;

Out d : Ta);