Как найти определитель матрицы паскаль

TranceR

1 / 1 / 0

Регистрация: 30.10.2008

Сообщений: 3

1

Определитель матрицы

30.10.2008, 20:51. Показов 19775. Ответов 14

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Народ помогите,не пойму почему прога не работает:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
program fav;
const n=3;
var i,j,k:integer;
A:array [1..n,1..n] of real;
detA:real;
pr:real;
begin
writeln('Westi a[i,j]');
for i:=1 to n do
begin
for j:=1 to n do
readln(a[i,j]);
end;
detA:=1;
for k:=1 to n-1 do
begin
if a[k,k]=0 then
begin
i:=k+1;
if a[i,k]=0 then
begin
i:=i+1;
if i>n then
begin
detA:=0;
writeln('Opredelitel raven nylyu');exit;
end;
end;
end
else
for j:=k to n do
begin
pr:=a[i,j];
a[i,j]:=a[k,j];
a[k,j]:=pr;
detA:=-detA;
end;
detA:=a[k,k]*detA;
for j:=k+1 to n do
a[k,j]:=a[k,j]/a[k,k];
a[k,k]:=1;
for i:=k+1 to n do
begin
for j:=k+1 to n do
a[i,j]:=a[i,j]-a[i,k]*a[k,j];
a[i,k]:=0;
end;
if a[n,n]=0 then
detA:=0
else
detA:=a[n,n]*detA;
end;
writeln('detA=',detA:8:6);
end.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

30.10.2008, 20:51

14

4 / 4 / 0

Регистрация: 16.09.2008

Сообщений: 45

30.10.2008, 23:16

2

Что ета програма должна делать ????Для чего она????



0



Почетный модератор

64287 / 47586 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

30.10.2008, 23:48

3

Что ета програма должна делать ????Для чего она????

Человек пытается найти определитель матрицы. Содрал окуда-то кривой код или криво списал, а что делать, понятия не имеет.



0



(Yellow_Duck)

1261 / 130 / 15

Регистрация: 16.10.2008

Сообщений: 733

31.10.2008, 02:23

4

Трансер, ты код оформи нормально, тогда скажу

Добавлено через 31 секунду
надо чтобы не все в одну линию было



0



18 / 18 / 0

Регистрация: 29.10.2008

Сообщений: 100

31.10.2008, 10:13

5

что тебе нужно сделать в задаче?



0



TranceR

1 / 1 / 0

Регистрация: 30.10.2008

Сообщений: 3

01.11.2008, 03:42

 [ТС]

6

Да,действительно я пытаюсь найти опредилитель матрицы,но код я нигде не сдирал и криво не списывал,просто по данному мне алгоритму(данному преподом) написал прогу,и он,увидев ее,сказал что она должна работать,а она увы не хочет и я не могу разобраться в чем дело(наверно ввиду слабоватых знаний в области програмирования)поэтому и прошу помощи….

Добавлено через 1 час 51 минуту 41 секунду

Цитата
Сообщение от YeLLoW DucK
Посмотреть сообщение

Трансер, ты код оформи нормально, тогда скажу

Добавлено через 31 секунду
надо чтобы не все в одну линию было

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
program fav;
const n=3;
var i,j,k:integer;
A:array [1..n,1..n] of real;
detA:real;
pr:real;
begin
 writeln('Westi a[i,j]');
 for i:=1 to n do
  begin
  for j:=1 to n do
  readln(a[i,j]);
  end;
  detA:=1;
  for k:=1 to n-1 do
   begin
   if a[k,k]=0 then
    begin
    i:=k+1;
    if a[i,k]=0 then
     begin
     i:=i+1;
     if i>n then
      begin
      detA:=0;
      writeln('Opredelitel raven nylyu');exit;
      end;
     end;
    end
    else
    for j:=k to n do
     begin
     pr:=a[i,j];
     a[i,j]:=a[k,j];
     a[k,j]:=pr;
     detA:=-detA;
     end;
     detA:=a[k,k]*detA;
     for j:=k+1 to n do
     a[k,j]:=a[k,j]/a[k,k];
     a[k,k]:=1;
     for i:=k+1 to n do
      begin
      for j:=k+1 to n do
      a[i,j]:=a[i,j]-a[i,k]*a[k,j];
      a[i,k]:=0;
      end;
      if a[n,n]=0 then
      detA:=0
      else
      detA:=a[n,n]*detA;
   end;
   writeln('detA=',detA:8:6);
