Операции с матрицами
Понятие, характеристика матрицы, особенности работы и основные операции с ней. Решение систем линейных уравнений и вычисление обратной матрицы методом Гаусса. Особенности языка Паскаль. Разработка компьютерной программы для вычисления обратной матрицы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 08.01.2017 |
Размер файла | 62,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовая работа
по дисциплине "Основы программирования"
на тему "Операции с матрицами"
Выполнил:
Студент группы ФИ62.0314.2.35.МКТ
Ямковая Ирина
Проверил:
Преподаватель кафедры
Левченко Дмитрий
Введение
Современная математика ориентирована на использование компьютеров для прикладных расчетов. Любые математические приложения начинаются с построения модели явления (изделия, действия, ситуации или другого объекта), к которому относится изучаемый вопрос. Методы решения систем линейных алгебраических уравнений в линейной алгебре называют первой основной задачей. К ней относят задачи вычисления определителей и элементов обратной матрицы, которые иногда называют второй и третьей основными задачами линейной алгебры.
Многие современные программные комплексы имеют средства обработки матриц. Языки программирования при составлении программ для представления матриц используют, как правило, двумерные массивы. Благодаря индексированию элементов образуются конструкции близкие по написанию и обработке матрицам. Циклическая обработка массивов позволяет получать компактную и понятную запись программы для большинства языков программирования высокого уровня таких, как PASCAL, C++, FORTRAN, BASIC и др.
В ходе выполнения курсового проекта была разработана программа, с помощью которой можно найти обратную матрицу и выполнить простые действия над матрицами.
1. Матрицы
1.1 Понятие матрицы
Матрицей называется прямоугольная таблица из чисел, содержащая некоторое количество m строк и некоторое количество n столбцов. Числа m и n называются порядками матрицы. В случае если m = n, матрица называется квадратной, а число m = n - ее порядком.
1.2 Основные операции над матрицами
Основными арифметическими операциями над матрицами являются умножение матрицы на число, сложение и умножение матриц.
Прежде всего, договоримся считать матрицы равными, если эти матрицы имеют одинаковые порядки и все их соответствующие элементы совпадают.
Перейдем к определению основных операций над матрицами.
Сложение матриц: Суммой двух матриц, например: A и B, имеющих одинаковое количество строк и столбцов, иными словами, одних и тех же порядков m и n называется матрица С = ( Сij )( i = 1, 2, …m; j = 1, 2, …n ) тех же порядков m и n, элементы Cij которой равны.
Cij = Aij + Bij ( i = 1, 2, …, m; j = 1, 2, …, n ) ( 1.2 )
Для обозначения суммы двух матриц используется запись C = A + B.
Операция составления суммы матриц называется их сложением
Итак, по определению имеем:
+ =
=
Из определения суммы матриц, а точнее из формулы (1.2) непосредственно вытекает, что операция сложения матриц обладает теми же свойствами, что и операция сложения вещественных чисел, а именно:
переместительным свойством: A + B = B + A
сочетательным свойством: (A + B) + C = A + (B + C)
Эти свойства позволяют не заботиться о порядке следования слагаемых матриц при сложении двух или большего числа матриц.
Разностью двух матриц A и B одинаковых порядков естественно назвать такую матрицу C тех же порядков, которая в сумме с матрицей B дает матрицу A. Для обозначения разности двух матриц используется естественная запись: C = A - B.
Произведение матриц: Произведением матрицы A = (Aij) (i = 1, 2, …, m; j = 1, 2, …, n), имеющей порядки соответственно равные m и n, на матрицу B = (Bij) (i = 1, 2, …, n;
j = 1, 2, …, p), имеющую порядки соответственно равные n и p, называется матрица C = (Сij) ( i = 1, 2, …, m; j = 1, 2, …, p ), имеющая порядки, соответственно равные m и p, и элементы Cij, определяемые формулой
Cij = ( i = 1, 2, …, m; j = 1, 2, …, p ) (1.4)
Для обозначения произведения матрицы A на матрицу B используют запись
C = AB. Операция составления произведения матрицы A на матрицу B называется перемножением этих матриц. Из сформулированного выше определения вытекает, что матрицу A можно умножить не на всякую матрицу B: необходимо чтобы число столбцов матрицы A было равно числу строк матрицы B. Для того чтобы оба произведения AB и BA не только были определены, но и имели одинаковый порядок, необходимо и достаточно, чтобы обе матрицы A и B были квадратными матрицами одного и того же порядка.
Формула (1.4) представляет собой правило составления элементов матрицы C,
являющейся произведением матрицы A на матрицу B. Это правило можно сформулировать и словесно: Элемент Cij, стоящий на пересечении i-й строки и j-го столбца матрицы C = AB, равен сумме попарных произведений соответствующих элементов i-й строки матрицы A и j-го столбца матрицы B. В качестве примера применения указанного правила приведем формулу перемножения квадратных матриц второго порядка
=
Из формулы (1.4) вытекают следующие свойства произведения матрицы A на матрицу B:
сочетательное свойство: (AB) C = A (BC);
распределительное относительно суммы матриц свойство:
(A + B) C = AC + BC или A (B + C) = AB + AC.
Вопрос о перестановочном свойстве произведения матриц имеет смысл ставить лишь для квадратных матриц одинакового порядка. Элементарные примеры показывают, что произведений двух квадратных матриц одинакового порядка не обладает, вообще говоря, перестановочным свойством. В самом деле, если положить
A = , B = , то AB = , а BA =
Те же матрицы, для произведения которых справедливо перестанавочное свойство, принято называть коммутирующими.
Умножение матриц некоммутативно, т.е. АВ ВА даже если определены оба произведения. Однако, если для каких - либо матриц соотношение АВ=ВА выполняется, то такие матрицы называются перестановочными.
Самым характерным примером может служить единичная матрица, которая является перестановочной с любой другой матрицей того же размера. Перестановочными могут быть только квадратные матрицы одного и того же порядка: АЕ = ЕА = А
Очевидно, что для любых матриц выполняются следующее свойство: AO = O; OA = O,
где О - нулевая матрица.
Для любых квадратных матриц det (AB) = detAdetB.
Матрицу В называют транспонированной матрицей А, а переход от А к В транспонированием, если элементы каждой строки матрицы А записать в том же порядке в столбцы матрицы В.
Обратная матрица -- такая матрица A? №, при умножении на которую исходная матрица A даёт в результате единичную матрицу E:
A A? №= A? №A=E
Квадратная матрица обратима тогда и только тогда, когда она невырожденная, то есть её определитель не равен нулю. Для неквадратных матриц и вырожденных матриц обратных матриц не существует.
2. Определители. Вычисление определителей
Прежде всего, необходимо запомнить, что определители существуют только для матриц квадратного вида, ибо для матриц другого типа не существует определителей. В теории систем линейных уравнений и в некоторых других вопросах удобно использовать понятие определителя, или детерминанта.
Рассмотрим какую-либо четверку чисел, записанных в виде матрицы по два в строках и по два столбцах, Определителем или детерминантом, составленным из чисел этой таблицы, называется число ad--bc, обозначаемое так:
.
Такой определитель называется определителем второго порядка, поскольку для его составления взята таблица из двух строк и двух столбцов. Числа, из которых составлен определитель, называются его элементами; при этом говорят, что элементы a и d составляют главную диагональ определителя, а элементы b и c его побочную диагональ. Видно, что определитель равен разности произведений пар элементов, стоящих на его главной и побочной диагоналях. Определитель третьего и любого другого порядка находится примерно также, а именно: Допустим, что у нас есть квадратная матрица .
Определителем следующей матрицы является такое выражение: a11a22a33 + a12a23a31 + a13a21a32 - a11a23a32 - a12a21a33 - a13a22a31.. Как вы видите он просчитывается довольно легко, если запомнить определенную последовательность. С положительным знаком идут главная диагональ и образующиеся из элементов треугольники, имеющие параллельную главной диагонали сторону, в данном случае это треугольники a12a23a31, a13a21a32.
С отрицательным знаком идут побочная диагональ и треугольники ей параллельные, т.е. a11a23a32, a12a21a33. Таким образом находятся определители любого порядка. Но бывают случаи, когда и этот метод становится довольно сложным, например, когда элементов в матрице очень много, и для того, чтобы сосчитать определитель нужно затратить уйму времени и внимания.
Существует более легкий способ вычисления определителя n-ого порядка, где n2. Договоримся называть минором любого элемента Aij матрицы n-ого порядка определитель, соответствующий той матрице, которая получается из матрицы в результате вычеркивания i-й строки и j-ого столбца (той строки и того столбца, на пересечении которых стоит элемент Aij). Минор элемента Aij будем обозначать символом . В этом обозначении верхний индекс обозначает номер строки, нижний - номер столбца, черта над M означает, что указанные строка и столбец вычеркиваются.
Определителем порядка n, соответствующим матрице, назовем число, равное
и обозначаемое символом
.
3. Решение систем линейных уравнений методом Гаусса
Одним из самых распространенных методов решения систем линейных уравнений является метод Гаусса. Этот метод (который также называют методом последовательного исключения неизвестных) известен в различных вариантах уже более 2000 лет.
Вычисления с помощью метода Гаусса заключаются в последовательном исключении неизвестных из системы для преобразования ее к эквивалентной системе с верхней треугольной матрицей. Вычисления значений неизвестных производят на этапе обратного хода.
Помимо аналитического решения СЛАУ метод Гаусса также применяется для:
-нахождения матрицы, обратной к данной (к матрице справа приписывается единичная такого же размера, что и исходная: , после чего приводится к виду единичной матрицы методом Гаусса-Жордана; в результате на месте изначальной единичной матрицы справа оказывается обратная к исходной матрица: );
-определения ранга матрицы (согласно следствию из теоремы Кронекера -Капелли
ранг матрицы равен числу её главных переменных);
-численного решения СЛАУ в вычислительной технике (ввиду погрешности вычислений используется Метод Гаусса с выделением главного элемента, суть которого заключена в том, чтобы на каждом шаге в качестве главной переменной выбирать ту, при которой среди оставшихся после вычёркивания очередных строк и столбцов стоит максимальный по модулю коэффициент)
В отличие от матричного метода и метода Крамера, метод Гаусса может быть применен к системам линейных уравнений с произвольным числом уравнений и неизвестных. Метод Гаусса - один из основных результатов линейной алгебры и аналитической геометрии, к нему сводятся множество других теорем и методов линейной алгебры (теория и вычисление определителей, решение систем линейных уравнений, вычисление ранга матрицы и обратной матрицы, теория базисов конечномерных векторных пространств и т.д.).
Алгоритм Гаусса использует элементарные преобразования матрицы двух типов.
Преобразование первого рода: две строки матрицы меняются местами, и при этом знаки всех элементов одной из строк изменяются на противоположные.
Преобразование второго рода: к одной строке матрицы прибавляется другая строка, умноженная на произвольное число.
Метод Гаусса в математическом варианте состоит в следующем:
-ищем сначала ненулевой элемент в первом столбце. Если все элементы первого столбца нулевые, то переходим ко второму столбцу, и так далее. Если нашли ненулевой элемент в k-й строке, то при помощи элементарного преобразования первого рода меняем местами первую и k-ю строки, добиваясь того, чтобы первый элемент первой строки был отличен от нуля;
-используя элементарные преобразования второго рода, обнуляем все элементы первого столбца, начиная со второго элемента. Для этого от строки с номером k вычитаем первую строку, умноженную на коэффициент ak1/a11.
-переходим ко второму столбцу (или j-му, если все элементы первого столбца были нулевыми), и в дальнейшем рассматриваем только часть матрицы, начиная со второй строки и ниже. Снова повторяем пункты 1) и 2) до тех пор, пока не приведем матрицу к ступенчатому виду.
Программистский вариант метода Гаусса имеет три отличия от математического:
-индексы строк и столбцов матрицы начинаются с нуля, а не с единицы;
недостаточно найти просто ненулевой элемент в столбце. В программировании все действия с вещественными числами производятся приближенно, поэтому можно считать, что точного равенства вещественных чисел вообще не бывает. Некоторые компиляторы даже выдают предупреждения на каждую операцию проверки равенства вещественных чисел. Поэтому вместо проверки на равенство нулю числа aij следует сравнивать его абсолютную величину ijс очень маленьким числом е (например, е = 0.00000001). Если ij=< е, то следует считать элемент aij нулевым;
-при обнулении элементов j-го столбца, начиная со строки i + 1, мы к k-й строке, где k > i, прибавляем i-ю строку, умноженную на коэффициент r = -akj/aij:
Такая схема работает нормально только тогда, когда коэффициент r по абсолютной величине не превосходит единицы. В противном случае, ошибки округления умножаются на большой коэффициент и, таким образом, экспоненциально растут. Математики называют это явление неустойчивостью вычислительной схемы. Если вычислительная схема неустойчива, то полученные с ее помощью результаты не имеют никакого отношения к исходной задаче. В нашем случае схема устойчива, когда коэффициент r = -akj/aij не превосходит по модулю единицы. Для этого должно выполняться неравенство Отсюда следует, что при поиске разрешающего элемента в j-м столбце необходимо найти не первый попавшийся ненулевой элемент, а максимальный по абсолютной величине. Если он по модулю не превосходит е, то считаем, что все элементы столбца нулевые; иначе меняем местами строки, ставя его на вершину столбца, и затем обнуляем столбец элементарными преобразованиями второго рода.
Основная идея метода Гаусса - привести матрицу систему к диагональному виду, то есть все элементы главной диагонали - нули. Для приведения матрицы к такому виду, мы выбираем самую верхнюю строку матрицы, и вычитаем её из всех остальных строк, умножив её для каждой строки на некий коэффициент, так, что самый левый столбец ниже главной диагонали заполнен нулями.
4. Вычисление обратной матрицы. Метод Гаусса
Пусть -- квадратная матрица порядка . Матрица , удовлетворяющая вместе с заданной матрицей равенствам:
называется обратной. Матрицу называют обратимой, если для нее существует обратная, в противном случае -- необратимой.
Из определения следует, что если обратная матрица существует, то она квадратная того же порядка, что и . Однако не для всякой квадратной матрицы существует обратная. Если определитель матрицы равен нулю , то для нее не существует обратной. В самом деле, применяя теорему об определителе произведения матриц для единичной матрицы
получаем противоречие
так как определитель единичной матрицы равен 1. Оказывается, что отличие от нуля определителя квадратной матрицы является единственным условием существования обратной матрицы. Напомним, что квадратную матрицу, определитель которой равен нулю, называют вырожденной {особой), в противном случае -- невырожденной.
Возьмём две матрицы: саму A и единичную E. Приведём матрицу A к единичной матрице методом Гаусса. После применения каждой операции к первой матрице применим ту же операцию ко второй. Когда приведение первой матрицы к единичномувиду будет завершено, вторая матрица окажется равной A? №.При использовании метода Гаусса первая матрица будет умножаться слева на одну из элементарных матриц Л(i) (диагональную матрицу с единицами на главной диагонали, кроме одной позиции):
Л(i)*…* Л(n)*A=E =› Л=A? №
Вторая матрица после применения всех операций станет равна Л, то есть будет искомой.
Иначе говоря, обратная матрица равна единице, делённой на определитель исходной матрицы и умноженной на транспонированную матрицу алгебраических дополнений элементов исходной матрицы.
5. Паскаль
Паскаль -- язык программирования общего назначения. Один из наиболее известных языков программирования, широко применяется в промышленном программировании, обучении программированию в высшей школе.
Особенности языка Паскаль
Паскаль был создан как язык для обучения процедурному программированию. Название языку дано в честь выдающегося французского математика, физика, литератора и философа Блеза Паскаля. Один из первых языков, для которых была создана реализация "на самом себе" -- компилятор Паскаля был написан на самом Паскале. В начале 1970-х годов для переноса Паскаль-систем на различные аппаратные платформы была создана система Pascal-P, в которой был единый компилятор Паскаля в промежуточный язык (P-код) и для каждой платформы создавался быстрый интерпретатор P-кода. Заимствование этой системы привело к созданию системы UCSD-Pascal в Университете Сан-Диего (Калифорния, США), намного позже её идеи были заимствованы создателями языка Java (байт-код, компиляция в байт-код, интерпретатор байт-кода).
Особенностями языка являются строгая типизация и наличие средств структурного (процедурного) программирования. Паскаль был одним из первых таких языков. По мнению Н. Вирта, язык должен способствовать дисциплинированию программирования, поэтому, наряду со строгой типизацией, в Паскале сведены к минимуму возможные синтаксические неоднозначности, а сам синтаксис автор постарался сделать интуитивно понятным даже при первом знакомстве с языком.
Наиболее известной реализацией Паскаля является система Turbo Pascal (выросшая затем в Borland Pascal и далее в Delphi) фирмы Borland, в которой язык был значительно расширен, были устранены некоторые недостатки языка, добавлены новые возможности. Язык стал богаче, но в отсутствие отраслевой стандартизации, потерял переносимость и общность (до появления в 1998 году Kylix -- Delphi для Linux, продукты Borland работали только на платформе DOS/Windows, в настоящее время Kylix фактически заморожена).
Важным шагом в развитии языка является появление свободного языка Паскаль GNU Pascal, который не только вобрал в себя черты других Паскалей, но и обеспечил чрезвычайно широкую переносимость написанных на нем программ (более 20 различных платформ, под более чем 10 различными операционными системами).
В 1986 году фирма Apple разработала объектное расширение языка Паскаль, получив в результате Object Pascal. В 1989 году аналогичные объектные средства были добавлены фирмой Borland в систему Turbo Pascal (языковые различия между объектным
Turbo Pascal 5.5 и Object Pascal от Apple крайне незначительны). Последующие версии Turbo Pascal, который стал затем называться Borland Pascal, дополняли объектное расширение новыми средствами, этот процесс продолжился и в ходе развития языка системы Delphi[1]. Название языка менялось: от Pascal, через Object Pascal for Delphi, в литературе встречалось название Delphi Pascal.
Программа курсового проекта была создана в PascalABC.net. PascalABC.net -- аналог PascalABC, с возможностью создавать exe файлы.PascalABC.NET -- свободно распространяющийся компилятор языка Object Pascal для.NET, предназначенный для обучения современному программированию.
6. Алгоритм работы программы
Обратная матрица находится с помощью процедур BR, SPL, SP, DS, DV. Затем идет проверка, если при умножении начальной матрицы на ту, которая получилась получается единичная матрица, то выводится обратная матрица процедурой writem, иначе выдается сообщение что обратной матрицы не существует.
Транспонирование матрицы осуществляется элементарной перестановкой в цикле:
Начальная матрица:
or i1:=1 to m1 do begin for j1:=1 to n1 do … end;
Транспонированная матрица:
for i1:=1 to n1 do begin for j1:=1 to m1 do … end;
Сложение и вычитание находятся одинаково, только для суммы k=1, а для разности k=-1
MAS3[i1,j1]:=MAS1[i1,j1]+k*MAS2[i1,j1];
Умножение матриц осуществляется только если число строк одной матрицы равно числу столбцов другой. Находится по этой формуле:
MAS3[i3,j3]:=MAS3[i3,j3] + MAS1[i3,i2] * MAS2[i2,j3];
Процедура MM. Состоит из таких символов как =, ¦, г, ¬, L, -, которые записаны через write. Цвет фона и текста blue+write.
Программа защищена от неправильного ввода данных процедурой ReadWord2, которая не позволяет нажимать ничего кроме цифр, клавиши Backspace и Enter.
Процедура PrintMatr1 выводит исходную матрицу.
VAR i1, i2, i3, i4: integer; {счетчик строк}
j1, j2, j3, j4: integer; {счетчик столбцов}
operation: integer; {вариант развития программы}
k,tip:integer; ch,kl:char;
MAS1, {массивы/матрицы,используемые в программе}
MAS2,
MAS3,
MAS4: array [1..10,1..10] of real;
m1,m2,m3,m4,n1,n2,n3,n4:integer;
BEGIN repeat
textbackground(blue);
clrscr;
textcolor(red);
MM(xx,yy,zz,ii);
textcolor(red);
menu(texmenu); rx:=4; ry:=18; rz:=1;
readword2(rr,rx,ry,rz); operation:=rr; {Занесение выбранного варианта в память}
Оператор выбора Case позволяет выбрать необходимое действие с матрицей
Case operation of
1,2: {сложение/вычитание}
3: {транспонирование}
4: {обратная матрица}
5: exit
После запуска программы, пользователю предлагается выбрать требуемую операцию: найти обратную матрицы, транспонированную, сложение или вычитание двух матриц. Это производится посредством ввода пользователем цифры, соответствующей данной операции,которые прописаны в меню. Далее следует запрос о размерах данной матрицы, после ввода которых программа проверяет, чтобы введенные значения не превышали допустимых размеров матрицы. В случае, если перечисленные условия не выполняются, на экран выводится сообщение об ошибке, Esc -выxoд в меню или нажать любую клавишу и повторить действие. При выполнении условий, пользователю предлагается ввести с клавиатуры исходную матрицу или воспользоваться случайным вводом данных { 1-ввести свои значения элементов,2-выбрать случайные значения элементов}
Текст программы на языке Pascal
Program MATRIX_2;
Uses crt;
const tr=10;
type TM=real;
vec=array[1..10] of real;
mas=array[1..10] of vec;
matrix=array[1..tr,1..tr] of TM;
matr=array[1..tr,1..tr] of longint;
var ai:matr; x,y,z:matrix; i,ir,jr:integer; err:boolean;
ik,ji,dt,ni:longint; l1:integer;
sa:mas;sb,sx:vec;
sh:real;
si,sj,sk,sn:integer; xx,yy,zz,ii:integer; bbb,texmenu:string;
rr:word; rx,ry,rz:byte;
Procedure MM(xx1,yy1,xx2,yy2:integer);
var xI:integer;
begin
xx1:=2; yy1:=1; xx2:=79; yy2:=25;
for xi:=xx1 to xx2-1 do
begin
GotoXY(xi,yy1);
write('=');
GotoXY(xi,yy2);
write('=');
end;
for xi:=yy1 to yy2 do
begin
GotoXY(xx1,xi);
write('¦');
GotoXY(xx2,xi);
write('¦');
end;
GotoXY(xx1,yy1);
write('г');
GotoXY(xx2,yy1);
write('¬');
GotoXY(xx1,yy2);
write('L');
GotoXY(xx2,yy2);
write('-');
end;
Procedure ReadWord2(Var Result: Word; x, y, MaxLength: byte);
Const
Symbol: set of char=['0'..'9',#8,#13];
Var
Str: string;
Code: integer;
Key: char;
Begin
GoToXY(x,y);
Str:= '';
repeat
repeat
Key:= ReadKey
until Key in Symbol;
case Key of
'0'..'9':
if Length(Str)>=MaxLength
then
begin
writeln ( 'длина больше заданной')
end
else
begin
write(Key);
Str:=Str+Key;
end;
#8:
if Length(Str)>0
then
begin
Delete(Str, Length(Str),1);
GoToXY(WhereX-1, WhereY);
write(' ');
GoToXY(WhereX-1, WhereY);
end
else
begin
write('строка пустая ')
end;
#13:
begin
Val(Str, Result, Code);
Exit
end;
end;
until False;
End;
procedure menu(var tex:string);
begin
clrscr; textcolor(white); mm(xx,yy,zz,ii); textcolor(white); gotoxy(25,3);
writeln('ОПЕРАЦИИ C МАТРИЦАМИ');
textcolor(white);
gotoxy(20,7);
WriteLn ('ВЫБОР ОПЕРАЦИИ ');
textcolor(white);
gotoxy(20,9);
writeln( ' ESC-возврат в меню');
writeln;
gotoxy(24,13); textcolor(white); WriteLn ('1- сложить матрицы');
gotoxy(24,14); textcolor(white); WriteLn ('2- вычесть матрицы');
gotoxy(24,15); textcolor(white); WriteLn ('3- транспонировать матрицу');
gotoxy(24,16); textcolor(white); WriteLn ('4- найти обратную матрицу');
gotoxy(24,17); textcolor(white); Writeln ('5- выход');
textcolor(white); writeln;
end;
procedure text(aaa:string);
begin textcolor(blue+white);
writeln; gotoxy(4,23); Writeln(' Haжмите клaвишy ESC для выходa в мeню');
gotoxy(4,24); Writeln(' Haжмите любyю клaвишy чтoбы выпoлнить дeйcтвиe eще рaз');
end;
procedure text1(aaa:string);
begin
clrscr; MM(xx,yy,zz,ii);
gotoxy(4,2);
writeln('1 - ввести свои значения элементов');
gotoxy(4,3);
writeln('2 - выбрать случайные значения элементов');
end;
procedure BR(var x,obr:matrix;err:boolean);
var y:matrix;
i,j:integer;
procedure SPL(i,j:integer);
var k:integer;
procedure SP(a,b:TM);
var c:TM;
begin c:=a; a:=b; b:=c end;
begin
for k:=1 to ni do
begin SP(x[i,k],x[j,k]); SP(y[i,k],y[j,k]) end;
end;
procedure DS(i,j:integer;alpha:TM);
var k:integer;
begin
for k:=1 to ni do
begin
x[i,k]:=x[i,k]+x[j,k]*alpha;
y[i,k]:=y[i,k]+y[j,k]*alpha
end
end;
procedure DV(i:integer;alpha:TM);
var k:integer;
begin
if alpha<>0 then
for k:=1 to ni do
begin
x[i,k]:=x[i,k]/alpha;
y[i,k]:=y[i,k]/alpha
end
end;
begin
for i:=1 to ni do
for j:=1 to ni do y[i,j]:=0;
for i:=1 to ni do y[i,i]:=1;
for j:=1 to ni-1 do
begin
i:=j;
while x[i,j]=0 do i:=i+1;
if i>ni then begin err:=true; end;
SPL(j,i);
for i:=j+1 to ni do begin if x[j,j]=0 then err:=true else
DS(i,j,-x[i,j]/x[j,j]); end;
end;
if x[ni,ni]=0 then begin err:=true; end;
for i:=1 to ni do DV(i,x[i,i]);
for i:=ni downto 2 do
for j:=i-1 downto 1 do DS(j,i,-x[j,i]);
obr:=y;
end;
procedure readm(var x:matrix);
var i,j,ti:integer;
begin repeat text1(bbb);
rx:=4; ry:=4; rz:=1;
readword2(rr,rx,ry,rz); ti:=rr; clrscr;
if (ti=1) then begin MM(xx,yy,zz,ii); gotoxy(4,2);
for i:=1 to ni do begin
for j:=1 to ni do begin write(' Введите элементы матрицы ',i,'_',j,': ');
rx:=4; ry:=3; rz:=3;
readword2(rr,rx,ry,rz); x[i,j]:=rr; clrscr; MM(xx,yy,zz,ii);
gotoxy(4,2);
end; end; end;
if (ti=2) then begin
randomize;
for i:=1 to ni do begin
for j:=1 to ni do begin
x[i,j]:=random(20); end; end; end;
until (ti>=1) and (ti<=2); clrscr; MM(xx,yy,zz,ii); gotoxy(4,2);
writeln('Начальная матрица:');
for i:=1 to ni do begin gotoxy(4,2+i);
for j:=1 to ni do write(x[i,j]:8:2); writeln; end;
end;
procedure writem(var x:matrix);
var i,j:integer;
begin writeln; gotoxy(4,6+2*ni); writeln('Обратная матрица:');
for i:=1 to ni do
begin gotoxy(4,6+2*ni+i);
for j:=1 to ni do write(x[i,j]:8:2,' ');
writeln;
end;
end;
procedure PrintMatr1(mat:matr;ng:integer);
var ik,ji:integer;
begin MM(xx,yy,zz,ii); gotoxy(4,2);
for ik:=1 to ni do
begin gotoxy(4,3+ik);
for ji:=1 to ni do
write(mat[ik,ji]:5);
writeln;
end;
end;
procedure GetMatr(ai:matr; var bi:matr; m,i,j:integer);
var ki,kj,di,dj:integer;
begin
di:=0;
for ki:=1 to m-1 do
begin
if (ki=i) then di:=1;
dj:=0;
for kj:=1 to m-1 do
begin
if (kj=j) then dj:=1;
bi[ki,kj]:=ai[ki+di,kj+dj];
end;
end;
end;
VAR i1, i2, i3, i4: integer;
j1, j2, j3, j4: integer;
operation: integer;
k,tip:integer; ch,kl:char;
MAS1,
MAS2,
MAS3,
MAS4: array [1..10,1..10] of real;
m1,m2,m3,m4,n1,n2,n3,n4:integer;
BEGIN repeat
textbackground(blue);
clrscr;
textcolor(red);
MM(xx,yy,zz,ii);
textcolor(red);
menu(texmenu); rx:=4; ry:=18; rz:=1;
readword2(rr,rx,ry,rz); operation:=rr;
Case operation of
1,2: begin
repeat
textbackground(blue); textcolor(white);
clrscr;
MM(xx,yy,zz,ii); gotoxy(4,2);
Write ('Введите кол-во строк первой и второй матрицы: ');
rx:=4; ry:=3; rz:=1;
readword2(rr,rx,ry,rz); m1:=rr; gotoxy(4,4);
Write ('Введите кол-во столбцов первой и второй матрицы: ');
rx:=4; ry:=5; rz:=1;
readword2(rr,rx,ry,rz); n1:=rr; gotoxy(4,7);
if (m1<1) or (n1<1) or (m1>5) or (n1>5) then
writeln('ОШИБКА!!!') else begin
repeat text1(bbb);
rx:=4; ry:=4; rz:=1;
readword2(rr,rx,ry,rz); tip:=rr; clrscr;
if (tip=1) then begin
for i1:=1 to m1 do begin
for j1:=1 to n1 do begin
clrscr; MM(xx,yy,zz,ii); gotoxy(4,2);
Write('Введите элементы матрицы A ',i1,'_',j1,': ');
rx:=4; ry:=3; rz:=3;
readword2(rr,rx,ry,rz); MAS1[i1,j1]:=rr; end; end;
writeln;
for i1:=1 to m1 do begin
for j1:=1 to n1 do begin
clrscr; MM(xx,yy,zz,ii); gotoxy(4,2);
Write('Введите элементы матрицы B ',i1,'_',j1,': ');
rx:=4; ry:=3; rz:=3;
readword2(rr,rx,ry,rz); MAS2[i1,j1]:=rr; end; end; end;
if (tip=2) then begin
randomize;
for i1:=1 to m1 do begin
for j1:=1 to n1 do begin
MAS1[i1,j1]:=random(20);
MAS2[i1,j1]:=random(20); end; end; end;
until (tip>=1) and (tip<=2);
clrscr; MM(xx,yy,zz,ii); gotoxy(4,2);
writeln('Mатрица A:');
for i1:=1 to m1 do
begin gotoxy(4,i1+2);
for j1:=1 to n1 do
Write(MAS1[i1,j1]:8:2);
WriteLn;
end;
writeln; gotoxy(4,m1+4);
Writeln('Mатрица B:');
for i1:=1 to m1 do
begin gotoxy(4,m1+4+i1);
for j1:=1 to n1 do
Write (MAS2[i1,j1]:8:2);
WriteLn;
end;
writeln; textcolor(lightblue);
if operation = 1 then begin k:=1; gotoxy(4,2*m1+6);
writeln('Сумма A+B:'); end;
if operation = 2 then begin k:=-1; gotoxy(4,2*m1+6);
writeln('Pазность A-B:'); end;
for i1:=1 to m1 do
for j1:=1 to n1 do
MAS3[i1,j1]:=MAS1[i1,j1]+k*MAS2[i1,j1];
for i1:=1 to m1 do
begin gotoxy(4,2*m1+6+i1);
for j1:=1 to n1 do Write(MAS3[i1,j1]:8:2);
WriteLn;
end; end;
ch:=readkey;
if ch=#0 then ch:=readkey;
until ch=#27;
end;
3: begin
repeat
textbackground(blue); textcolor(white);
clrscr; MM(xx,yy,zz,ii); gotoxy(4,2);
Write ('Введите кол-во строк исходной матрицы, не более 9: ');
rx:=4; ry:=3; rz:=1;
readword2(rr,rx,ry,rz); m1:=rr;
gotoxy(4,4);
Write ('Введите кол-во столбцов исходной матрицы, не более 9: ');
rx:=4; ry:=5; rz:=1;
readword2(rr,rx,ry,rz); n1:=rr;
gotoxy(4,7);
If (1>n1) or (n1>10) or (1>m1) or (m1>10)
then
WriteLn ('ОШИБКА!!!')
else begin
repeat text1(bbb);
rx:=4; ry:=4; rz:=1;
readword2(rr,rx,ry,rz); tip:=rr;
clrscr;
if (tip=1) then begin
for i1:=1 to m1 do begin
for j1:=1 to n1 do begin clrscr;
MM(xx,yy,zz,ii); gotoxy(4,2);
write('Введите элементы матрицы',i1,'_',j1,': ');
rx:=4; ry:=3; rz:=3;
readword2(rr,rx,ry,rz); MAS1[i1,j1]:=rr;
end; end; end;
if (tip=2) then begin
randomize;
for i1:=1 to m1 do begin
for j1:=1 to n1 do begin
MAS1[i1,j1]:=random(20); end; end; end;
until (tip>=1) and (tip<=2);
writeln;
begin
clrscr; MM(xx,yy,zz,ii); textcolor(yellow); gotoxy(4,2);
writeln('Начальная матрица:');
textcolor(LightGray);
for i1:=1 to m1 do begin gotoxy(4,2+i1);
for j1:=1 to n1 do write(MAS1[i1,j1]:4:0,' ');
writeln; end;
writeln;
textcolor(red); gotoxy(4,4+m1);
writeln('Транспонированная матрица: ');
textcolor(white);
for i1:=1 to n1 do begin gotoxy(4,4+m1+i1);
for j1:=1 to m1 do write(MAS1[j1,i1]:4:0,' ');
writeln; end;
end; end;
ch:=readkey;
if ch=#0 then ch:=readkey;
until ch=#27;
end;
4: begin
repeat
textbackground(blue); textcolor(white);
clrscr;
MM(xx,yy,zz,ii); gotoxy(4,2);
write('Введите порядок матрицы: '); rx:=4; ry:=3; rz:=1;
readword2(rr,rx,ry,rz); ni:=rr; gotoxy(4,5);
if (ni<=1) or (ni>5) then writeln('ОШИБКА!!!') else begin
begin
readm(x);
BR(x,y,err);
end;
for ir:=1 to ni do
for jr:=1 to ni do begin
z[ir,jr]:= 0;
for i:= 1 to ni do
z[ir,jr]:=z[ir,jr] + x[ir,i] * x[i,jr];
end;
begin
writeln; gotoxy(4,4+ni);
writeln('Проверка: должна быть единичная матрица.');
for ir:=1 to ni do begin gotoxy(4,4+ni+ir);
for jr:=1 to ni do
Write(z[ir,jr]:8:2);
WriteLn;
end;
end;
writeln;
textcolor(lightgreen);
for ir:=1 to ni do
for jr:=1 to ni do begin
if ((ir=jr) and (z[ir,jr]<>1)) or ((ir<>jr) and (z[ir,jr]<>0)) then
l1:=1; end; gotoxy(4,10+2*ni);
if (l1=1) then writeln('Обратной матрицы не существует.')
else writem(y);
end;
ch:=readkey;
if ch=#0 then ch:=readkey;
until ch=#27;
end;
5: exit
end;
until kl=#27;
ReadKey;
end.
Заключение
матрица гаусс паскаль компьютерный
Развитие вычислительной техники с самого начала было направлено на облегчение и ускорение математических расчетов. Большой класс математических задач связан с использованием матриц: решение систем уравнений, векторная алгебра и многое другое. Операции над матрицами используются во многих отраслях науки и техники. Разработано множество методик и алгоритмов математического моделирования с помощью матриц или таблиц.
Вычисление обратной матрицы является второй главной задачей линейной алгебры, и применяется при решении сложных систем линейных уравнений с несколькими неизвестными.
В данном проекте была разработана программа, состоящая из модулей: сложение/вычитания матриц, транспонирование матриц, вычисления обратной матрицы
Программа курсового проекта была создана в PascalABC.net. Cистема программирования PascalABC.NET, ориентирована на обучение современному программированию. PascalABC -- реализация обычного паскаля, разработана для обучения программированию.
Список использованных источников
1. Гутер Р.С., Резниковский П.Т. "Программирование и вычислительная математика".
2. Михалев А.А, Михалев А.В." Алгебра матриц и линейные пространства".
3. Андреева Т.А. "Программирование на языке Pascal. Учебное пособие".
4. Калмыкова О.В. Практикум на ЭВМ [Электронный ресурс]: учебное пособие.
5.Голицына О. Л., Попов И. И. "Программирование на языках высокого уровня".
6.Мостовской А.П. "Численные методы и система Mathematica".
Размещено на Allbest.ru
Подобные документы
Решение систем алгебраических линейных уравнений методом Гаусса. Вычисление обратной матрицы и определителя. Декомпозиция задачи. Схема взаимодействия интерфейсных форм. Описание процедур и функций. Тестирование разработанного программного продукта.
курсовая работа [1,1 M], добавлен 05.06.2012Понятие определителя матрицы, математические и алгоритмические основы его расчета, функциональные модели, блок-схемы и программная реализация. Сущность метода Гаусса для решения систем линейных алгебраических уравнений и вычисления определителя матрицы.
контрольная работа [455,2 K], добавлен 18.01.2010Применение численного метода решения систем линейных алгебраических уравнений, используемых в прикладных задачах. Составление на базе метода матрицы Гаусса вычислительной схемы алгоритма и разработка интерфейса программы на алгоритмическом языке.
курсовая работа [823,9 K], добавлен 19.06.2023Основные операции над матрицами. Формирование матрицы из файла. Ввод матрицы с клавиатуры. Заполнение матрицы случайными числами. Способы формирования двухмерных массивов в среде программирования С++. Произведение определенных элементов матрицы.
курсовая работа [537,0 K], добавлен 02.06.2015Разработка программы для решения системы линейных уравнений методом Крамера и с помощью расширенной матрицы на языке С++. Описание метода Крамера. Структура программы: заголовочные файлы, типы данных, переменные, идентификаторы, операторы, массивы.
курсовая работа [32,3 K], добавлен 19.01.2009Решение системы линейных уравнений с матричными элементами и свободными членами с использованием метода Гаусса с выбором главного элемента, основанного на приведении матрицы системы к треугольному виду с помощью нахождения элементов главной диагонали.
лабораторная работа [71,1 K], добавлен 10.12.2014Описание методов вычисления определителя матрицы. Математическое решение задачи с применением метода исключения Гаусса с выбором главного элемента. Схема алгоритма программы, описание переменных и структур данных, текст программы на языке Pascal.
курсовая работа [438,8 K], добавлен 16.02.2011Сферы использования компьютеров, сущность и языки программирования. Применение модифицированного метода Гаусса и расширенной матрицы для решения системы линейных алгебраических уравнений (СЛАУ). Разработка программы, системные требования для ее работы.
курсовая работа [657,1 K], добавлен 09.01.2014Составление процедуры для матрицы, разложения матрицы на множители, решения системы линейных уравнений, нахождения определителя матрицы и матрицы с транспонированием. Суть метода квадратного корня. Разложение матрицы на множители. Листинг программы.
лабораторная работа [39,4 K], добавлен 18.09.2012Разработка эскизного и технического проектов программы преобразования заданной матрицы в ортогональную матрицу. Сравнивание транспонированной матрицы с обратной с целью проверки ортогональности. Выбор состава технических и программных средств реализации.
курсовая работа [52,1 K], добавлен 09.12.2014