Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-32713
TimPasha
2002-03-21 15:04
2002.04.11
Знатоки SQL!


3-32645
Makc
2002-03-19 16:49
2002.04.11
Проблема с переводом imestamp в более удобочитаемый формат


14-32954
lel
2002-03-01 16:04
2002.04.11
Пирушка.


1-32785
snoup
2002-03-29 23:21
2002.04.11
Помогите пожалуйста пишу так надо что бы оно ещё автозапукалось!


1-32737
sany
2002-03-30 06:34
2002.04.11
Позалуйста, пришлите мне DsgnIntf.dcu





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский