![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
GemBird |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.6.2006 Где: underground Репутация: нет Всего: нет |
Уважаемый модераторы и учасники форума!
Необходим исходный код на C для нахождения определителя n-го порядка. Для 2-го, 3-го порядка ясно как сделать, это легко! А вот начиная с 4-го начинаются трудности. Нужен алгоритм. А какой? Сам составить не могу. Кто может помочь? Завтра здача курсовой, войдите в мое положение ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
в чём отличие между определением определителя (
![]()
|
|||
|
||||
GemBird |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.6.2006 Где: underground Репутация: нет Всего: нет |
skyboy, ты не так понял, ничего, если на ты?
Мне не сумму элементов массива нужно, а именно определитель!!! Где определитель 2-го порядка равен: | a11 a12| | a21 a22| = a11*a22 - a12*a21 определитель 3-го порядка равен: | a11 a12 a13| | a21 a22 a23| = a11 * | a22 a23| - a12 * | a21 a23| + a13 * | a21 a22| | a31 a32 a33| | a32 a33| | a31 a33| | a31 a32| определитель 4-го порядка равен: | a11 a12 a13 a14| | a21 a22 a23 a24| =a11*| a22 a23 a24|-a12*| a21 a23 a24|+a13*| a21 a22 a24|-a14*| a21 a22 a23| | a31 a32 a33 a34| | a32 a33 a34| | a31 a33 a34| | a31 a32 a34| | a31 a32 a33| | a41 a42 a43 a44| | a42 a43 a44| | a41 a43 a44| | a41 a42 a44| | a41 a42 a43| Вот в чем разница между определителем 4-го и 54-го порядка! Не так-кто все просто! ![]() Заданы значения всех aij. Сможешь написать алгоритм для n-го порядка? |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
не понял. где ты увидел сумму элементов массива? Коль у меня алгоритм даёт неверный результат - так и скажи. Компилятора С у меня под рукой нет. А алгоритм следующий:
посмотри на определение опеределителя, скажем, 4-го порядка. Предварительно распиши его, как сумму/ разность произведений. Ты увидишь, что каждое слагаемое этой суммы это произведение элемнтов матрицы, лежащие на диагонали. В случае знака "+" эта диагональ направлениа ссверу-вниз и слева-направо, а при знаке "- ": сверху-вниз и справа-налево. Оттого меняется индекс элемента при определении произведения "лесенкой". Добавлено @ 22:36 ничего, если на "ты". |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
Вот. Нашёл компилятор и отладил. Давненько я на С не смотрел.. Это ж надо - в первую секцию for-цикла оператор "запятая" присобачил...
Вот такое получилось:
Добавлено @ 23:39 Код не рекурсивный, а итеративный - возможно, будет работать быстрее рекурсивного варианта с алгебраическими дополнениями. Это сообщение отредактировал(а) skyboy - 5.6.2006, 08:34 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
определитель - сумма n! слагаемых тут, насколько я понял, их 2n... -------------------- qqq |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
maxim1000, сложно скопмилировать и посмотреть?
![]() Добавлено @ 08:36 Хм. Исправил баг с вычисление определителя порядка 2. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
зачем? про 2n это и так видно
хм... видимо, у нас разные источники... я привык такому определению: определитель - сумма произведений всевозможных последовательностей (i,xi), i=1..n, xi - из интервала 1..n и все разные знак каждого слагаемого определяется чётностью перестановки чётность перестановки xi можно определить, например, так: чётность количества необходимых замен соседних элементов, чтобы привести к перестановке xi=i -------------------- qqq |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
maxim1000, я не говорил, что я изобрёл велосипед. Просто подход к подсчёт опреелителя может біть не один(т.е. алгоритм рассчёта)
давай на примере, а? матрица: 1 2 3 4 определитель = 1 * 4 - 2 * 3 = -2. Через дополнения распишется так же. Пока - неинтересно. матрица: 1 5 6 4 0 3 2 1 0 определитель = 1·0·0 + 5·3·2 + 6·4·1 - 6·0·2 - 1·3·1 - 0·5·4= 51 Через алгебраические дполнения: 1·|0 3| - 5·|4 3| + 6·|4 0| = 1·(-3) - 5·(0 - 6) + 6·(4 - 0)= 30+24-3= 51 |1 0| |2 0| |2 1| мой вариант - всего лишь "приведенный" вариант определения определителя через алгебраические дополнения. А алгоритм выглядит так(на примере последней матрицы порядка 3). Шаг 1. Допишем справа такую же матрицу без последней колонки(сама эта матрица нужна только для прояснения, алгоритм не требует копирования данных) 1 5 6 | 1 5 4 0 3 | 4 0 2 1 0 | 2 1 Шаг 2. Сформируем произведения элементов, имеющих одинаковый цвет: 1 5 6 | 1 5 4 0 3 | 4 0 2 1 0 | 2 1 Эти произведения(1·0·0, 5·3·2 и 6·4·1) войдут в сумму со знаком "+". Шаг 3. Допишем слева такую же матрицу без первой колонки. 5 6 | 1 5 6 0 3 | 4 0 3 1 0 | 2 1 0 Шаг 4. Сформируем произведения элементов, имеющие одинаковый цвет 5 6 | 1 5 6 0 3 | 4 0 3 1 0 | 2 1 0 Эти произведения(1·3·1, 5·4·0 и 6·0·2) войдут в сумму со знаком "-". Суммируем полученные произвдеения с учётом знака и получаем 0 + 30 + 24 - 3 - 0 - 0= 51 Нерекурсивный алгоритм. Добавлено @ 12:00 Твоё определение правильное. А я определения не давал вовсе ![]() Просто рекурсивный алгоритм вычисляет одни и те же произведения при различных алгебраических дополнениях. А приведенный мною - только единожды. При разложении на алгебраические дополнения матриц порядка 3 выполняется 9 умножений и 5 сложений. А в "моём" способе - 12 умножений и 5 сложений. Вроде бы, приведёный мною метод медленнее, да? Зато при порядке матрицы = 4 рекурсивный способ имеет 40 умножений и 23 сложения, тогда как приведённый итеративный - только 24 умнодений/7 сложений. Как считаешь, какой способ подсчитает определитель для матрицы 10х10 быстрее? ![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
n!=2n только для 3-х
для двух предусмотрительно был введён частный случай ;) стоит рассмотреть алгоритм для матрицы 4 может, и там придётся отступить от алгоритма? ![]()
не замечал такого... пример, если можно -------------------- qqq |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
определитель 4-го порядка равен:
| a11 a12 a13 a14| | a21 a22 a23 a24| =a11*| a22 a23 a24|-a12*| a21 a23 a24|+a13*| a21 a22 a24|-a14*| a21 a22 a23| | a31 a32 a33 a34| | a32 a33 a34| | a31 a33 a34| | a31 a32 a34| | a31 a32 a33| | a41 a42 a43 a44| | a42 a43 a44| | a41 a43 a44| | a41 a42 a44| | a41 a42 a43| | a22 a23 a24|= a22*|a33 a34|-a23*|a32 a34|+a24*|a32 a33|=a22*(a33*a44 - a34*a43)-a23*(a32*a44 - a34*a42)+a24*(a32*a43-a42*a33) | a32 a33 a34| |a43 a44| |a42 a44| |a42 a43| | a42 a43 a44| | a21 a23 a24|= a21*|a33 a34|-a23*|a32 a34|+a24*|a31 a33|=a21*(a33*a44 - a34*a43)-a23*(a32*a44 - a34*a42)+a24*(a31*a43-a41*a33) | a31 a33 a34| |a43 a44| |a42 a44| |a41 a43| | a41 a43 a44| | a21 a22 a24|= a21*|a32 a34|-a22*|a31 a34|+a24*|a31 a32|=a21*(a32*a44 - a34*a41)-a22*(a32*a44 - a34*a42)+a24*(a31*a42-a41*a32) | a31 a32 a34| |a42 a44| |a41 a44| |a41 a42| | a41 a42 a44| | a21 a22 a23|= a21*|a32 a33|-a22*|a31 a33|+a23*|a31 a32|=a21*(a32*a43 - a33*a42)-a22*(a31*a43 - a33*a41)+a23*(a31*a42-a32*a41) | a31 a32 a33| |a42 a43| |a41 a43| |a41 a42| | a41 a42 a43| (a31*a42-a32*a41) вычисляется дважды, так же как и (a32*a44 - a34*a42), (a32*a43-a42*a33),(a31*a43-a41*a33),(a32*a44 - a34*a41) и (a33*a44 - a34*a43) - вот это и есть то, что рекурсивный алгоритм считает несколько раз. При размерностях, больших 4-х, количество повторений будет больше, чем 2. И расти оно будет без ограничений. Так смысл делать ту же работу несколько раз? Ещё и тратить время и память на вызов функции... |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
эээ неее... таких выражений эта программа не вычисляет конечно же, если начинать выносить за скобки и тому подобное, то количество вычислений уменьшится, пример тому - подсчёт определителя методом Гаусса (который я, кстати, и посоветовал в такой же теме в Алгоритмах) но в том-то и дело, что предложенная программа вычисляет просто сумму произведений, без всяких скобок а в этом случае слагаемых должно быть ровно n!... -------------------- qqq |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
||||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
а я ещё никакого метода не приводил
![]() ну если всё же идти по определению, то: есть две перестановки двух для (1,2) : (1,2) и (2,1) первая чётная, вторая - нет вот и получаем: a11*a22 + (-1)*a12*a21 но я имел в виду, что программа-то не выносит ничего за скобки, не группирует, а потому при вычислении определителя третьего порядка способ для второго нигде не используется... -------------------- qqq |
|||
|
||||
GemBird |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.6.2006 Где: underground Репутация: нет Всего: нет |
skyboy РЭСПЕКТ
![]() Разобрался! Объяснил по полной! Я еще нашел пример рекурсивного решения...
Ты зла не держи, я ж обидеть не хотел! ![]() |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |