Решение системы линейных уравнений

25.03.19

Разработка - Математика и алгоритмы

Пример использования объекта Расчет систем линейных уравнений.

Начиная с версии платформы 8.3.14.1565 в 1С:Предприятие стал доступен объект для решения системы линейных уравнений. Следует предположить, что данный функционал не вызвал значительного интереса, так как  я не нашел на infostart ни одного упоминания, относящегося к данному предмету. Поиск через Яндекс вывел на статью "Механизм решения систем линейных алгебраических уравнений", которая всем хороша, за исключением того, что не содержит примера применения нового класса РасчетСистемЛинейныхУравнений. Этот пробел я и постараюсь восполнить. Решать будем систему из трех уравнений, которая вынесена в заголовок статьи.

                                                           x  -3y+5z  =-10

                                                         2x + y  - z   =5

                                                         4x+2y+3z   =5

На первом шаге подготовим две таблицы значений. В одной будем хранить коэффициенты из левой части, а в другой свободные члены системы уравнений.

                    

Каждая из таблиц содержит колонку уравнение, в которой указывается номер уравнения , а так же колонку Ч, в которую заносятся значения коэффициентов. Кроме этого, таблица с коэффициентами из левой части решаемой системы содержит колонку номер, для указания номера переменной, к которой относится данный коэффициент. Упростим себе жизнь и и напишем две процедуры для заполнения данных таблиц.

//-----------------------------------------------------------------
// куда - таблица значений, в которую добавляются свободные члены
// что - строка со значениями коэффициентов из правой части уравнения,
//       которые разделены ';'

Функция ДобавитьСвободныеЧлены(куда,что)
	данные=СтрРазделить(что,";",ЛОЖЬ);
	инд=1;
	для каждого к из данные цикл
		запись=куда.Добавить();
		запись.уравнение=инд  ;
		инд=инд+1             ;
		запись.Ч=число(к)     ;
	конеццикла;	
	
	возврат куда;
КонецФункции	


//--------------------------------------------------------------------------------------------
// куда - таблица значений, в которую добавляются коэффициенты уравнения из левой части
// что - строка со значениями коэффициентов,которые разделены ';'
// номер_уравнения - номер уравнения, которому относятся коэффициенты


Функция ДобавитьКоэффициенты(куда,что,номер_уравнения)
	данные=СтрРазделить(что,";",ЛОЖЬ);
	инд=1;
	для каждого к из данные цикл
		запись=куда.Добавить()           ;
		запись.уравнение=номер_уравнения ;
		запись.номер=инд                 ;
		инд=инд+1                        ;
		запись.Ч=число(к)                ;
	конеццикла;	
	
	возврат куда;
КонецФункции	

Теперь выполним подготовительные процедуры.

   ТипЧисло=новый ОписаниеТипов("Число");
   
   СвободныеЧлены=новый ТаблицаЗначений                     ;
   СвободныеЧлены.Колонки.Добавить("уравнение",ТипЧисло)    ;
   СвободныеЧлены.Колонки.Добавить("Ч",ТипЧисло)            ;
   //заносим в таблицу значения свободных членов
   ДобавитьСвободныеЧлены(СвободныеЧлены,"-10;5;5")         ;
   
   Коэффициенты=новый ТаблицаЗначений                 ;
   Коэффициенты.Колонки.Добавить("уравнение",ТипЧисло);
   Коэффициенты.Колонки.Добавить("номер",ТипЧисло)    ;
   Коэффициенты.Колонки.Добавить("Ч",ТипЧисло)        ;
   //заносим значения коэффициентов из левой части
   ДобавитьКоэффициенты(Коэффициенты,"1;-3;5",1)      ;
   ДобавитьКоэффициенты(Коэффициенты,"2;1;-1",2)      ;
   ДобавитьКоэффициенты(Коэффициенты,"4;2;3",3)       ;

На следующем шаге переходим к работе с объектом РасчетСистемЛинейныхУравнений. У него есть два свойства, первое - ИсточникДанныхУзлов, через которое передаются значения свободных коэффициентов,  и свойство ИсточникДанныхСвязей для передачи значений коэффициентов из левой части системы линейных уравнений. Отметим, что кроме сформированных таблиц мы указываем имена колонок, в которых хранится номер уравнения и номер переменной.

   Расчет=новый РасчетСистемЛинейныхУравнений    ;
   //коэффициенты из левой части уравнения
   Расчет.ИсточникДанныхСвязей=Коэффициенты     ;
   Расчет.КолонкаУравненияВСвязях ="уравнение"  ;           
   Расчет.КолонкаПеременныеВСвязях="номер"      ;
   //коэффициенты из правой части уравнения
   Расчет.ИсточникДанныхУзлов=СвободныеЧлены        ;
   Расчет.КолонкаУравненияВУзлах="уравнение"        ;

Заключительный штрих. Для того чтобы все заработало надо добавить ОписанияСистемЛинейныхУравнений в коллекцию ОписанияСистем  класса РасчетСистемЛинейныхУравнений.

   описание=Расчет.ОписанияСистем.Добавить();
   описание.КолонкаКоэффициентовВСвязях="Ч" ;
   описание.КолонкаКоэффициентовВУзлах ="Ч" ; 

