Форум: "Основная";
Текущий архив: 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