Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

Обратная матрица 4х4, Det=1 (определитель)   Найти похожие ветки 

 
Freeon ©   (2006-05-20 13:01) [0]

Кто может проветить правильность нахождения и
найти ошибки пожалуйста помогите =)

Matr4=array[1..4,1..4]of integer;
Matr3=array[1..3,1..3]of integer;

Function Dett3(M:Matr3):integer;
Function Dett4(A:Matr4):integer;
Function Obrat(A:Matr4):Matr4;
Function Transp(A:Matr4):Matr4;

Function Dett3(M:Matr3):integer;
var
  P1,P2,P3,P4,P5,P6: integer;
begin
p1:=m[1,1]*m[2,2]*m[3,3];
p2:=m[1,3]*m[2,1]*m[3,2];
p3:=m[1,2]*m[2,3]*m[3,1];
p4:=m[1,3]*m[2,2]*m[3,1];
p5:=m[1,1]*m[2,3]*m[3,2];
p6:=m[3,3]*m[2,1]*m[1,2];
Result:=p1+p2+p3-p4-p5-p6;
end;

Function Dett4(A:Matr4):integer;
var M1,M2,M3,M4:Matr3;
   P1,P2,P3,P4: integer;
begin
M1[1,1]:=A[2,2];
M1[1,2]:=A[2,3];
M1[1,3]:=A[2,4];
M1[2,1]:=A[3,2];
M1[2,2]:=A[3,3];
M1[2,3]:=A[3,4];
M1[3,1]:=A[4,2];
M1[3,2]:=A[4,3];
M1[3,3]:=A[4,4];

M2[1,1]:=A[1,2];
M2[1,2]:=A[1,3];
M2[1,3]:=A[1,4];
M2[2,1]:=A[3,2];
M2[2,2]:=A[3,3];
M2[2,3]:=A[3,4];
M2[3,1]:=A[4,2];
M2[3,2]:=A[4,3];
M2[3,3]:=A[4,4];

M3[1,1]:=A[1,2];
M3[1,2]:=A[1,3];
M3[1,3]:=A[1,4];
M3[2,1]:=A[2,2];
M3[2,2]:=A[2,3];
M3[2,3]:=A[2,4];
M3[3,1]:=A[4,2];
M3[3,2]:=A[4,3];
M3[3,3]:=A[4,4];

M4[1,1]:=A[1,2];
M4[1,2]:=A[1,3];
M4[1,3]:=A[1,4];
M4[2,1]:=A[2,2];
M4[2,2]:=A[2,3];
M4[2,3]:=A[2,4];
M4[3,1]:=A[3,2];
M4[3,2]:=A[3,3];
M4[3,3]:=A[3,4];

p1:=A[1,1]*Dett3(M1);
p2:=A[2,1]*Dett3(M2);
p3:=A[3,1]*Dett3(M3);
p4:=A[4,1]*Dett3(M4);

Result:=p1-p2+p3-p4;
end;

Function Transp(A:Matr4):Matr4;
var i, j: integer;
   B:Matr4;
begin
For i:=1 to 4 do
For j:=1 to 4 do
B[i, j]:=A[j,i];
Result:=B;
end;

Function Obrat(A:Matr4):Matr4;
var b,R:Matr4;
   c,d,i,j,m,n:byte;
   Z:Matr3;
begin
b:=Transp(A);
For i:=1 to 4 do
For j:=1 to 4 do
 begin
  c:=1;
  For m:=1 to 4 do
   If m<>i then
    begin
    d:=1;
    For n:=1 to 4 do
     If n<>j then
      begin
      Z[c,d]:=b[m,n];
      Inc(d);
      end;
    Inc(c);
    end;
   {}
 R[i,j]:=Dett3(z);
 end;
Result:=R;
end;

заранее спасибо


 
Loginov Dmitry ©   (2006-05-20 13:10) [1]

Правильность нахождения можешь определить с помощью соответствующего математического пакета.


 
Freeon ©   (2006-05-20 13:53) [2]

