Курсовая работа (т): Решение систем линейных уравнений. Метод Гаусса

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

 (3.2)

что возможно при , в противном случае надо осуществить перестановку уравнений системы. Согласно формуле (3.2) необходимо каждый элемент первой строки расширенной матрицы СЛАУ поделить на диагональный элемент

 (3.3)

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

, где  (3.4)

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

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

Запишем выражения для неизвестных  и преобразования эелементов расширенной матрицы системы, которые обобщают формулы (3.2)-(3.4):

,

. (3.5)

Второй этап решения СЛАУ называется обратным ходом метода Гаусса и состоит в последовательном определении неизвестных  по первой формуле (3.5), начиная с неизвестного  и заканчивая .

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

Количество арифметических операций в методе Гаусса связано с размерностью системы и примерно равно 2/3. Контроль полученных решений можно провести путем их подстановки в исходную СЛАУ и вычисления невязок , разностей между правыми и левыми частями уравнений:

 (3.6)

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

Рисунок 4.1 - Блок-схема программы решения СЛАУ методом Гаусса

Программу решения СЛАУ методом Гаусса составим из трех блоков (рисунок 1). В блоке 0 (основная программа) задаем порядок системы и обращаемся к блоку 1, в котором определяются элементы расширенной матрицы СЛАУ. Затем обращаемся к блоку 2, где реализована программа метода Гаусса. После этого выводим на дисплей результаты решения СЛАУ либо сообщение о том, что решения не существует в случае вырожденной матрицы (DET = 0).

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

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

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

Особенностью программы метода Гаусса на языке Паскаль является введение новых типов переменных МАТ и VEC для матрицы А и вектора результатов X. Такое введение необходимо потому, что переменные А и X являются формальными и фактическими параметрами процедур.

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

Рисунок 4.2 - Блок-схема алгоритма

программный алгебраический линейный гаусс

4. Порядок выполнения работы


Название в данной программе не самое важное, поэтому начинаем нашу программу с команды USES CRT - подключаем модуль. Далее следует раздел описаний. Описываем там используемые переменные и саму систему уравнений. Так как наша система линейных алгебраических уравнений это своеобразный массив, то и описываем её соответствующе:

var a:array[1..3,1..4] of real;:array[1..3] of real;:array[1..3] of real;,i,j,k:integer;z,r,g:real; (4.1).

Начинаем программу со слова begin. Делаем очистку экрана и присваиваем нашей переменной n значение 3. Она будет отвечать за количество уравнений системы. Далее следует writeln - указываем подсказку для пользующегося программой о том, какие данные необходимо ввести в программу. Вводим сам массив(систему) через цикл:

for i:=1 to n do

for j:=1 to n+1 do(A[i,j]); (4.2)

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

for i:=1 to n doj:=1 to n+1 do(A[i,j]:6:2);;

end; (4.3)

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

for k:=1 to n do

beginj:=k+1 to n do:=a[j,k]/a[k,k];i:=k to n do[j,i]:=a[j,i]-r*a[k,i];;[j]:=b[j]-r*b[k];

end;; (4.4)

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


for k:=n downto 1 do:=0;j:=k+1 to n do:=a[k,j]*x[j];:=r+g;;[k]:=(b[k]-r)/a[k,k];

end; (4.5)

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

for i:=1 to n do('x[',i,']=',x[i]:0:2,' ');

writeln;; (4.6)

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

5. Использование модуля CRT


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

Чтобы подключить модуль используем команду «uses ctr» в строке. Эту команду следует использовать перед begin. Далее следует «begin», который сообщает о начале программы. Первое, что необходимо было сделать, это поменять фон. Моим выбором стал жёлтый цвет. Команда TextBackGround (yellow). Далее очищаем экран для применения цвета фона командой ClrScr. Изменяем цвет текста на красный командой TextColor (red). Перемещаем точку в наиболее подходящее место для последующей надписи командой GoToXY (16,5). Координаты выбираем так, что бы полная надпись легла на центр окна. Делаем надпись уже выбранным красным цветом одной из наиболее известных команд: write ('БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ'). Снова меняем положения курсора GoToXY (27,6). Координаты выбраны так, чтобы сделать надпись на строчку ниже write ('Автотракторный факультет'). Ещё раз опускаем курсор на строчку ниже командой GoToXY. Cледующая надпись: Кафедра «Гидропневмоавтоматика и гидропневмопривод». Для общей красоты оформления меняем цвет текста на голубой - TextColor(blue).