end.



0



Puporev

Почетный модератор

64287 / 47586 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

01.11.2008, 07:18

7

Лучший ответ Сообщение было отмечено как решение

Решение

Вы меня конечно извините, но в следующий раз оформляйте код так, чтобы его можно было читать и приводите полное условие Вашей задачи, а то почему код не работает? Ответ: а фиг его знает. Потому что читать такой код никто не будет.
Вообще нахождение определителя лучше оформлять в виде отдельных процедур, тогда четко представляешь как работает программа, в Вашем коде я запутался. Поэтому не буду пытаться исправлять, а предложу свой вариант. Если хотите без процедур, попробуйте разобраться и переделать.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
program opred;
uses crt;
const n=3;
type
   Tmatr=array [1..n,1..n] of real;
var a:Tmatr;
    det:real;//определитель
//процедура перестановки строк, чтобы главный элемент не оказался 
//нолем или близким к нулю значением
procedure Per(k,n:integer;var a:Tmatr; var p:integer);
var i,j:integer;z:real;
begin
   z:=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;var a:Tmatr;var det:real);//собственно определитель
var k,i,j,p:integer;
    r:real;
begin
det:=1;
for k:=1 to n do  //считаем по алгоритму, который во всех учебниках 
   begin
     if a[k,k]=0 then per(k,n,a,p);//если главный элемент=0, делаем перестановку
     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;
begin  //основная программа
clrscr;
//здесь напишете ввод как Вам больше нравится
opr(n,a,det);
write('opr=',det:4:0);
readln
end.



6



1 / 1 / 0

Регистрация: 30.10.2008

Сообщений: 3

01.11.2008, 10:01

 [ТС]

8

спс огромное =)))



1



2 / 2 / 0

Регистрация: 18.12.2009

Сообщений: 11

23.05.2010, 08:23

9

Error 200: Division by zero

Выходит вот такая ошибка. Убрал uses crt и clrscr, все равно выходит.
Код полностью копировал отсюда.



1



Почетный модератор

64287 / 47586 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

23.05.2010, 08:28

10

Возможно вводите коэффициенты полностью вырожденной матрицы, в программе такая проверка вроде не предусмотрена. Попробуйте ввести коэффициенты системы, заведомо имеющей решение.

Добавлено через 1 минуту
А может быть(извиняюсь конечно) вообще здесь

begin //основная программа
clrscr;
//здесь напишете ввод как Вам больше нравится

Вот это условие не выполнили и вообще не ввели матрицу?



1



2 / 2 / 0

Регистрация: 18.12.2009

Сообщений: 11

23.05.2010, 08:44

11

Puporev, покажите пожалуйста правильный ввод.

//здесь напишете ввод как Вам больше нравится

Возможно здесь неправильно ввожу.

Добавлено через 4 минуты

Цитата
Сообщение от Puporev
Посмотреть сообщение

Возможно вводите коэффициенты полностью вырожденной матрицы, в программе такая проверка вроде не предусмотрена. Попробуйте ввести коэффициенты системы, заведомо имеющей решение.

Добавлено через 1 минуту
А может быть(извиняюсь конечно) вообще здесь

Вот это условие не выполнили и вообще не ввели матрицу?

Например вот такую матрицу как ввести:



1



Puporev

Почетный модератор

64287 / 47586 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

23.05.2010, 08:52

12

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
for i:=1 to 3 do
for j:=1 to 3 do
 begin
 write('a[',i,',',j,']=');
 readln(a[i,j]);
 end;
writeln('Matrica:');
for i:=1 to 3 do
 begin
 for j:=1 to 3 do
 write(a[i,j]:6:2);
 writeln;
 end;

И введите числа, какие хотите.

Добавлено через 1 минуту
Можно и так

Pascal
1
2
3
4
for i:=1 to 3 do
for j:=1 to 3 do
read(a[i,j]);
readln;

здесь вводите по 3 числа в строку, жмете Enter

Добавлено через 3 минуты
Можно матрицу задать константой.