В том и проблема что находит неправильно а ошибку найти не могу =(


 
Anatoly Podgoretsky ©   (2006-05-20 14:16) [3]

А в чем ошибка?


 
MBo ©   (2006-05-20 14:30) [4]

квадратная матрица
A = [a(ik)], Det <>0
тогда обратная
A^-1 = 1/Det* [M(ki)], где M-алг. дополнения

Видно, что миноры ты умеешь выделять, какие знаки алг. дополнениям ставить - тоже знаешь, так что остается только отладка.


 
Freeon ©   (2006-05-20 16:42) [5]

to MBo >
A^-1 = 1/Det* [M(ki)] или [M(ki)] /Det ???
как я понял мне нужна только правильная формула  для вычисления A[i,j], если кто может то покажите на примере такой матрицы:
1 2 3 4
1 2 3 5
1 3 3 5
1 3 4 5


 
MBo ©   (2006-05-20 16:53) [6]

>A^-1 = 1/Det* [M(ki)] или [M(ki)] /Det ???
Все равно, ведь Det - скалярная величина.
Каждый элемент обратной матрицы - алгебраическое дополнение элемента транспонированной матрицы, деленный на дискриминант.

Для 2x2 пример:

[a b]
[c d]
Det = ad-bc

обратная
[d/Det   -c/Det]
[-b/Det   a/Det]


На всякий случай - знаешь, что для матриц свыше третьего порядка на практике применяют другие методы обращения (LU, Гаусса и т.д. с кубической сложностью)?
4-го порядка еще можно, конечно, в учебных целях, таким способом (через миноры) обратить, но дальше факториальная сложность становится неприемлемой


 
Freeon ©   (2006-05-20 17:07) [7]

у меня все числа integer, поэтому и матрицы беру с определителем=1
считает правильно, только ошибки в знаках


 
MBo ©   (2006-05-20 17:20) [8]

Алг. дополнение(i,k) = Минор(i,k) * (-1)^(i+k)


 
isasa ©   (2006-05-20 20:54) [9]

Попробуй это.
Правда, писано по-быстрому, что-бы закрыть вопрос с расчетом определителей. Миноров, транспонирования - нет, нет и защиты от дурака в процедуре SetN.


unit Matrix;

interface
type
 TExtMatrix = array of array of extended;
 TDoubMatrix = array of array of double;
 TIntMatrix = array of array of integer;
 TMatrix = class(TObject)
 private
   Fn: integer;
   function GetN: integer;
   procedure SetN(const Value: integer);
 protected
 public
   JbE: TExtMatrix;
   JbD: TDoubMatrix;
   JbI: TIntMatrix;
   constructor Create;
   destructor Destroy; override;
   function DetE: extended;
   function DetD: double;
   function DetI: integer;
   property n: integer read GetN write SetN;
 end;

implementation

uses SysUtils;

constructor TMatrix.Create;
begin
 inherited;
 Fn:=0;
end;

destructor TMatrix.Destroy;
begin
 JbE:=nil;
 JbD:=nil;
 JbI:=nil;
 inherited;
end;

function TMatrix.GetN: integer;
begin
 Result:=Fn;
end;

procedure TMatrix.SetN(const Value: integer);
var i,j: integer;
begin
 Fn:=Value;
 SetLength(JbE, Value);
 SetLength(JbD, Value);
 SetLength(JbI, Value);
 for i:=low(JbE) to high(JbE) do begin
   SetLength(JbE[i], Value);
   SetLength(JbD[i], Value);
   SetLength(JbI[i], Value);
   for j:=low(JbE) to high(JbE) do begin
     JbE[i,j]:=0;
     JbD[i,j]:=0;
     JbI[i,j]:=0;
   end;
 end;
end;

function TMatrix.DetD: double;
var i,j,l: integer;
   x,y: double;
begin
 Result:=0;
 if Fn=0 then exit;
 for i:=low(JbD) to high(JbD) do begin
   x:=1;
   y:=1;
   for j:=low(JbD) to high(JbD) do begin
       l:=i+j;
       if l>high(JbD) then l:=l-Fn;
       x:=x*JbD[j,l];
       y:=y*JbD[high(JbD)-j,l];
   end;
   Result:=Result+x-y;
 end;
end;

function TMatrix.DetE: extended;
var i,j,l: integer;
   x,y: extended;
begin
 Result:=0;
 if Fn=0 then exit;
 for i:=low(JbE) to high(JbE) do begin
   x:=1;
   y:=1;
   for j:=low(JbE) to high(JbE) do begin
       l:=i+j;
       if l>high(JbE) then l:=l-Fn;
       x:=x*JbE[j,l];
       y:=y*JbE[high(JbE)-j,l];
   end;
   Result:=Result+x-y;
 end;
end;

function TMatrix.DetI: integer;
var i,j,l: integer;
   x,y: integer;
begin
 Result:=0;
 if Fn=0 then exit;
 for i:=low(JbI) to high(JbI) do begin
   x:=1;
   y:=1;
   for j:=low(JbI) to high(JbI) do begin
       l:=i+j;
       if l>high(JbI) then l:=l-Fn;
       x:=x*JbI[j,l];
       y:=y*JbI[high(JbI)-j,l];
   end;
   Result:=Result+x-y;
 end;
end;

end.



Страницы: 1 вся ветка

Текущий архив: 2006.06.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
4-1143128232
Alex35
2006-03-23 18:37
2006.06.25
Узнать, что в привод вставили диск


15-1149128005
Arazel
2006-06-01 06:13
2006.06.25
Народ! подскажите где взять документацю ф.с. Ex2/Ex3/NTFS/...


15-1149236787
Sergey13
2006-06-02 12:26
2006.06.25
Генпрокурор РФ освобожден от занимаемой должности


15-1149163564
tvv
2006-06-01 16:06
2006.06.25
Работа с TBitmap-ом


4-1143123487
ANB
2006-03-23 17:18
2006.06.25
Как вытащить координаты клиентской области окна ?