Перемещаем текст уже значительно ниже и правее - GoToXy (31,10). Следующим текстом я выбрал «Курсовая работа».

Опять меняем цвет текста командой textcolor (green). Выбранным зелёным цветом, в координатах gotoxy (34,19) пишем автора работы: «Выполнил: Швец А.Н., студент группы №10105213». Меняем положения курсора на строку ниже и указываем руководителя работы: «Руководитель работы: Eрмилов С.В.». Меняем цвет текста на розовый - textcolor (LightMagenta). Практически в самом низу (gotoxy (32,23)) дополняем оформление - write ('Минск 2014'). Делаем рациональную по времени задержку выполнения данного оформления командой delay (5500). Перемещаем курсор на строку ниже, для того чтобы текст не налаживался друг на друга. Выбираем цвет текста - blue (голубой). Это для последующей надписи от самой программы, которая просит нажать любую клавишу для продолжения.

По этому описанию составляем текст программы, который будет входить в основную программу и отвечать за её оформление. Данный текст располагаем впереди основной программы. Важно после каждого оператора не забывать знаки пунктуации, а именно «;». После слова begin ничего не ставим. В конце, после end, должна стоять точка. Текст такого моего оформления программы выглядит примерно следующим образом (пояснения работы каждой строки программы указаны после самих строк курсивом, после знака «//»:

crt; //Подключаем модуль

(yellow); //Цвет фона делаем жёлтым; //Делаем очистку экрана и применяем цвет(red); //Цвет текста делаем красным(16,5); //Перемещаем курсор в координаты (16,5)('БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ'); // Выводим на экран надпись БЕЛОРУССКИЙ

НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ(27,6); //Перемещаем курсор в координаты (27,6)('Автотракторный факультет'); //Выводим надпись Автотракторный факультет(15,7); //Перемещаем курсор в координаты (15,7)('Кафедра «Гидропневмоавтоматика и гидропневмопривод»');

//Выводим надпись Кафедра «Гидропневмоавтоматика и

гидропневмопривод»(blue); //Цвет текста делаем голубым(31,10); //Перемещаем курсор в координаты (31,10)('Курсовая работа'); //Выводим надпись Курсовая работа(8,11); //Перемещаем курсор в координаты (8,11)('Тема: Решение систем линейных алгебраических уравнений.

Метод Гаусса'); //Выводим надпись Тема: Решение систем линейных

алгебраических уравнений. Метод Гаусса.(green); //Цвет текста делаем зелёным(34,18); //Перемещаем курсор в координаты (34,18)('Выполнил: Швец А.Н., студент группы №10105213'); //Выводим

текст Выполнил: Швец А.Н., студент группы №10105213(34,19); //Перемещаем курсор в координаты (34,19)('Руководитель работы: Eрмилов С.В.'); //Выводим текст

Руководитель работы: Ермилов С.В.(LightMagenta); //Выбираем цвет текста розовым(32,23); //Перемещаем курсор в координаты (32,23)('Минск 2014'); //Выводим текст Минск 2014(5500); //Делаем задержку выполнения(18, 24); //Перемещаем курсор в координаты (18,24)(blue); //Выбираем цвет текста голубым.

6. Таблицы идентификаторов


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

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

Таблица 6.1

Глобальные переменные программы

a,b:real;

промежуток интегрирования [a,b] где a<b

n:integer;

количество точек разбиения интервала [a,b]

h:real;

шаг с которым двигаются по интервалу [a,b]

i,j,k:integer;

вспомогательные переменные для счетчиков

sGaus:real;

накапливаемое значения интеграла

sInt:real;

реальное значение интеграла

kol:integer;

количество узлов для метода Гаусса 2,5 или 10

nodes_file : text;

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

NodesAndKof : array[1..10,1..2] of real;

файл со справочными данными для метода Гаусса - коэффициенты

GrafsFileF : text;

Формируемый файл для программы Grapher - функция

GrafsFileRez: text;

Формируемый файл c результатами

res:char;

Принимает значение y или n. Производить пересчет интеграла или нет

Источник: https://www.bibliofond.ru/detail.aspx?id=869954