Pascal
1
const a:array[1..3,1..3] of real=((1, -3, 1),(-3, 1, -1),(1, -1, 5));

Можно вообще рандомно

Pascal
1
2
3
4
5
begin
randomize;
for i:=1 to 3 do
for j:=1 to 3 do
a[i,j]:=10*random;

А вообще, не умея ввести матрицу, кто Вам поверит, что Вы написали алгоритм нахождения определителя.



1



2 / 2 / 0

Регистрация: 18.12.2009

Сообщений: 11

23.05.2010, 08:55

13

Puporev большое спасибо.
А я и не говорил, что кто-то должен поверить



0



0 / 0 / 0

Регистрация: 26.09.2012

Сообщений: 87

16.04.2013, 08:55

14

Puporev, Введите тест для 2 порядка:
0,2
4,0
должно выдавать -8. а выдает 8.
Могли бы подсказать где ошибка? так как я разобраться не могу



0



ManticoR

0 / 0 / 0

Регистрация: 24.09.2013

Сообщений: 7

06.12.2015, 09:35

15

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure opr(n:integer;var a:Tmatr;var det:real);//собственно определитель
var k,i,j,p:integer;
    r:real;
begin
det:=1;
for k:=1 to n do  //считаем по алгоритму, который во всех учебниках 
   begin
     if a[k,k]=0 then per(k,n,a,p);//если главный элемент=0, делаем перестановку
     det:=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;
   det:=znak(p)*det;
end;

поправил функцию. Не нужно вызывать функцию знака на каждом ряду, лучше один раз, в конце, после того, как будет известен определитель. Ибо после двух перестановок, у вас получиться только одно изменение знака, а это уже бага.

а за код спасибо, сэкономил немного времени)



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

06.12.2015, 09:35

15

program opred;
uses crt;
const n=3;
type
   Tmatr=array [1..n,1..n] of real;
var a:Tmatr;
    det:real;//определитель
//процедура перестановки строк, чтобы главный элемент не оказался 
//нолем или близким к нулю значением
procedure Per(k,n:integer;var a:Tmatr; var p:integer);
var i,j:integer;z:real;
begin
   z:=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;var a:Tmatr;var det:real);//собственно определитель
var k,i,j,p:integer;
    r:real;
begin
det:=1;
for k:=1 to n do  //считаем по алгоритму, который во всех учебниках 
   begin
     if a[k,k]=0 then per(k,n,a,p);//если главный элемент=0, делаем перестановку
     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;
begin  //основная программа
clrscr;
//здесь напишете ввод как Вам больше нравится
opr(n,a,det);
write('opr=',det:4:0);
readln
end.


Вычисление произведения “сцепленных” матриц.

Например:
(2, 3) Х (3, 3) = (2, 3)
(3, 2) Х (2, 5) = (3, 5)

Type
TType = Integer;

Const
nRowFirst = 3; { Количество строк первой матрицы }
nCommon = 2; { Количество столбцов первой и строк второй матрицы }
nColSecond = 5; { Количество столбцов второй матрицы }

Type
TFirst = { Тип данных для хранения первой матрицы }
Array[1 .. nRowFirst, 1 .. nCommon] Of TType;
TSecond = { Тип данных для хранения второй матрицы }
Array[1 .. nCommon, 1 .. nColSecond] Of TType;
TResult = { Тип данных для хранения результата }
Array[1 .. nRowFirst, 1 .. nColSecond] Of TType;

{ Собственно процедура перемножения матриц: (res) = (a) X (B) }
Procedure matrixMult(Var res: TResult;
a: TFirst; b: TSecond);
Var i, j, k: Integer;
Begin
For i := 1 To nRowFirst Do
For j := 1 To nColSecond Do
Begin
res[i, j] := 0;
For k := 1 To nCommon Do
res[i, j] := res[i, j] + a[i, k] * b[k, j];
End
End;

var
iRow, iCol: Integer;
m1: TFirst; m2: TSecond;
mr: TResult;
begin
WriteLn('Ввод первой матрицы: (', nRowFirst, 'x', nCommon, ')');
For iRow := 1 To nRowFirst Do
For iCol := 1 To nCommon Do
Begin
Write('m1[', iRow, ',', iCol,'] : ');
ReadLn(m1[iRow, iCol])
End;

