| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [C] Нахождение определителя матрицы |
| Автор: GemBird 4.6.2006, 19:26 |
| Уважаемый модераторы и учасники форума! Необходим исходный код на C для нахождения определителя n-го порядка. Для 2-го, 3-го порядка ясно как сделать, это легко! А вот начиная с 4-го начинаются трудности. Нужен алгоритм. А какой? Сам составить не могу. Кто может помочь? Завтра здача курсовой, войдите в мое положение |
| Автор: skyboy 4.6.2006, 19:37 | ||
в чём отличие между определением определителя (
|
| Автор: GemBird 4.6.2006, 20:42 |
| 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 4.6.2006, 22:35 |
| не понял. где ты увидел сумму элементов массива? Коль у меня алгоритм даёт неверный результат - так и скажи. Компилятора С у меня под рукой нет. А алгоритм следующий: посмотри на определение опеределителя, скажем, 4-го порядка. Предварительно распиши его, как сумму/ разность произведений. Ты увидишь, что каждое слагаемое этой суммы это произведение элемнтов матрицы, лежащие на диагонали. В случае знака "+" эта диагональ направлениа ссверу-вниз и слева-направо, а при знаке "- ": сверху-вниз и справа-налево. Оттого меняется индекс элемента при определении произведения "лесенкой". Добавлено @ 22:36 ничего, если на "ты". |
| Автор: skyboy 4.6.2006, 23:31 | ||
| Вот. Нашёл компилятор и отладил. Давненько я на С не смотрел.. Это ж надо - в первую секцию for-цикла оператор "запятая" присобачил... Вот такое получилось:
Добавлено @ 23:39 Код не рекурсивный, а итеративный - возможно, будет работать быстрее рекурсивного варианта с алгебраическими дополнениями. |
| Автор: maxim1000 5.6.2006, 00:18 |
определитель - сумма n! слагаемых тут, насколько я понял, их 2n... |
| Автор: skyboy 5.6.2006, 08:25 |
| maxim1000, сложно скопмилировать и посмотреть? Добавлено @ 08:36 Хм. Исправил баг с вычисление определителя порядка 2. |
| Автор: skyboy 5.6.2006, 11:52 |
| 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 5.6.2006, 12:53 | ||
| n!=2n только для 3-х для двух предусмотрительно был введён частный случай ;) стоит рассмотреть алгоритм для матрицы 4 может, и там придётся отступить от алгоритма?
не замечал такого... пример, если можно |
| Автор: skyboy 5.6.2006, 13:21 |
| определитель 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 5.6.2006, 13:43 |
эээ неее... таких выражений эта программа не вычисляет конечно же, если начинать выносить за скобки и тому подобное, то количество вычислений уменьшится, пример тому - подсчёт определителя методом Гаусса (который я, кстати, и посоветовал в такой же теме в Алгоритмах) но в том-то и дело, что предложенная программа вычисляет просто сумму произведений, без всяких скобок а в этом случае слагаемых должно быть ровно n!... |
| Автор: skyboy 5.6.2006, 14:32 | ||
maxim1000, где-то я и в самом деле спутал. Это я про программу. А касательно
А как считается определитель второго порядка в твоём методе? И это... сорри за упрямство |
| Автор: maxim1000 5.6.2006, 15:26 |
| а я ещё никакого метода не приводил ну если всё же идти по определению, то: есть две перестановки двух для (1,2) : (1,2) и (2,1) первая чётная, вторая - нет вот и получаем: a11*a22 + (-1)*a12*a21 но я имел в виду, что программа-то не выносит ничего за скобки, не группирует, а потому при вычислении определителя третьего порядка способ для второго нигде не используется... |
| Автор: GemBird 5.6.2006, 23:24 | ||||
| skyboy РЭСПЕКТ Разобрался! Объяснил по полной! Я еще нашел пример рекурсивного решения...
Ты зла не держи, я ж обидеть не хотел! |