Найти тему
1с разное

Матрицы в 1С или матричное программирование

Оглавление

Демонстрируется удобный ввод, хранение, а главное - визуализация матриц, позволяющая легко отлаживать алгебраические преобразования матриц.

Работоспособная сложная система всегда развивается на основе работоспособной простой системы. Верно и обратное: сложная система, целиком построенная с нуля, никогда не будет работать, и ее невозможно заставить работать. Вы будете вынуждены начать сначала, начиная с работающей простой системы.

Джон Галл

Начала

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

Все это об одном: "Математическое программирование", "Исследование операций", "Дискретная математика", "Линейное программирование", "Оптимизация в проектном менеджменте". Для начала этого достаточно знать, позже, углубляясь в детали, начнете различать нюансы.

В 1939 году была напечатана брошюра Леонида Витальевича Канторовича "Математические методы организации и планирования производства". Методы, изложенные в брошюре, были мало пригодны для ручного расчета, работа Леонида Витальевича осталась не замеченной.

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

Далее американский математик Джордж Данциг в 1947 году разработал эффективный метод решения задач линейного программирования - названный симплекс-методом.

Идеи Купманса и Данцига стали широко известны. С появлением компьютеров в начале 1950-х получили развитие другие разделы математического программирования.

Линейное программирование является наиболее простым и лучше всего изученным разделом математического программирования.

Задачами нелинейного программирования называются задачи. в которых или целевая функция или неравенства (равенства) имеют нелинейную зависимость - например квадратичную. Общих способов решения  по аналогии с симплекс-методом в нелинейном программировании не существует.

Многие задачи нелинейного программирования могут быть приближены к задачам линейного программирования. Но в целом задачи нелинейного программирования относятся к трудно вычислительным задачам. Мощным средством для решения задач нелинейного программирования являются численные методы - решение находится с заданной степенью точности.

При рассмотрении ряда задач финансового управления и бизнеса специалисты сталкиваются с требованием целочисленности используемых переменных - все или некоторые переменные должны быть целыми числами. Такие задачи относятся к задачам целочисленного программирования. Разделяются целочисленные задачи линейного и нелинейного программирования.

Целочисленные задачи - это частный случай задач дискретного программирования - одного из разделов математического программирования, в котором значения переменных могут принимать дискретные значения.

Динамическое программирование - другой раздел математического программирования - решает определенный класс задач, характерной чертой которых является возможность разбиения всей операции на ряд взаимосвязанных этапов. Метод решения подобных задач применяется один и тот же.

Есть еще теория игр - которая также относится к разделам математического программирования.

В 1975 году Леонид Витальевич заслуженно получил премию Нобеля и призвание "за вклад в теорию оптимального распределения ресурсов".

Как удобно работать с матрицами

Для решения экономических задач нам достаточно использовать двумерные матрицы, в терминах платформы 1С это одномерный массив одномерных массивов - если кратко, то массив массивов.

Перед тем, как приступим к экспериментам над матрицами, сначала научимся визуализировать матрицы, а также научимся работать с дробями и рациональными числами (то есть не только с целыми).

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

-2

Алгоритм задания матриц ниже. Матрицу можно задавать напрямую в алгоритме или брать из формы.

-3

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

-4

Преобразование матрицы в строку для вывода сообщения производится отдельной функцией.

-5

Замечу, что внутри многострочной строки можно задавать нецелые числа, то есть разделенные запятой - например 1,5 (через точку или запятую - не важно), а также дроби в формате 2/3.

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

Все алгебраические операции с дробями происходят на уровне числителей, знаменателей и целых частей. Представление числа дробью (как и хранение) происходит через "контейнер" Структура.

-6

Любое число можно преобразовать в дробь - то есть в вид Числитель/Знаменатель.

-7

Дробь можно записать в виде 2/3 или 4/6 - что одинаково. Но я все-таки рекомендую отделять общий делитель и приводить к виду "2/3". Для этих целей подойдет алгоритм расчета Наибольшего общего делителя.

-8

Для разделения целой и дробной части при визуализации дробей я использую точку: "1.2/3" - это "Одна целая Две трети". На рисунке показан результат умножения чисел 3/5 на 4/7: мы получим 12/35, а не 0,34286 (и это еще с округлением).

-9

Для вывода дроби на экран используется преобразование.

-10

Для обратного преобразования - получение дроби из сроки - используется другая функция.

-11

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

Скажу наперед, что для программирования алгоритма симплекс-метода понадобится сначала запрограммировать элементарные матричные преобразования: умножение, сложение матриц, получение определителя и ранга матрицы и т.д.

Все представленные алгоритмы разработаны мною. Умножение матриц показано на рис.

-12

Транспонирование матрицы показано ниже.

-13

Вычеркивание из матрицы i-той строки и j-того столбца показано ниже.

-14

Получение определителя квадратной матрицы показано ниже.

-15

Получение единичной матрицы и возведение в степень показано ниже.

-16

Обратите внимание, что каждый следующий алгоритм использует предыдущий алгоритм. В каждом алгоритме для удобства отладки и визуализации промежуточных результатов расчета используется вывод матриц в виде многострочной строки с пробелами между значениями.

Получение расширения матрицы показано ниже.

-17

Вспомогательный алгоритм преобразования матрицы в матрицу дробей - показано ниже.

-18

Результат преобразования матрицы в матрицу дробей ниже.

-19

Более подробно продемонстрировано на видео - ссылка в конце статьи.

Копирование матрицы - ниже.

-20

Деление на скаляр - ниже.

-21

Вспомогательные алгоритмы - получение к-той строки или к-того столбца матрицы, получение количество строк или столбцов матрицы - ниже.

-22

Продолжение по алгоритмам матричных преобразований следует.

Ссылка на видеообзор

Скачать обработку для 1С можно здесь

Бесплатный математический конструктор от фирмы 1С - для преподавателей, студентов и школьников - учитесь и исследуйте!

Используемая литература

1. Малугин Виталий Александрович "Линейная алгебра", серия "Национальное экономическое образование", Москва, 2011г.

2. Е.Л.Богданова, К.А.Соловейчик, К.Г.Аркина "Оптимизация в проектном менеджменте: линейное программирование", Санкт-Петербург, 2017г.

На этом все. Всем добра!

С пользой для клиентов, Рустем