![]() |
![]() |
|
Вычесление обратной матрицы. Ø |
☑ | ||
---|---|---|---|---|
0
lanselot
01.11.06
✎
15:28
|
Собственно может кто делал или может подсказать идею алгоритма, особенно интересует расчет определителя квадратной матрицы любого порядка.
|
|||
1
смайлик
01.11.06
✎
15:35
|
опять у людей яндекс за неуплату отключили...
ps. по слову "вычЕсление" не найдет |
|||
2
Uho
01.11.06
✎
15:38
|
(1) яндекс поправит :))
|
|||
3
Rory
01.11.06
✎
15:38
|
(1) а ты проверь :)
|
|||
4
lanselot
01.11.06
✎
15:41
|
нет как раз интересует код на 1С, за слово вычЕсление простите
|
|||
5
Uho
01.11.06
✎
15:41
|
(3) ЛОЛ!!!
|
|||
6
смайлик
01.11.06
✎
15:49
|
(3) а я не буду :)
(2) умственные способности яндекса весьма своебразны - например, слово "афтор" он предлагает исправить на "афтар" |
|||
7
lanselot
01.11.06
✎
15:53
|
Посмеялись =), а может кто по существу подскажет как на 1С красивше посчитать определитель?
|
|||
8
ЛетаниК
01.11.06
✎
16:00
|
приведи к диагональному виду и перемнож диагональные элементы...
|
|||
9
lanselot
01.11.06
✎
16:13
|
(8) как? пробовую через вложенные таблицы значений, но как то это изначально сложно, должно быть проще
|
|||
10
lanselot
01.11.06
✎
16:15
|
в универе вроде бы через обычные массивы такие задачки решают
|
|||
11
DeiMos
01.11.06
✎
16:37
|
Посмотри в гугле "Метод Гаусса".
|
|||
12
lanselot
01.11.06
✎
16:46
|
(11) спасибо, но я это все уже посмотрел =), у меня проблема в том как правильно составить рекурсивную процедуру в которую я передам ТаблицуЗначений (матрица 1с-овская =)) и которая расчитает мне определитель для данной матрицы причем матрица может быть не только 3-го порядка... задача программерская а 1С-ники как известно не программируют а решают проблемы =).
|
|||
13
lanselot
01.11.06
✎
17:38
|
Вот мой вариант Опред всегда получаться равным 0, к вечеру от матриц в голове уже бардак ( вечером возьму в прокате Матрицу 1-ю может озарит =) )
Процедура ПолучитьОпределитель(матрица,СтрокаИскл,СтолбецИскл,множитель,Опред) нСтроки = 0; нКолонки = 0; матрицаОпр = СоздатьОбъект("ТаблицаЗначений"); Для к = 1 По матрица.КоличествоКолонок() Цикл Если к <> СтолбецИскл Тогда нКолонки = нКолонки + 1; матрицаОпр.НоваяКолонка("_" + СокрЛП(нКолонки)); Для н = 1 По матрица.КоличествоСтрок() Цикл Если н <> СтрокаИскл Тогда нСтроки = нСтроки + 1; матрицаОпр.НоваяСтрока(); матрицаОпр.УстановитьЗначение(нСтроки,нКолонки,матрица.ПолучитьЗначение(н,к)); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Если матрицаОпр.КоличествоКолонок() > 2 Тогда Для н = 1 По матрицаОпр.КоличествоКолонок() Цикл ПолучитьОпределитель(матрицаОпр,СтрокаИскл,н,матрицаОпр.ПолучитьЗначение(1,н),Опред); КонецЦикла; Иначе Опред = Опред + множитель * (матрицаОпр.ПолучитьЗначение(1,1) * матрицаОпр.ПолучитьЗначение(2,2)) - (матрицаОпр.ПолучитьЗначение(1,2) * матрицаОпр.ПолучитьЗначение(2,1)); КонецЕсли; КонецПроцедуры // ВычислитьОпределитель |
|||
14
USSR
01.11.06
✎
17:40
|
Обратить матрицу при помощи определителей можно только из учебника. Для реальных матриц получится полная фигня. Есть другие алгоритмы, которые позволяют частично избежать плохой обусловленности (вырожденности) реальных матриц
|
|||
15
lanselot
01.11.06
✎
17:57
|
(14) мне этот способо показался наиболее простым и наглядным
матрицы всегда будут квадратными разве этого недостаточно? |
|||
16
konde
01.11.06
✎
17:57
|
подпишусь под (14)
Для матрицы 3*3 конечно подойдет, но вот для нормальных размерностей (хотя бы 10*10) будут проблемы с ошибками округления и т.п. В числяке были нормальные методы обращения матриц, методом Гаусса по-моему. |
|||
17
lanselot
01.11.06
✎
18:01
|
Вообще в общем случае задача стоит о распределении затрат между подразделениями предприятия которые оказывают друг другу услуги или работы и т.д. например Охрана она охраняет хоз часть а хоз часть стирает форму охране и т.д., нашли определенный метод решения задачи... и вот тут эта Обратная матрица =)
|
|||
18
lanselot
01.11.06
✎
18:05
|
(16) по поводу округлений вполне согласен, попробую подумать над Гауссом подумать завтра в офис притащат учебник по Высшей математике =) в котором вроде бы "доступно написано"
|
|||
19
Ёпрст
01.11.06
✎
18:07
|
(18) В яндексе набираем "обратная матрица" ...и смотрим метод Гаусса ...
|
|||
20
konde
01.11.06
✎
18:07
|
встречные услуги...
в пинципе, можно еще как прогрессию посчитать - по 2-м попередельным распределениям определить коэффициенты и вперед... но это может быть даже более трудоемким. При решении задачи методом Гаусса к квадратной матрице пристыковывается единичная, потом в квадратной части методом Гаусса с выбором ведущего элемента делается приведение к единичной форме (как будто решаешь линейную задачу), в единичном блоке получаешь обратную. Может юыьб еще какие телодвижения понадобятся... |
|||
21
Lexusss
01.11.06
✎
18:13
|
//*******************************************
Функция ПолучитьОпределитель(матрица) Если матрица.КоличествоКолонок() > 2 Тогда // Разложим по первой строке Опред = 0; Для СтолбецИскл = 1 По матрица.КоличествоКолонок() Цикл матрицаОпр = СоздатьОбъект("ТаблицаЗначений"); Для к = 1 По матрица.КоличествоКолонок() Цикл Если к <> СтолбецИскл Тогда нКолонки = нКолонки + 1; матрицаОпр.НоваяКолонка(); Для н = 2 По матрица.КоличествоСтрок() Цикл матрицаОпр.НоваяСтрока(); матрицаОпр.УстановитьЗначение(н-1,нКолонки,матрица.ПолучитьЗначение(н,к)); КонецЦикла; КонецЕсли; КонецЦикла; Опред = Опред + ?(СтолбецИскл%2=1, 1,-1) * Матрица.ПолучитьЗначение(1,н) * ПолучитьОпределитель(матрицаОпр); КонецЦикла; Иначе Опред = (матрицаОпр.ПолучитьЗначение(1,1) * матрицаОпр.ПолучитьЗначение(2,2)) - (матрицаОпр.ПолучитьЗначение(1,2) * матрицаОпр.ПолучитьЗначение(2,1)); КонецЕсли; Возврат Опред; КонецФункции Типа того... |
|||
22
Пудель
01.11.06
✎
19:45
|
(0) На 3-м курсе моей курсовой был такой расчет. Идея в использовании модифицированного QR-метода и интеллектуального контроля сходимости итераций. Всё проще, если она симметричная.
|
|||
23
Пудель
01.11.06
✎
19:51
|
+22 Имеется в виду приведение несимметричной матрицы к треугольному виду и вычисление корневых векторов, если есть вырожденные корни.
|
|||
24
lanselot
02.11.06
✎
10:24
|
(22) Матрица всегда будет квадратной я так понимаю это и есть симметричная.
"QR-метода и интеллектуального контроля сходимости итераций" =) поищим и почитаем.., а как относитесь к методу Гаусса? (21) Спасибо |
|||
25
konde
02.11.06
✎
11:12
|
Симметричная - это относительно диагонали симметрия... Опять таки, есть замечательный способ обращения матрицы путем решения системы уравнений. А на решение - выбрать самый эффективный метод.
|
|||
26
lanselot
02.11.06
✎
12:13
|
Пойду наверное я с тортиком на кафедру Высшей математики, заодно может мне там объяснять для чего выполняються именно эти волшебные действия.
(25, 22) Значит на ваш взгляд наиболее полный алгоритм следующий: 1) Оценить матрицу путем приведения к симметричному виду 2) по результатам п. 1 выбрать метод определения 3) Реализовать используемый метод. т.е. просто обратить любую квадратную матрицу универсальным методом сложно или может привести к значительной погрешности? Учтем что данные исходной матрицы это проценты от 1 до 100, с точностью до целых. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |