Способ Крамера для бесконечной матрицы - Pascal
Формулировка задачи:
Здравствуйте!помогите пожалуйста с написанием Способа Крамера для бесконечной матрицы!!!очень нужно!!!заранее благодарен..
Решение задачи: «Способ Крамера для бесконечной матрицы»
textual
Листинг программы
uses crt; type Tmass=array[1..20] of real; Tmatrix=array[1..20] of Tmass; procedure Per(k,n:integer;var a:Tmatrix;var p:integer);{перестановка строк если главный элемент = 0} var z:Real;j,i:integer; begin z:=abs(a[k,k]); i:=k; p:=0; for j:=k+1 to n do begin if abs(a[j,k])>z then{выбираем максимальный по модулю в данном столбце ниже} begin z:=abs(a[j,k]); i:=j; p:=p+1;{счетчик перестановок, при каждой перестановке меняется знак определителя} end; end; if i>k then for j:=k to n do begin z:=a[i,j]; a[i,j]:=a[k,j]; a[k,j]:=z; end; end; function Znak(p:integer):integer;{определение знака определителя} begin if p mod 2=0 then Znak:=1 else Znak:=-1; end; procedure Opr(n:integer;a:tmatrix;var det:real);{вычисление опаределителя} var k,i,j,p:integer;r:real; begin det:=1.0; for k:=1 to n do begin if a[k,k]=0 then Per(k,n,a,p);{перестановка строк} det:=znak(p)*det*a[k,k];{вычисление определителя} for j:=k+1 to n do {пересчет коэффициентов} begin r:=a[j,k]/a[k,k]; for i:=k to n do begin a[j,i]:=a[j,i]-r*a[k,i]; end; end; end; end; var a:Tmatrix;{матрица коэффициентов исходная} c:array[1..20] of Tmatrix;{вспомогательные матрицы для вычисления корней} b,x:Tmass;{свободные члены, корни} det,det1:real;{определители} n,k,j,i:integer; begin clrscr; write('Порядок системы n='); readln(n); writeln('Введите коэффициенты системы:'); for i:=1 to n do for j:=1 to n do read(a[i,j]); readln; writeln('Введите свободные члены:'); for i:=1 to n do read(b[i]); readln; clrscr; writeln('Расширенная матрица системы:'); for i:=1 to n do begin for j:=1 to n do write(a[i,j]:7:2); write(b[i]:9:2); writeln; end; Opr(n,a,det);{определитель системы исходной} for i:=1 to n do begin for k:=1 to n do begin for j:=1 to n do{создаем вспомогательные матрицы, где i-товый столбец - свободные члены} c[i][k,j]:=a[k,j]; c[i][k,i]:=b[k]; end; Opr(n,c[i],det1);{определитедь вспомогательной матрицы} if(det=0)and(det1=0) then begin writeln('Система не определена!'); readln; exit; end; if(det=0)and(det1<>0) then begin writeln('Система не имеет решений!'); readln; exit; end; x[i]:=det1/det;{корень} end; writeln('Корни сиcтемы:'); for i:=1 to n do writeln('x',i,'=',x[i]:7:3); readln end. end.
Объяснение кода листинга программы
- Объявлены типы данных:
- Tmass - массив вещественных чисел размером 20;
- Tmatrix - массив Tmass размером 20;
- Определена процедура Per, принимающая целочисленные параметры k, n, массив a типа Tmatrix и переменную p, которая выполняет перестановку строк, если главный элемент равен 0.
- Определена функция Znak, принимающая целочисленный параметр p и возвращающая целочисленное значение, определяющее знак определителя.
- Определена процедура Opr, принимающая целочисленный параметр n, массив a типа Tmatrix, и переменную det, которая вычисляет определитель системы, используя метод Крамера.
- Представлено объявление переменных и основная программа:
- Переменная a - матрица коэффициентов системы;
- Переменная c - вспомогательные матрицы для вычисления корней;
- Переменные b и x - массивы вещественных чисел для свободных членов и корней системы соответственно;
- Переменные det и det1- определители;
- Целочисленные переменные n, k, j, i - для итераций и хранения порядка системы и других значений. Кроме того, программа при вводе пользователем значений для коэффициентов и свободных членов, производит вычисления, перестановки строк и определение знаков определителя для нахождения корней системы по методу Крамера.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д