Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Вниз

Алгоритм!!!! 


Pinochet   (2002-03-31 14:51) [0]

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



XOY   (2002-03-31 15:32) [1]

Вот исходник на пасе для расчета опредилителя 4-ого порядка.
Как работает толком не помню (давно уже этим не занимался). Суть
в том что Det любой матрици можно найти через Det матр. на порядок меньше. Таким образом все сводится к расчету множества Det 3-го порядка по правилу триугольника.

Uses crt;

Type
Matrix = array[1..3,1..3] of integer;

var
M: array[1..4,1..4] of integer;
i1,i2: byte;
Opr: integer;
M1,M2,M3,M4: Matrix;

label
L1;


Function GetOpredelitel(var Ma: Matrix): integer;
var
OprPl,OprMin: integer;
begin
OprPl:= Ma[1,1]*Ma[2,2]*Ma[3,3] + Ma[1,2]*Ma[2,3]*Ma[3,1] + Ma[1,3]*Ma[2,1]*Ma[3,2];
OprMin:= Ma[1,1]*Ma[2,3]*Ma[3,2] + Ma[1,2]*Ma[2,1]*Ma[3,3] + Ma[1,3]*Ma[2,2]*Ma[3,1];
GetOpredelitel:= OprPl - OprMin;
end;


begin
L1:
clrscr;
gotoxy(15,2); Write("ђ бзҐв ®ЇаҐ¤Ґ«ЁвҐ«п 4Ј® Ї®ап¤Є ");
gotoxy(2,4); Write("‚ўҐ¤ЁвҐ Є®ЁддЁжЁҐ­вл:");
for i1:= 1 to 4 do begin
for i2:= 1 to 4 do begin
gotoxy(10+i1*8,6+i2*3);
readln(M[i1,i2]);
end;
end;

M1[1,1]:= M[2,2];
M1[1,2]:= M[2,3];
M1[1,3]:= M[2,4];
M1[2,1]:= M[3,2];
M1[2,2]:= M[3,3];
M1[2,3]:= M[3,4];
M1[3,1]:= M[4,2];
M1[3,2]:= M[4,3];
M1[3,3]:= M[4,4];

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

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

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

Opr:= M[1,1]*GetOpredelitel(M1) - M[1,2]*GetOpredelitel(M2) + M[1,3]*GetOpredelitel(M3) - M[1,4]*GetOpredelitel(M4);

gotoxy(2,23);
Write("ЋЇаҐ¤Ґ«ЁвҐ«м а ўҐ­: ",Opr," ");
Write("Џа®¤®«¦Ёвм?");
repeat
until keypressed = true;
i1:= ord(readkey);
if i1 = 13 then goto L1;
end.



MBo   (2002-03-31 15:37) [2]

сильно не проверял

procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
d:double;
ar:array[1..3,1..3] of double;

function Determinant(N:integer):double;
var
I, J, K : Integer;
Temp: double;
begin
for I:= 1 to N do begin
if Abs(ar[i,i])<10E-10 then begin
Result:= 0.0;
Exit;
end;
end;
for I:= 1 to N-1 do begin
for J:= I+1 to N do begin
Temp:= ar[J,I] / ar[I,I];
for K:= I to N do
ar[J,K]:= ar[J,K]-temp*ar[I,K];
end;
end;
temp:= 1.0;
for I:= 1 to N do
Temp:= Temp * ar[I,I];
Result:=Temp;
End;

begin
for i:=1 to 3 do
for j:=1 to 3 do
if i=j then ar[i,j]:=i else ar[i,j]:=0;
d:=Determinant(3);
label1.caption:=floattostr(d);
end;



Andrey KSO   (2002-03-31 15:45) [3]

Во-первых, алгебраические дополнения - суть det на порядок меньше, так что рекурсивно все сводится к det 1-го порядка, а во-вторых - неизвращайся и считай методом Гаусса, быстрее будет.



dymka   (2002-03-31 15:58) [4]

Есть несколько методов рассчета детерминантов...
1. Рекурсивный - отстой...
2. Метод Гаусса - то бишь приведение матрицы к треугольному виду, и соответственно определитель произведение элементов на главной диагонали.
3. Исходя из определения определителя - детерминант есть сумма
всех возможных комбинация произведений элементов, с учетом символа Леви-Чевита (или както так.. не помню точно).
Далее - для нахождения обратной матрицы численным способом
неужели нет других алгоритмов? я просто не интересовался - не знаю...




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.041 c
1-32890           DikobraZ              2002-03-29 15:52  2002.04.11  
JPG в буфер!


1-32774           Win32                 2002-03-31 13:45  2002.04.11  
Загрузку из Memo1


6-32914           Merlot                2002-01-28 16:19  2002.04.11  
Подключение к инетнету


1-32823           anod                  2002-03-29 00:22  2002.04.11  
Размер массива


1-32870           QWest                 2002-03-29 09:45  2002.04.11  
Помогите други!!!!!!!!!1