реклама на сайте
подробности

 
 
> Расчет обратной матрицы, Программа на Delphi
Andbiz
сообщение Oct 2 2011, 19:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 447
Регистрация: 16-11-08
Из: Украина, Донецк
Пользователь №: 41 684



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

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

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

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 есть функции, которые позволяют рассчитывать матрицы более проще, но мне хочется разобраться с минорами.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andbiz
сообщение Oct 3 2011, 12:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 447
Регистрация: 16-11-08
Из: Украина, Донецк
Пользователь №: 41 684



Да, точно. Я тут ошибся - логарифма от -1 нет. Возвел в степень через Power. Теперь при попытке вычисления обратной матрицы 3*3 в результирующей матрице заполняется числом только элемент с индексом [3,3], все остальные без изменения. Да и то число, которое ставится - неверное (к примеру нужно 1, а программа ставит -3).
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 3 2011, 15:10
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Andbiz @ Oct 3 2011, 16:26) *
...в результирующей матрице заполняется числом только элемент с индексом [3,3], все остальные без изменения.

Это - естественно. Последние две строчки программы
Код
C[i,j]:=((i+j)*ln(-1)*det_1)/det; // рассчитываю соответствующий элемент матрицы С
StringGrid_C.Cells[j-1,i-1]:=FloatToStr(C[i,j]) // вношу рассчитанный элемент в матрицу

расположены вне всяких циклов... Чтобы ясно была видна структура программы, обычно, используют отступы (например, соответствующий begin'у end начинают в одной и той же позиции строки, а начало строк между ними сдвигают вправо на несколько позиций). И Вы используйте отступы, а тест программы в посте обрамляйте тегами code (выделите часть сообщения и нажмите крайнюю правую кнопку выше окна ввода).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 09:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016