Решение системы линейный алгебраических уравнений методом Гаусса с поиском главного элемента по строке
Министерство
образования и науки Российской Федерации
Государственное
образовательное учреждение
Высшего
профессионального образования
"ОРЕНБУРГСКИЙ
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ"
Факультет
экономики и управления
Кафедра
математических методов и моделей в экономике
ОТЧЕТ
По
лабораторному практикуму
По курсу
численные методы
по теме
"Решение СЛАУ методом Гаусса с поиском главного элемента по строке"
Руководитель:
Яркова О.Н.
Исполнитель
Студент гр. 09ММЭ
Евдокимов Д. А.
Оренбург 2011
Содержание
1) Постановка
задачи
) Краткие
теоретические сведения
) Алгоритм
) Код
программы
) Тестовый
пример
) Проверка в
MathCad
1)
Постановка задачи
Найти корни системы линейных алгебраических уравнений, используя метод
Гаусса с поиском главного элемента по строке.
2) Краткие
теоретические сведения
Система линейных алгебраических уравнений (СЛАУ) имеет вид
Ax=b,
где , ,
СЛАУ имеет решение, если ранг матрицы А равен n (числу переменных) и если матрица А не является вырожденной.
Существуют следующие методы решения СЛАУ:
) Метод Крамера;
) Метод Гаусса;
) Матричный подход;
) LU-разложение;
) и другие.
Рассмотрим метод Гаусса с поиском главного элемента по строке.
Матрицей перестановок Р будет называть матрицу размерности n x n, у которой в каждом столбце/строке только один элемент равен
единице, а остальные - 0. Элементарной матрицей перестановок Pkl будем называть матрицу, полученную
из единичной перестановкой k-того
и l-того столбцов.
Если матрица не является вырожденной, то существует такая матрица
перестановок, что матрица P*A имеет отличные от нуля главные
миноры.
Найдя максимальный по модулю элемент в текущей строке, ставим его на
первое место, используя матрицу перестановок.
После перестановки используем метод LU-разложения, на каждом шаге которого переставляем
максимальный и i-тый элементы в i-той строке, используя матрицу
перестановок Pij, где j - номер столбца с максимальным элементом в i-той строке.
гаусс алгебраический уравнение алгоритм
0) А, b, i:=1.
) Ищем в i-той строке
наибольший по модулю элемент и меняем его местами с элементом aii, находя А*Рji , где j - номер столбца с максимальным элементом в i-той строке А.
) Находим элементы матрицы Li, Ai:=Li*А*Рji, Bi:=Li*b.
) Если i=n, то переходим к шагу 4. Иначе - i:=i+1, к шагу 1.
) ,
где - n-ный элемент
вектора bn-1, а - стоящий в нижнем правом углу
элемент матрицы an-1.
,
где . х - искомый вектор решений.
4)
Блок-схема
5)
Код программы
Unit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, XPMan, Grids, ComCtrls;= class(TForm): TEdit;:
TLabel;: TUpDown;: TStringGrid;: TLabel;: TStringGrid;: TEdit;: TLabel;:
TXPManifest;: TButton;Edit1Change(Sender: TObject);Button1Click(Sender:
TObject);
{ Private declarations }
{ Public declarations };l, la, a: array [0..100, 0..100] of
Real; //Формат: номер матрицы L, строки, столбцы,b,xsolved: array [0..100] of
real; //xsolved - вектор-решение СЛАУ:Real;
//Промежуточная переменная
i,j,n,k: integer;
ch: array [0..100] of Integer;: TForm1;
//(num+1) - номер очередной матрицы L
//Сама процедура находит L c индексом (num+1)
begini:=0 to (n-1) do beginj:=0 to (n-1) do L[i,j]:=0;[i,
i]:=1;;[num, num]:=1/a[num, num];i:=(num+1) to (n-1) do begin[i, num]:=-a[i,
num]*L[num, num];[i, i]:=1;;;lamatrix (num:integer);
//Получаем матрицу L(num+1)*...*L(1)*A
var x:real;num=0 theni:=0 to (n-1) doj:=0 to (n-1)
do[i,j]:=a[i,j]i:=0 to (n-1) doj:=0 to (n-1) do begin:=0;k:=0 to (n-1)
do:=x+l[i, k]*a[k, j];[i, j]:=x;;i:=0 to (n-1) doj:=0 to (n-1)
do[i,j]:=La[i,j];;lbvector (num:integer);
//Получаем вектор L(num+1)*...*L(1)*b
var x:real;num=0 thenj:=0 to (n-1) do[j]:=b[j]i:=0 to (n-1)
do begin:=0;j:=0 to (n-1) do:=x+l[i, j]*b[j];[i]:=x;;i:=0 to (n-1) do
b[i]:=lb[i];;replace (num:integer);
//Поиск максимального элемента по текущей строке
zz:=la[num,num];i:=(num+1) to (n-1)
doAbs(zz)<Abs(la[num,i]) then begin:=la[num,i];[num]:=i;;
//Меняем местами самый левый ненулевой столбец и столбец, содержащий
максимальный элемент в первой строке
for i:=0 to (n-1) do
begin:=la[i,ch[num]];[i,ch[num]]:=la[i,num];[i,num]:=zz;;i:=0 to (n-1) doj:=0
to (n-1) do[i,j]:=La[i,j];;solving;[n-1]:=lb[n-1]/la[n-1, n-1];i:=(n-2) downto
0 do begin:=0;j:=i to (n-1) do:=zz+la[i, j]*xsolved[j];[i]:=lb[i]-zz;;i:=(n-2)
downto 0 do
begin:=xsolved[ch[i]];[ch[i]]:=xsolved[i];[i]:=zz;;;TForm1.Edit1Change(Sender:
TObject);:=StrToInt(Edit1.Text);.ColCount:=n;.RowCount:=n;.RowCount:=n;;TForm1.Button1Click(Sender:
TObject); i,j:integer;
begin
//Обнуляем все матрицы для независимости от результатов предыдущих
вычислений
for j:=0 to n do begink:=0 to n do
begin[j,k]:=0;[j,k]:=0;[j,k]:=0;;[j]:=0;[j]:=0;[j]:=0;;
Edit2.Text:='';
//Считывание элементов матрицы А и вектора b
for i:=0 to (n-1) do beginj:=0 to (n-1)
do[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);[i]:=StrToFloat(StringGrid2.Cells[0,i]);;i:=0
to (n-2) do begin(i);(i);(i);(i);;(n-1);(n-1);;i:=0 to (n-1) do
Edit2.Text:=Edit2.Text+'x'+IntTostr(i+1)+'='+FloatTostr(xsolved[i])+'; ';;.
6) Тестовый пример
Рисунок 1 - решение СЛАУ.
Рисунок 2 - решение СЛАУ с помощью программного пакета MathCad.