Имя: Пароль:
1C
 
Вычесление обратной матрицы.
Ø
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, с точностью до целых.