Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2012, 07:33   #1
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
Вопрос Вычисление миноров матрица 3х3 Pascal

В одной из процедур программы
Код:
program mnk;

uses crt;

const col=3;
	  row=4;
	  min=2;

type  m_matr=array[1..min,1..min] of integer;
	  r_matr=array[1..col,1..col] of integer;
	    matr=array[1..row,1..col] of integer;
	  t_matr=array[1..col,1..row] of integer;
	  o_matr=array[1..col,1..col] of real;
	  s_matr=array[1..row,1..row] of real;
	  vect=array[1..row] of integer;
	  vresh=array[1..col] of real;
var i,j,d:integer;
    a:matr;
    t:t_matr;
    r:r_matr;
    m:m_matr;
    o:o_matr;
    b:vect;
    x:vresh;
    s:s_matr;

function det2(m:m_matr):integer; //вычисляю определитель второго порядка (для миноров)
begin
det2:=m[1,1]*m[2,2]-m[2,1]*m[1,2]; 
end;

function det3(r:r_matr):integer;//Вычисляю определитель третьего порядка(для матрицы)
begin
det3:=r[1,1]*r[2,2]*r[3,3]-r[1,1]*r[2,3]*r[3,2]-r[1,2]*r[2,1]*r[3,3]+r[1,2]*r[2,3]*r[3,1];
det3:=det3 + r[1,3]*r[2,1]*r[3,2]-r[1,3]*r[2,2]*r[3,1];
end;

procedure transp(var a:matr; var t:t_matr);//Транспонирую матрицу
var i,j:integer;
begin
for i:=1 to row do
  for j:=1 to col do
    t[j,i]:=a[i,j];
end;

procedure mul(var a:matr; t:t_matr; var r:r_matr);// перемножаю транспонированную на исходную

var i,j,k:integer;
begin
for i:=1 to row do
  begin
    for j:=1 to row do
      begin
        r[i,j]:=0;
        for k:=1 to row do
          r[i,j]:=r[i,j]+t[i,k]*a[k,j];
      end;
  end;
end;
    
procedure GetMatr(r:r_matr; var m:m_matr; n,i,j:integer);
// вычеркиваю стоку и столбец, нахожу минор (ОШИБКА! не правильно нахожу миноры)
var ki,kj,di,dj:integer;
  begin
  di:=0;
  for ki:=1 to n-1 do
    begin
    if (ki=i) then di:=1;
    dj:=0;
    for kj:=1 to n-1 do
      begin
      if (kj=j) then dj:=1;
      m[ki,kj]:=r[ki+di,kj+dj];
      end;
    end;
end;

procedure dop(var r:r_matr); //считаю дополнения(меняю знак определителей моноров)
var i,j:integer;
begin
for i:=1 to col do
  for j:=1 to col do
    begin
      if i mod 2 = 0 
        then begin
			 if j mod 2 = 1
               then r[i,j]:=-1*r[i,j]
             end
        else if j mod 2 = 0
               then r[i,j]:=-1*r[i,j];
    end;
end;

procedure obr (var r:r_matr; var d:integer; var o:o_matr);
//считаю обратную матрицу
var i,j:integer;
begin
  for i:=1 to col do
    for j:=1 to col do
      o[i,j]:=(r[i,j]/d);
end;

procedure resh(var t:t_matr; o:o_matr;  var s:s_matr; b:vect; var x:vresh);
var i,j,k:integer;//нахожу вектор решения
begin
  for i:=1 to row do
  begin
    for j:=1 to row do
      begin
        s[i,j]:=0;
        for k:=1 to row do
          s[i,j]:=s[i,j]+o[i,k]*t[k,j];
      end;
  end;
  
  for i:=1 to row do
    begin
      x[i]:=0.0;
      for j:=1 to row do
       x[i]:=x[i]+s[i,j]*b[j];
    end;
end;

