ЛАБОРАТОРНАЯ РАБОТА №9 «Методы решения систем линейных уравнений ».
Студента группы ПВ-22 Малютина Максима.
Задание. Методом Зейделя решить систему линейных уравнений с точностью
до 0,001.
Система :
Для решения системы уравнений методом Зейделя необходимо выполнения
условия диагонального преобладания, после приведения к данному виду
система имеет вид:
Воспользуемся разложением матрицы А на В и С вида:
Далее найдем решение приближенное решение уравнения следующим способом:
Правило остановки:
Из норм матрицы В выбирается меньшая, нормы вектора и матрицы
согласованны между собой. При вычислении приближения следующей
координаты используются более точные значения предыдущих координат
текущего приближения.
const size=10;
type vector=array[1..size] of real;
matrix=array[1..size] of vector;
norma=function(a:matrix;n:byte):real;
norma_v=function(a:vector;n:byte):real;
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 GetB(var b:matrix;a:matrix;n:byte);
var i,j:byte;
s:real;
begin
for i:=1 to n do
for j:=1 to n do
if ij then b[i,j]:=-a[i,j]/a[i,i]
else b[i,j]:=0;
end;
Procedure GetC(var c:vector;h:vector;n:byte;a:matrix);
var i:byte;
begin
for i:=1 to n do c[i]:=h[i]/a[i,i]
end;
Function Norma_1v(a:vector;n:byte):real;
var i:byte;
s:real;
begin
s:=a[1];
for i:=2 to n do if abs(a[i])>s then s:=abs(a[i]);
norma_1v:=s
end;
Function Norma_8v(a:vector;n:byte):real;
var i:byte;
s:real;
begin
s:=0;
for i:=1 to n do s:=s+abs(a[i]);
norma_8v:=s
end;
Function Norma_1(a:matrix;n:byte):real;
var s,norma:real;
i,j:byte;
begin
norma:=0;
for j:=1 to n do
begin
s:=0;
for i:=1 to n do s:=s+abs(a[i,j]);
if s>norma then norma:=s
end;
norma_1:=norma
end;
Function Norma_8(a:matrix;n:byte):real;
var s,norma:real;
i,j:byte;
begin
norma:=0;
for i:=1 to n do
begin
s:=0;
for j:=1 to n do
s:=s+abs(a[i,j]);
if s>norma then norma:=s
end;
norma_8:=norma
end;
procedure MulMatrix(a:matrix;ma,na:byte;b:matrix;mb,nb:byte;var
c:matrix;var mc,nc:byte);
var i,j,k:byte;
s:real;
begin
if na=nb then
begin
mc:=ma;
nc:=nb;
for k:=1 to mc do
for j:=1 to nc do
begin
s:=0;
for i:=1 to nc do
s:=s+a[k,i]*b[i,j];
c[k,j]:=s
end;
end
else
begin
writeln(‘Неверные размеры матриц !!! ‘);
halt
end;
end;
Procedure SubMatr(a:matrix;var b:matrix;n:byte);
var i,j:byte;
begin
for i:=1 to n do
for j:=1 to n do b[i,j]:=a[i,j]-b[i,j]
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?††?????††??????????†††????††††????††††???????????????????††††?????
†††???††??†††???†††???
writeln(‘Неверные размеры !!! ‘);
halt
end;
end;
procedure MulVectorZ(a:matrix;n:byte;var b:vector);
var i,j:byte;
s:real;
begin
for i:=1 to n do
begin
s:=0;
for j:=1 to n do
s:=s+a[i,j]*b[j];
b[i]:=s;
end;
end;
Procedure SubVect(a,b:vector;var c:vector;n:byte);
var i:byte;
begin
for i:=1 to n do c[i]:=b[i]-a[i]
end;
Procedure AddVect(a:vector;var b:vector;n:byte);
var i:byte;
begin
for i:=1 to n do b[i]:=b[i]+a[i]
end;
var a,b,bn?????†???????????†??????†??????†??????††??????????
writeln(‘Введите размерность матрицы коэффициентов ‘);readln(n);
writeln(‘Введите элементы матрицы коэффициентов ‘);
InputMatrix(a,n);
writeln(‘Введите вектор свободных членов H ‘);
InputVector(h,n);
writeln(‘Введите заданныю точность ‘);
readln(eps);
GetB(b,a,n);
GetC(c,h,n,a);
writeln(‘Матрица B: ‘);
OutputMatrix(b,n);
writeln(‘Вектор C: ‘);
OutputVector(c,n);
readln;
if (norma_1(b,n)0) then
begin
nor:=norma_1;
norv:=norma_1v
end
else
begin
nor:=norma_8;
norv:=norma_8v
end;
eps:=eps*(1-nor(b,n))/nor(b,n);
for i:=1 to n do x[i]:=1;
MulVectorZ(b,n,x);
AddVect(c,x,n);
xn:=x;
MulVectorZ(b,n,xn);
AddVect(c,xn,n);
subvect(x,xn,xr,n);
while norv(xr,n)>eps do
begin
x:=xn;
MulVectorZ(b,n,xn);
AddVect(c,xn,n);
subvect(x,xn,xr,n)
end;
writeln(‘Значения X ‘);
OutputVector(x,n);
MulVector(a,n,n,x,n,c,n);
writeln(‘Проверка ‘);
OutputVector(c,n);
end.
Результат работы программы:
Матрица B:
0.00000 0.06250 -0.11458
-0.34375 0.00000 -0.26563
-0.45946 -0.32432 0.00000
Вектор C:
-0.08333 1.26563 0.25676
Значения X
0.01836 1.30590 -0.17513
Проверка
-0.79990 8.10045 1.90065
Нашли опечатку? Выделите и нажмите CTRL+Enter