Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Определитель матрицы NxN 
:(
    Опции темы
Markel
Дата 27.11.2006, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



  Как найти определитель матрицы NxN? Как математически найти это понятно! Помогите составить алгоритм!  smile 
  
  Заранее благодарен!
  
PM MAIL   Вверх
Romkin
Дата 27.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: 1
Всего: 5



А как ты делаешь это математически?
Алгоритмов нахождения определителя много, тебе какой? smile
PM ICQ   Вверх
Markel
Дата 28.11.2006, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



Ну например методом Крамера!

PM MAIL   Вверх
Romkin
Дата 28.11.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: 1
Всего: 5



Тебе например, или любой, чтобы понять? 
Метод Крамера важен только для теории, на практике практически не применяется (сам попробуй матрицу 6х6).
Практически чаще всего (имхо) применяется какой-либо вид метода Гаусса, в любом случае слово "метод" можно заменить на "алгоритм". Данный метод опирается на следующие свойства определителя:
1. Если к одной строке матрицы прибавить другую, умноженную на константу K, определитель не изменится.
2. При перестановке двух строк местами определитель меняет знак.
(вышесказанное справедливо и для столбцов).
3. Определитель треугольной матрицы равен произведению элементов ее главной диагонали.
Исходя из этих свойств, намечается путь: складывая одну строку с другой, умноженной на число и переставляя строки, приводим матрицу к верхне- или нижнетреугольному виду. После чего значение определителя легко находится произведением диагональных элементов, разумеется, с учетом знака, получившегося при перестановках.
Теперь конкретизируем:
Пусть имеется квадратная матрица A, с элементами a[i,j], i - номер строки.
Будем приводить ее к верхнетреугольному виду.
На первом шаге возьмем первую строку, и сложим ее последовательно со всеми нижележащими так, чтобы в первом столбце всех строк, начиная со второй, оказались 0. Разумеется, просто так сложить нельзя, надо каждый раз умножать эту строку на некоторую константу K, разную при каждом сложении.
На втором шаге берем вторую строку, и складываем с нижележащими совершенно так же, как и первую, только делая нули во втором столбце (в первом нули так и останутся).
Повторяем, пока не придем к последней строке, которую и складывать не надо. В результате получим треугольную матрицу.
Все замечательно, но, когда делаешь это с произвольной матрицей, могут найтись ловушки:
1. Что делать, если первый элемент первой строки - 0? На какую K ни умножай, как ни складывай, а ниже нулей не получится smile Если учесть, что 0 на главной диагонали может получиться и на последующих этапах (и получается иногда, точно могу сказать!), становится немного грустно.
Выход - №2. Переставим эту проблемную строку с нижележащей, у которой в этом столбце не 0. И учтем, что определитель поменял знак.
Но тут сразу вторая ловушка:
2. А если в этом столбце в текущей строке и ниже - все нули?! С чем переставлять? Ответ: все, конец. Приехали, определитель равен 0, строки (или столбцы) линейно зависимы smile
Теперь частности:
Что такое константа K? Допустим, нам нужно сложить i-ю строку со всеми нижележащими. Можно заметить, что нули нам нужны в i-м столбце, для строк от i+1 до n. То есть, все время смотрим на элемент на главной диагонали, a[i,i], он называется ведущим. Берем элемент точно под ним, a[i+1,i]. Нужно умножить a[i,i] на что-то (K) так, чтобы при сложении его с этим элементом получился 0. Дальше просто: K*a[i,i] + a[i+1,i] = 0, K = -a[i+1,i]/a[i,i] smile
РАзумеется, при сложении строк складываются все элементы этих строк, умноженные на K. Неизбежно получим 0.
Теперь обмен строк, какую из нижележащих выбрать. Лучше всего брать ту, у которой модуль элемента в i-м столбце наибольший. Просто потому, что он станет ведущим, на него делить будут, и K будет наименьшим из возможных. Так точнее - число разрядов в компьютерном числе не так уж велико, и чем меньше число, тем меньше относительная погрешность.
Вот и все. Этот метод называется "метод Гаусса с выбором элемента по столбцу".
Найти - достаточно легко поиском ;)
Второй часто применяющийся метод, и как правило, более точный - LU-разложение, программу тоже легко найти

Вот и
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1910 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.