//**********************начало основной программы**********************
BEGIN
//отладочные присвоения
a[1,1]:=5; a[1,2]:=1; a[1,3]:=-7;
a[2,1]:=5; a[2,2]:=0; a[2,3]:=-2;
a[3,1]:=3; a[3,2]:=-1; a[3,3]:=2;
a[4,1]:=3; a[4,2]:=2; a[4,3]:=-10;	

b[1]:=0;
b[2]:=3;
b[3]:=3;
b[4]:=-3;

for i:=1 to row do//отладочная печать
  begin
  for j:=1 to col do
    write(a[i,j]:5);
    writeln; 
  end;
writeln;

transp(a,t);

for i:=1 to col do//отладочная печать
  begin
  for j:=1 to row do
    write(t[i,j]:5);
    writeln; 
  end;  // 
writeln;

mul(a,t,r);

for i:=1 to col do//отладочная печать
  begin
  for j:=1 to col do
    write(r[i,j]:5);
    writeln; 
  end;
writeln;

d:=1;
d:=det3(r);
if d=0 then begin
			 writeln('нет решений!'); halt;
			 end;
writeln(d);
writeln;

for i:=1 to col do//отладочная печать
  for j:=1 to col do
    begin
     GetMatr(r,m,col,i,j);  
     r[i,j]:=det2(m);//отладочная печать
    end;

for i:=1 to col do//отладочная печать
  begin
  for j:=1 to col do
    write(r[i,j]:7);
    writeln; 
  end;
writeln;

dop(r);

for i:=1 to col do//отладочная печать
  begin
  for j:=1 to col do
    write(r[i,j]:7);
    writeln; 
  end;
writeln;

obr(r,d,o);

for i:=1 to col do //отладочная печать
  begin
  for j:=1 to col do
    write(o[i,j]:8:2);
    writeln; 
  end;
writeln; //

resh(t,o,s,b,x);

i:=0;
j:=0;

for i:=1 to col do//отладочная печать
  begin
  for j:=1 to row do
    write(s[i,j]:8:2);
    writeln; 
  end;
  
for i:=1 to row do
 writeln(x[i]:8:2);

END.
Нахожу миноры к эл-там, криво нахожу.
Не могу сообразить как вычислять миноры, поэтому содрал у кого-то на просторах рунета код их нахождения, но он работает не правильно.
Голова не варит, прошу помочь, заранее блягодарен.
P.S. Знаю что не рационально многое делается, но это сейчас не так важно, может там ещё куча ошибок, но она сейчас тоже не важны.

Последний раз редактировалось che91; 14.02.2012 в 08:07. Причина: Приведение в соответствие с правилами
che91 вне форума Ответить с цитированием
Старый 14.02.2012, 09:46   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Минором элемента с индексами [i,j] матрицы называется определитель матрицы, полученной путём удаления i-й строки и j-го столбца из исходной матрицы
Вадим Мошев вне форума Ответить с цитированием
Старый 14.02.2012, 11:24   #3
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
По умолчанию

Это я знаю, но организовывая цикл, прописывая все условия у меня получается условий if едва ли не больше, чем миноров получаемых. Поэтому мне нужна ваша помощь.
che91 вне форума Ответить с цитированием
Старый 14.02.2012, 18:08   #4
che91
Пользователь
 
Аватар для che91
 
Регистрация: 25.11.2010
Сообщений: 15
По умолчанию

Был бы очень благодарен за алгоритм
che91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление значения функции и переменных, вычисление площади треугольника, определение расстояния между точками на турбо паскале _4Alex4_ Помощь студентам 2 14.12.2011 01:43
Организовать двумерный массив адресов (3х3) olga) Помощь студентам 0 21.11.2011 15:59
Алгоритм минимакс (minimaxing) для игры крестики-нолики 3х3 JustFree Помощь студентам 1 11.10.2011 16:35
Операции с матрицами: сложение и вычитание, транспортирование, вычисление определителя, обратная матрица. Senenry Помощь студентам 2 06.04.2011 00:32
задание: матрица 3х3 на С++ john350 Общие вопросы C/C++ 5 12.02.2008 18:05