Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2008, 23:54   #1
dofmat
Новичок
Джуниор
 
Регистрация: 10.11.2008
Сообщений: 2
По умолчанию Обращение матрицы методом союзной матрицы

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

Последний раз редактировалось dofmat; 11.11.2008 в 01:05.
dofmat вне форума Ответить с цитированием
Старый 11.11.2008, 11:38   #2
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

Вопрос с определителем тут уже рассатривался, ну а забить массив определителями от миноров для каждого члена матрицы не далжно составлять особого труда. потом меняешь строки и столбцы местами и это уже будет союзная транспонированная матрица. Осталось только умножить каждый член на 1/detA - число обратно пропорциональное определителю вот и обратная матрица. В общем весь вопрос уперается в нахождение определителя
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 11.11.2008, 11:45   #3
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

http://www.programmersforum.ru/showthread.php?t=26772
смотри здесь про определитель
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 11.11.2008, 12:08   #4
dofmat
Новичок
Джуниор
 
Регистрация: 10.11.2008
Сообщений: 2
По умолчанию

а вот как забить массив определителями от миноров исходной матрицы?
dofmat вне форума Ответить с цитированием
Старый 12.11.2008, 11:44   #5
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

Минор для члена- это почти та же матрица что и исходная но без одного столбца и строки! нет той строки и столбца, в которой нажодится данный член.
Создадим массив для хранения союзной матрицы
Думаю нужно создать цикл в цикле (перебор всех членов матрицы)
можно создать еще один, временный массив в котором будем хранить минор. ну и все опять же вызываем функцию по нахождению определителя и вписываем результат в союзную матрицу.

Или вы хотите чтобы вам готовую программу написали?
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 02.10.2011, 23:54   #6
Andbiz
 
Регистрация: 02.10.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Лубышев Посмотреть сообщение
Минор для члена- это почти та же матрица что и исходная но без одного столбца и строки! нет той строки и столбца, в которой нажодится данный член.
Создадим массив для хранения союзной матрицы
Думаю нужно создать цикл в цикле (перебор всех членов матрицы)
можно создать еще один, временный массив в котором будем хранить минор. ну и все опять же вызываем функцию по нахождению определителя и вписываем результат в союзную матрицу.

Или вы хотите чтобы вам готовую программу написали?
Здравствуйте! Столкнулся по учебе с написанием программы, которая делает различные операции с матрицами (умножение, деление, вычитание, транспонирование и т.д.). Все операции сделал, кроме одной - обратная матрица.

В качестве метода расчета выбрал метод расчета с помощью матрицы алгебраических дополнений.

Принцип расчета - находится определитель матрицы. Затем создается транспонированная матрица алгебраических дополнений, каждый элемент которой делится на определитель матрицы.
Расчет определителя - получился и работает. А вот с алгебраическими дополнения возникли трудности

det:=1.0;
// начинаю прямой ход Гаусса
for k:=1 to n do
begin
det:=det*A[k,k]; //вычисление определителя
for j:=k+1 to n do
begin
A[k,j]:=A[k,j]/A[k,k];
end;
for i:=k+1 to n do //начало вложенного цикла
for j:=k+1 to m do
begin
r:=A[k,j]*A[i,k];
A[i,j]:=A[i,j]-r;
end;
end;
// Делаю транспонирование матрицы
begin
for i:=1 to n do
for j:=1 to m do
D[i,j]:=A[j,i];
for i:=1 to n do
for j:=1 to m do
C[i,j]:=(1/det)*D[i,j];
begin
for i:=1 to n do
for j:=1 to m do
StringGrid_C.Cells[j-1,i-1]:=FloatToStr(C[i,j]) // вношу полученное значение в матрицу С
end;
end;


Красным отмечен участок, который я неправильно написал. Я просто транспонировал матрицу (заменил строки столбцами) и разделил каждый элемент на определитель, но это оказалось неправильным расчетом.

Во вложении к сообщению есть изображение примера расчета обратной матрицы.

В нем находят так называемые миноры, которые и образуют обратную матрицу.
В интернете много примеров расчета обратных матриц на паскале, но я не могу их понять и поэтому решил писать свою программу. Определитель посчитан, нужно разобраться как находить миноры, а потом их уже домножать как в примере на -1 в степени суммы индексов и делить на определитель, расположив в новой матрице.

Как написать код, чтобы найти эти миноры?

P.S.
Я знаю, что в Delphi есть функции, которые позволяют рассчитывать матрицы более проще, но мне хочется разобраться с минорами.
Изображения
Тип файла: jpg 123.jpg (46.3 Кб, 133 просмотров)
Andbiz вне форума Ответить с цитированием
Старый 03.10.2011, 15:01   #7
Andbiz
 
Регистрация: 02.10.2011
Сообщений: 3
По умолчанию

Написал программу расчета обратной матрицы и расчета минора, как я понимаю.

Код:
begin
 det:=1.0;
 // начинаю прямой ход Гаусса
 for k:=1 to n do
 begin
 det:=det*A[k,k];//вычисление определителя
 for j:=k+1 to n do
 begin
 A[k,j]:=A[k,j]/A[k,k];
 end;
 for i:=k+1 to n do//начало вложенного цикла
 for j:=k+1 to m do
 begin
 r:=A[k,j]*A[i,k];
 A[i,j]:=A[i,j]-r;
 end;
 end;
 Edit1.Text:=FloatToStr(det);
 // Делаю транспонирование матрицы А
 begin
 for i:=1 to n do // начинаю цикл обхода всех строк и столбиков матрицы А
 for j:=1 to m do
 begin
 for i_1:=1 to n do // начинаю второй цикл обхода матрицы А, в котором будут отсеиваться одна строка и один столбик
 for j_1:=1 to m do
 if (i_1<>i) and (j_1<>j)
 then
 for l:=1 to n-1 do // заполняю матрицу D, считая, что количество строк алгебраического дополнения на одну меньше, чем матрицы А
 for p:=1 to m-1 do // заполняю матрицу D, считая, что количество столбцов алгебраического дополнения на одного меньше, чем матрицы А
 A[i,j]:=D[l,p]; // вношу соответствующий элемент в временную матрицу D
 end;
 begin
 det_1:=1.0;
 // начинаю прямой ход Гаусса
 for k:=1 to n-1 do
 begin
 det_1:=det_1*D[k,k]; //вычисление определителя
 for j:=k+1 to n-1 do
 begin
 D[k,j]:=D[k,j]/D[k,k];
 end;
 for i:=k+1 to n-1 do //начало вложенного цикла
 for j:=k+1 to m-1 do
 begin
 r:=D[k,j]*D[i,k];
 D[i,j]:=D[i,j]-r;
 end;
 end;
 C[i,j]:=((i+j)*ln(-1)*det_1)/det; // рассчитываю соответствующий элемент матрицы С
 StringGrid_C.Cells[j-1,i-1]:=FloatToStr(C[i,j]) // вношу рассчитанный элемент в матрицу
 end;
 end;
 end;
При запуске программы в тексте, выделенном красным цветом появляется ошибка "Invalid floating point operation". Что я сделал неправильно?

Последний раз редактировалось Andbiz; 03.10.2011 в 15:13.
Andbiz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
матрицы Ensoph Помощь студентам 1 24.10.2007 09:38