Материалы сайта
Это интересно
Лабораторные работы по вычислительной математике
ЛАБОРАТОРНАЯ РАБОТА №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 i<>j 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 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 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:matrix; h,c,xr,x,xn:vector; i,n:byte; eps:real; nor:norma; norv:norma_v; begin 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)<=norma_8(b,n)) and (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 ----------------------- [pic] [pic] [pic] [pic] [pic]??????????"???? [pic]