Форум: "Основная";
Текущий архив: 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. Исходя из определения определителя - детерминант есть сумма
всех возможных комбинация произведений элементов, с учетом символа Леви-Чевита (или както так.. не помню точно).
Далее - для нахождения обратной матрицы численным способом
неужели нет других алгоритмов? я просто не интересовался - не знаю...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c