- •Цель работы
- •Постановка задачи
- •Краткие теоритические сведения Системой линейных алгебраических уравнений (слау) относительно неизвестных x1, x2, …, xm называется система уравнений вида
- •Часто слау (1) записывают в следующей форме:
- •Для обозначения матрицы в большинстве случаев удобно применять символы прописных букв (например: a).
- •Система (1) может быть записана в следующей форме:
- •3.1. Выбор ведущего элемента в алгоритме прямого хода
- •3.2. Полный выбор ведущего элемента
- •3.3. Метод lu- разложения с реализацией стратегии полного выбора
- •3.4. Вычисление определителя матрицы
- •5 Результаты машинных вычислений
- •6 Выводы
Система (1) может быть записана в следующей форме:
Ax = b . (2)
Матрица A называется матрицей коэффициентов, векторы x и b - векторами неизвестных и правых частей системы (2) соответственно.
Единственное решение системы для любого вектора правых частей b определяется аналитически как
x = A-1b .
Формулы (A = LU, Ly = b, Ux = y) определяют метод LU- разложения. Отличительная особенность метода состоит в том, что при выполнении прямого хода, в отличие от алгоритма Гаусса, преобразуется только матрица А (вектор b не преобразуется), причём при выполнении прямого хода последовательно вычисляются и запоминаются элементы двух матриц - L и U. Следует отметить, что так как эти матрицы треугольные (нижняя и верхняя соответственно) и, кроме того, равные единице диагональные элементы матрицы L запоминать не нужно, то для запоминания элементов этих матриц достаточно двумерного массива размера nхn. Чаще всего элементы этих матриц хранятся в массиве А, постепенно, в процессе преобразований на этапе прямого хода, вытесняя элементы матрицы А. При обратном ходе в методе LU- разложения вначале по формуле Ly = b. вычисляется вспомогательный вектор у, а уже затем решается уравнение Uх=у, Эта модификация алгоритма Гаусса решения СЛАУ оказывается наиболее удобной и эффективной в том случае, когда необходимо решить несколько СЛАУ вида Ах = b с одной и той же матрицей коэффициентов, но разными правыми частями. Последнее свойство делает метод LU- разложения удобным, в частности, при вычислении обратной матрицы (обращении матрицы).
3.1. Выбор ведущего элемента в алгоритме прямого хода
При выполнении очередного k-ого этапа алгоритма прямого хода знаменатель в формуле может оказаться равным нулю. Такая ситуация требует перед выполнением очередного этапа осуществления дополнительных эквивалентных преобразований системы (1), например - перестановки местами k-ого с одним из следующих за ним уравнений системы, так чтобы новый элемент оказался не равным нулю.
В настоящее время наиболее часто применяются следующие две стратегии выбора ведущего элемента: частичный и полный выбор.
3.2. Полный выбор ведущего элемента
На каждом k-ом этапе прямого хода алгоритма Гаусса находится наибольший по модулю элемент , i,j{k,k+l,...,n}. Затем, если i≠k, производится перестановка k-ой и i-ой строк в матрице Ak-i и в векторе bk-i, а, если j≠k, перестановка k-ого и j-ого столбцов в матрице Ak-i.
3.3. Метод lu- разложения с реализацией стратегии полного выбора
Реализация алгоритма полного выбора при выполнении прямого хода метода LU- разложения означает выполнение LU- разложения не матрицы А системы (2), а матрицы
PrAPc = LU
Матрицы перестановок Рг и Рс характеризуют выполненные при реализации алгоритма полного выбора перестановки строк (row) и столбцов (column) матрицы А соответственно. В этом случае описание метода LU- разложения принимает вид:
PrAPc = LU,
Ly = Prb, Uz = y, x = Pcz
3.4. Вычисление определителя матрицы
Метод LU- разложения, равно как и метод Гаусса, позволяют вычислить и определитель матрицы. Действительно, так как определитель произведения матриц равен произведению их определителей, а определитель любой треугольной матрицы равен произведению ее диагональных элементов, то
Если при выполнении прямого хода метода LU-разложения, равно как и метода Гаусса, дополнительно реализуется алгоритм частичного выбора ведущего элемента, то так как определитель матрицы перестановок Рг первой формулы в (17) равен единице (|Рг|=1) при чётном числе перестановок nг и минус единице (|РГ|=-1) - в противном случае, после простых преобразований из первой формулы в (17) следует, что
.
Если при выполнении прямого хода метода LU- разложения, равно как и метода Гаусса, дополнительно реализуется алгоритм полного выбора ведущего элемента, то так как определители матриц перестановок Рг и Рс первой формулы в (18) равны единице при чётном числе перестановок nг и nс соответственно и минус единице - в противном случае, после простых преобразований из первой формулы в (18) следует, что
.
4 СХЕМА ПРОГАММЫ
4.1.Схема основной программы
4.2.Схема процедуры SOLVE
4.3.Схема процедуры DECOMP
4.4.Схема блоков 1 и 2
4 ТЕКСТ ПРОГРАММЫ
program sl;
uses crt;
const n=4;
type rmatr=array[1..n,1..n] of real;
rvect=array[1..n] of real;
ivect=array[1..n] of integer;
var f:text;
name:string[20];
eps:real; a:rmatr; b,y:rvect; ip,jp:ivect;
i,o,j,k:integer;
det:real;
ifsolve:boolean;
Procedure decomp(n:integer;var a:rmatr; var ip,jp:ivect; var eps,det: real; var ifsolve:boolean);
label 10;
var
k,im,jm,i,j,p,g: integer;
s,norm,am,ap,app: real;
begin
ifsolve:=true; det:=1.0;
for i:=1 to n do
begin
ip[i]:=i;
jp[i]:=i;
end;
norm:=0.0;
for i:=1 to n do begin
s:=0.0;
for j:=1 to n do
s:=s+abs(a[i,j]);
if norm<s then norm:=s;
end;
eps:=eps*norm;
for k:=1 to n-1 do begin
am:=abs(a[k,k]);
im:=k;
jm:=k;
for i:=k-1 to n do
for j:=k-1 to n do
begin
if (abs(a[i,k])>am) then
begin
am:=abs(a[i,j]);
im:=i;
jm:=j;
end;
end;
if (im<>k) then begin
for j:=1 to n do
begin
ap:=a[im,j];
a[im,j]:=a[k,j];
a[k,j]:=ap;
end;
p:=ip[im];
ip[im]:=ip[k];
ip[k]:=p;
det:=-det;
end;
if(jm<>k) then begin
for j:=1 to n do
begin
ap:=a[i,jm];
a[i,jm]:=a[i,k];
a[i,k]:=ap;
end;
g:=jp[jm];
jp[jm]:=jp[k];
jp[k]:=g;
det:=-det;
end;
if abs(a[k,k])>=eps then
for i:=k+1 to n do begin
am:=a[i,k]/a[k,k];
a[i,k]:=am;
for j:=k+1 to n do
a[i,j]:=a[i,j]-am*a[k,j];
end
else
begin
ifsolve:=false;
goto 10;
end;
end;
10:if ifsolve and (abs(a[n,n])>=eps) then
for k:=1 to n do det:=det*a[k,k]
else begin det:=0; ifsolve:=false;end;
end;
Procedure solve(n:integer; var a:rmatr; var ip,jp:ivect;var b:rvect);
var y:rvect;
i,j:integer;
s:real;
begin
for i:=1 to n do
y[i]:=b[ip[i]];
for i:=2 to n do
begin
s:=y[i];
for j:=1 to i-1 do
s:=s-a[i,j]*y[j];
y[i]:=s;
end;
b[n]:=y[n]/a[n,n];
for i:=n-1 downto 1 do
begin
s:=y[i];
for j:=i+1 to n do
s:=s-a[i,j]*b[j];
b[i]:=s/a[i,i];
end;
for i:=1 to n do
y[jp[i]]:=b[i];
b:=y;
end;
begin
clrscr;
write('Enter name of file with necessary information: ');
readln(name);
assign(F,name);
reset(F); clrscr;
write('Enter eps: ');
readln(eps); clrscr;
for i:=1 to n do
begin
for j:=1 to n do
read(F,a[i,j]);
read(F,b[i])
end;
close(F);
Writeln(' Information recived ');readln;clrscr;
writeln('Recived information:');
for i:=1 to n do begin
for j:=1 to n do
write(' a[',i,j,']=',a[i,j]:7:4);
write(' b[',i,']=',b[i]:7:4);
writeln; end;readln;
decomp(n,a,ip,jp,eps,det,ifsolve);
writeln('Processed information:');
writeln(' det = ',det:7:5);
if ifsolve=true then begin
solve(n,a,ip,jp,b);
Writeln('LU:');
for i:=1 to n do
begin
for j:=1 to n do
write(' d[',i,j,']=',a[i,j]:7:4); writeln; end; writeln;writeln;writeln('Solve:');
for i:=1 to n do write(' B[',i,'] = ',b[i]:7:5);
end
else writeln('Error: LU result imposible ');
writeln;
readln;
end.