И наконец непосредственный расчет.

   ответ=Расчет.РассчитатьСистемыЛинейныхУравнений() ;
   для каждого запись из ответ цикл
	   сообщить(запись.Решение1);
   конеццикла;	   
   

Точное решение для данной системы : 

x=1;

y=2;

z=-1

Убедиться в этом можно непосредственной подстановкой. Программа дает ответ с некоторой точностью, что обусловлено применяемым итерационным алгоритмом.

Расчет систем линейных уравнений

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1870    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4661    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7650    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7928    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4545    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8932    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7956    dusha0020    8    

70
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. docerman 71 26.03.19 14:22 Сейчас в теме
А вот бы еще пояснили на простом примере как расчет системы линейных уравнений используется при расчете себестоимости в РАУЗ.
Manticor; +1 Ответить
3. Xershi 1479 26.03.19 15:20 Сейчас в теме
Минус за корявый код!

Также уравнение написали бы текстом.
Дополнительно не понятно, а где ответы?
1 - 6 - 5 = -10 в целом сходится, но это же надо еще посчитать.
Дооформите, чтобы глаза не резало!
DrAku1a; rpgshnik; +2 Ответить
4. dabu-dabu 290 26.03.19 15:41 Сейчас в теме
Механизм был бы классный, если бы они использовали другой метод для расчета СЛАУ.
У метода простых итераций слишком серьезные минусы и использование его в финансовых системах - очень сомнительная идея.
Что и показывает ваш простенький пример - вместо 1, получили 0,(9).
Да, и в РАУЗе используется тот-же метод, но не уверен, что расчет идет через данный объект.
А представление СЛАУ в табличном виде, все-таки, лучше в матричном виде делать.
5. Darklight 32 26.03.19 15:59 Сейчас в теме
(4)В УПП не будет типовой поддержки этого класса. в ERP 2.х скорее всего появится в этом году (ближе к зиме).
6. s_vidyakin 63 26.03.19 17:12 Сейчас в теме
(4) Вообще-то они на хабре обосновывали зачем придумали свой метод решения, он как раз быстрее стандартных именно в финансовых системах - на разреженных больших матрицах
7. dabu-dabu 290 26.03.19 20:53 Сейчас в теме
(6) Он быстрее только за счет того, что они забили на контроль вырожденности матрицы.
А это в свою очередь приводит к бредовым цифрам, если в исходных данных что-то не так. И эти цифры еще надо обнаружить. Когда появился РАУЗ очень многие этому удивлялись, но в 1С, видимо, решили что оно так лучшее. Зато у программистов на сопровождении всегда есть работа.
Циник; EMelihoff; Dach; +3 Ответить
8. Циник 27.03.19 15:21 Сейчас в теме
(7) Тут статья по результатам попытки использования РАУЗ в розничной сети. В вкратце, из-за постоянного пересорта товаров в магазинах и, как следствие, отрицательные остатки до проведения инвентаризации, все основные отчеты приходили в полную негодность после расчета себестоимости (триллионы в списанной себестоимости на оборотке и в типовых отчетах). Причем как повезет, иногда ошибка с отрицательным остатком не приводит к постоянному увеличению отклонения, а иногда приводит. Но так как ассортимент большой и магазинов было под 50, ситуация с некорректным расчетом возникала постоянно. А постоянные пересорты и отрицательные остатки в рознице — это данность с которой ничего не сделать.
9. vic777tor 08.02.21 17:18 Сейчас в теме
Спасибо, всё очень познавательно и наглядно.
Наклепал обработку для ещё пущей наглядности :)
Прикрепленные файлы:
РешениеСЛАУ.epf
AlX0id; check2; +2 Ответить
10. Mopo3 331 17.02.23 19:54 Сейчас в теме
Мне тут дети загадали загадку. 12 человек несут 12 буханок хлеба. Мальчик несет 2 буханки, девочка 1/2 буханки, ребенок 1/4 буханки. Сколько конкретно мальчиков, девочек и детей несут хлеб?

Попробовал её решить через СЛАУ. Сходу не получилось. Подскажите, пожалуйста, знатоки кто знает как решить через СЛАУ)
Прикрепленные файлы:
11. scientes 288 18.02.23 22:58 Сейчас в теме
(10) Обозначим М - количество мальчиков, Д - количество девочке, Р - количество детей (в условии это ребенок). Тогда получаем систему уравнений для натуральных чисел:

М+Д+Р=12
2М+Д/2+Р/4=12

Уравнений 2, а переменных 3 . СЛАУ такое не решит

Умножим второе уравнение на 4, тогда получим 8М+2Д+Р=48

Вычтем из него первое уравнение :
7М+Д=36

М=(36-Д)/7

Отсюда Д=1 М=5 (случай Д=8 М=4 не рассматриваем)

Ответ Д=1 М=5 Р=6
12. Mopo3 331 19.02.23 10:54 Сейчас в теме
(11) да, это всё понятно) Но странно что такое простое СЛАУ не решает.. Ну или всё же решает, но нужно поиграться параметрами
13. RustIG 1408 27.11.23 13:36 Сейчас в теме
(0) Добрый день! Приглашаю к прочтению публикации Матрицы и матричное программирование
Оставьте свое сообщение