Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Вниз

Обратная матрица 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
15-1149178238
Зм1й
2006-06-01 20:10
2006.06.25
Принтер Epson Photo R800


1-1147776732
konda
2006-05-16 14:52
2006.06.25
Оформление ячеек в Excel


2-1149332528
Revan
2006-06-03 15:02
2006.06.25
MediaPlayer1.Length


2-1149420010
Vudu
2006-06-04 15:20
2006.06.25
Можно ли сделать тень под окном формы?


15-1149081898
Lamer@fools.ua
2006-05-31 17:24
2006.06.25
Генератор документации для .NET (C#) 2.0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский