Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
ЛАБОРАТОРНАЯ РАБОТА №6 «Методы решения систем линейных уравнений ».
Студента группы ПВ-22 Малютина Максима.
Задание. Решить систему линейных уравнений методом Гаусса с выбором максимального элемента по столбцу с точностью до 0,001.
Вариант 8.
При решении системы уравнений методом Гаусса используются следующие формулы:
Шаг № I: (i:=1, n-1)
Среди элементов i столбца (начиная с i-ой строки до n-ой) выбираем max по модулю элемент. Если их несколько, выбираем первый. Меняем местами i-ое уравнение и отмеченное.
Далее проводим i-ый шаг метода Гаусса:
j:=i+1,n mj = aji / aii; Вычисляем mj
Далее исключаем xi:
Вычитаем из строк i+1..n i-ую строку, помноженную на m:
k:=i+1,n
j:=1,n akj = akj - aij * mk
bk = bk bi * mk
Далее осуществляется обратный ход метода Гаусса:
program gauss_max;
const size=10;
type vector=array[1..size] of real;
matrix=array[1..size] of vector;
Procedure InputVector(var a:vector;n:byte);
var i:byte;
begin
for i:=1 to n do
begin
writeln('Введите ',i,'-ый элемент ');
readln(a[i]);
end;
end;
Procedure InputMatrix(var a:matrix;n:byte);
var i:byte;
begin
for i:=1 to n do
begin
writeln('Введите ',i,'-ую строку матрицы ');
InputVector(a[i],n)
end;
end;
Procedure OutputVector(var a:vector;n:byte);
var i:byte;
begin
for i:=1 to n do write(a[i]:10:5);
writeln
end;
Procedure OutputMatrix(var a:matrix;n:byte);
var i:byte;
begin
for i:=1 to n do outputvector(a[i],n)
end;
Procedure MulVector(a:matrix;ma,na:byte;b:vector;nb:byte;var c:vector;var nc:byte);
var i,j:byte;
s:real;
begin
if na=nb then
begin
nc:=nb;
for i:=1 to nc do
begin
s:=0;
for j:=1 to nc do s:=s+a[i,j]*b[j];
c[i]:=s
end;
end
else
begin
writeln('Неверные размеры матриц !!! ');
halt
end;
end;
Procedure SwapVector(var a,b:vector);
var n:vector;
begin
n:=a;
a:=b;
b:=n
end;
Procedure Swap(var a,b:real);
var n:real;
begin
n:=a;
a:=b;
b:=n
end;
Procedure GetMaxEl(a:matrix;n,i:byte;var l:byte);
var k:byte;
max:real;
begin
max:=abs(a[i,i]);l:=i;
for k:=i to n do
if abs(a[k,i])>max then
begin
max:=abs(a[k,i]);
l:=k
end;
end;
Procedure GetAm(var a:matrix;var b:vector;n:byte);
var i,j,k,l:byte;
m:vector;
begin
for i:=1 to n-1 do
begin
GetMaxEl(a,n,i,l);
SwapVector(a[i],a[l]);
Swap(b[i],b[l]);
for j:=i+1 to n do m[j]:=a[j,i]/a[i,i];
for k:=i+1 to n do
begin
for j:=1 to n do a[k,j]:=a[k,j]-a[i,j]*m[k];
b[k]:=b[k]-b[i]*m[k]
end;
end;
end;
Procedure GetX(a:matrix;b:vector;n:byte;var x:vector);
var k,l:byte;
s:real;
begin
x[n]:=b[n]/a[n,n];
for k:=n-1 downto 1 do
begin
s:=0;
for l:=k+1 to n do s:=s+a[k,l]*x[l];
x[k]:=(b[k]-s)/a[k,k]
end;
end;
var a,am:matrix;
b,x,x2:vector;
n:byte;
begin
writeln('Введите размерность матрицы коэффициентов ');readln(n);
writeln('Введите элементы матрицы коэффициентов ');
InputMatrix(a,n);
writeln('Введите вектор свободных членов ');
InputVector(b,n);
am:=a;
GetAm(am,b,n);
writeln('Матрица Am ');
outputmatrix(am,n);
GetX(am,b,n,x);
writeln('Вектор X ');
outputvector(x,n);
MulVector(a,n,n,x,n,x2,n);
writeln('Проверка: Вектор X2 - умножение матрицы Am на X ');
outputvector(x2,n)
end.
Матрица А: Вектор B:
10.00000 6.00000 2.00000 0.00000 25.00000 8.00000 2.50000 1.50000
0.00000 6.00000 -2.00000 2.00000
0.00000 3.20000 0.40000 -1.00000
0.00000 -2.00000 -3.00000 4.00000
Матрица Am
10.00000 6.00000 2.00000 0.00000
0.00000 6.00000 -2.00000 2.00000
0.00000 0.00000 -3.66667 4.66667
0.00000 -0.00000 -0.00000 -0.20000
Вектор X
2.00000 1.00000 -0.50000 0.50000
Проверка: Вектор X2 - умножение матрицы Am на X
25.00000 8.00000 2.50000 1.50000