WriteLn('Ввод второй матрицы: (', nCommon, 'x', nColSecond, ')');
For iRow := 1 To nCommon Do
For iCol := 1 To nColSecond Do
Begin
Write('m2[', iRow, ',', iCol,'] : ');
ReadLn(m2[iRow, iCol])
End;

matrixMult(mr, m1, m2); { Вызов процедуры перемножения }

WriteLn('Результирующая матрица: (', nRowFirst, 'x', nColSecond, ')');
For iRow := 1 To nRowFirst Do
Begin
For iCol := 1 To nColSecond Do
Write(mr[iRow, iCol]:4);
WriteLn
End;
end.


Вычисление детерминанта (определителя) матрицы с помощью рекурсии.

Const
max_n = 4;

Type
matrix = Array[1 .. max_n, 1 .. max_n] Of real;

{ Матрица, для которой будет вычисляться определитель }
Const
a: matrix =
((2, 9, 9, 4),
(2, -3, 12, 8),
(4, 8, 3, -5),
(1, 2, 6, 4));

function minusOne(n: integer): integer;
begin
minusOne := (1 - 2*Byte(Odd(n)));
end;

function get_addr(i, j: integer;
const n: integer): integer;
begin
get_addr := pred(i) * n + j
end;

{ Рекурсивное определение определителя }
Function det(Var p; Const n: integer): real;
Type
matrix = Array[1 .. max_n * max_n] Of real;
Var
my_p: matrix Absolute p;
pp: ^matrix;
s: real;
i, j, curr: integer;
Begin
s := 0.0;

If n = 2 Then
Begin
det := my_p[1]*my_p[4] - my_p[2]*my_p[3]; exit
End;

For i := 1 To n Do
Begin
GetMem(pp, Sqr(Pred(n)) * SizeOf(real));
curr := 1;
For j := 1 To n Do
If j <> i Then
Begin
move(my_p[get_addr(j, 2, n)], pp^[get_addr(curr, 1, Pred(n))],
pred(n) * SizeOf(real));
inc(curr);
End;

s := s + minusOne(Succ(i)) * my_p[get_addr(i, 1, n)] *
det(pp^, Pred(n));
FreeMem(pp, Sqr(Pred(n)) * SizeOf(real))
End;

det := s
End;

begin
WriteLn( det(a, 4):0:0 );
end.

Скачать: Прикрепленный файл
 REC_DET.PAS ( 1.28 килобайт )
Кол-во скачиваний: 1346

program determinant_4;

uses crt;

var
  a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43,
    a44, x: real;

begin
  textcolor(white);
  textbackground(blue);
  clrscr;
  writeln(' ABROR TOJIBOYEV');
  write('a11=');
  read(a11);
  write('a12=');
  read(a12);
  write('a13=');
  read(a13);
  write('a14=');
  read(a14);
  write('a21=');
  read(a21);
  write('a22=');
  read(a22);
  write('a23=');
  read(a23);
  write('a24=');
  read(a24);
  write('a31=');
  read(a31);
  write('a32=');
  read(a32);
  write('a33=');
  read(a33);
  write('a34=');
  read(a34);
  write('a41=');
  read(a41);
  write('a42=');
  read(a42);
  write('a43=');
  read(a43);
  write('a44=');
  read(a44);
  x := ((a11 * ((a22 * a33 * a44) + (a23 * a34 * a42) + (a32 * a43 * a24) -
    (a42 * a33 * a24) - (a43 * a34 * a22) - (a23 * a32 * a44))) -
    (a12 * ((a21 * a33 * a44) + (a23 * a34 * a41) + (a31 * a43 * a24) -
    (a41 * a33 * a24) - (a43 * a34 * a21) - (a31 * a23 * a44))) +
    (a13 * ((a21 * a32 * a44) + (a22 * a34 * a41) + (a31 * a42 * a24) -
    (a41 * a32 * a24) - (a42 * a34 * a21) - (a31 * a22 * a44))) -
    (a14 * ((a21 * a32 * a43) + (a22 * a33 * a41) + (a31 * a42 * a23) -
    (a41 * a32 * a23) - (a42 * a33 * a21) - (a31 * a22 * a43))));

  writeln('determinant=', x:8:6);
  readln;

end.

Добавить комментарий