Материалы сайта
Это интересно
Лабораторные работы по вычислительной математике
ЛАБОРАТОРНАЯ РАБОТА №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 ----------------------- [pic] [pic] [pic]