Демонстрируется удобный ввод, хранение, а главное - визуализация матриц, позволяющая легко отлаживать алгебраические преобразования матриц.
Работоспособная сложная система всегда развивается на основе работоспособной простой системы. Верно и обратное: сложная система, целиком построенная с нуля, никогда не будет работать, и ее невозможно заставить работать. Вы будете вынуждены начать сначала, начиная с работающей простой системы.
Джон Галл
Начала
Есть отдельная дисциплина в учебных заведениях, название которой зависит от определений и терминов используемых в курсе - при этом используется одинаковый математический аппарат. Сейчас речь идет о задачах экономического плана - то есть задачи радиоэлектроники, космоса, гидродинамики и других физических и химических явлений мы не рассматриваем.
Все это об одном: "Математическое программирование", "Исследование операций", "Дискретная математика", "Линейное программирование", "Оптимизация в проектном менеджменте". Для начала этого достаточно знать, позже, углубляясь в детали, начнете различать нюансы.
В 1939 году была напечатана брошюра Леонида Витальевича Канторовича "Математические методы организации и планирования производства". Методы, изложенные в брошюре, были мало пригодны для ручного расчета, работа Леонида Витальевича осталась не замеченной.
Идеи и концепции Л.В.Канторовича были переоткрыты после Второй мировой войны на западе - американский экономист Тьяллинг Купманс организовал математический коллектив вокруг решения ряда задач - нахождения экстремумов линейных функций, задаваемых линейными неравенствами. Такой раздел назвали "линейным программированием" по предложению Т.Купманса.
Далее американский математик Джордж Данциг в 1947 году разработал эффективный метод решения задач линейного программирования - названный симплекс-методом.
Идеи Купманса и Данцига стали широко известны. С появлением компьютеров в начале 1950-х получили развитие другие разделы математического программирования.
Линейное программирование является наиболее простым и лучше всего изученным разделом математического программирования.
Задачами нелинейного программирования называются задачи. в которых или целевая функция или неравенства (равенства) имеют нелинейную зависимость - например квадратичную. Общих способов решения по аналогии с симплекс-методом в нелинейном программировании не существует.
Многие задачи нелинейного программирования могут быть приближены к задачам линейного программирования. Но в целом задачи нелинейного программирования относятся к трудно вычислительным задачам. Мощным средством для решения задач нелинейного программирования являются численные методы - решение находится с заданной степенью точности.
При рассмотрении ряда задач финансового управления и бизнеса специалисты сталкиваются с требованием целочисленности используемых переменных - все или некоторые переменные должны быть целыми числами. Такие задачи относятся к задачам целочисленного программирования. Разделяются целочисленные задачи линейного и нелинейного программирования.
Целочисленные задачи - это частный случай задач дискретного программирования - одного из разделов математического программирования, в котором значения переменных могут принимать дискретные значения.
Динамическое программирование - другой раздел математического программирования - решает определенный класс задач, характерной чертой которых является возможность разбиения всей операции на ряд взаимосвязанных этапов. Метод решения подобных задач применяется один и тот же.
Есть еще теория игр - которая также относится к разделам математического программирования.
В 1975 году Леонид Витальевич заслуженно получил премию Нобеля и призвание "за вклад в теорию оптимального распределения ресурсов".
Как удобно работать с матрицами
Для решения экономических задач нам достаточно использовать двумерные матрицы, в терминах платформы 1С это одномерный массив одномерных массивов - если кратко, то массив массивов.
Перед тем, как приступим к экспериментам над матрицами, сначала научимся визуализировать матрицы, а также научимся работать с дробями и рациональными числами (то есть не только с целыми).
Для визуализации двумерных матриц удобно использовать многострочную строку, у которой элементы одной строки отделены между собой пробелами.
Алгоритм задания матриц ниже. Матрицу можно задавать напрямую в алгоритме или брать из формы.
На рисунке выше заданы две матрицы в виде многострочной строки, далее они преобразуются в массив массивов в терминах платформы 1С, над матрицами производится процедура перемножения, далее массив массивов преобразуется в многострочную строку обратно для вывода результата.
Преобразование матрицы в строку для вывода сообщения производится отдельной функцией.
Замечу, что внутри многострочной строки можно задавать нецелые числа, то есть разделенные запятой - например 1,5 (через точку или запятую - не важно), а также дроби в формате 2/3.
Дополнительно разрабатывается алгебра дробей, чтобы более точно вычислять деление чисел - в алгебраических преобразованиях матриц встречается деление чисел.
Все алгебраические операции с дробями происходят на уровне числителей, знаменателей и целых частей. Представление числа дробью (как и хранение) происходит через "контейнер" Структура.
Любое число можно преобразовать в дробь - то есть в вид Числитель/Знаменатель.
Дробь можно записать в виде 2/3 или 4/6 - что одинаково. Но я все-таки рекомендую отделять общий делитель и приводить к виду "2/3". Для этих целей подойдет алгоритм расчета Наибольшего общего делителя.
Для разделения целой и дробной части при визуализации дробей я использую точку: "1.2/3" - это "Одна целая Две трети". На рисунке показан результат умножения чисел 3/5 на 4/7: мы получим 12/35, а не 0,34286 (и это еще с округлением).
Для вывода дроби на экран используется преобразование.
Для обратного преобразования - получение дроби из сроки - используется другая функция.
После того, как научились визуализировать матрицы и дроби, научились задавать размерность рациональных чисел (то есть количество цифр после запятой), можно приступать к экспериментам над матрицами.
Скажу наперед, что для программирования алгоритма симплекс-метода понадобится сначала запрограммировать элементарные матричные преобразования: умножение, сложение матриц, получение определителя и ранга матрицы и т.д.
Все представленные алгоритмы разработаны мною. Умножение матриц показано на рис.
Транспонирование матрицы показано ниже.
Вычеркивание из матрицы i-той строки и j-того столбца показано ниже.
Получение определителя квадратной матрицы показано ниже.
Получение единичной матрицы и возведение в степень показано ниже.
Обратите внимание, что каждый следующий алгоритм использует предыдущий алгоритм. В каждом алгоритме для удобства отладки и визуализации промежуточных результатов расчета используется вывод матриц в виде многострочной строки с пробелами между значениями.
Получение расширения матрицы показано ниже.
Вспомогательный алгоритм преобразования матрицы в матрицу дробей - показано ниже.
Результат преобразования матрицы в матрицу дробей ниже.
Более подробно продемонстрировано на видео - ссылка в конце статьи.
Копирование матрицы - ниже.
Деление на скаляр - ниже.
Вспомогательные алгоритмы - получение к-той строки или к-того столбца матрицы, получение количество строк или столбцов матрицы - ниже.
Продолжение по алгоритмам матричных преобразований следует.
Скачать обработку для 1С можно здесь
Бесплатный математический конструктор от фирмы 1С - для преподавателей, студентов и школьников - учитесь и исследуйте!
Используемая литература
1. Малугин Виталий Александрович "Линейная алгебра", серия "Национальное экономическое образование", Москва, 2011г.
2. Е.Л.Богданова, К.А.Соловейчик, К.Г.Аркина "Оптимизация в проектном менеджменте: линейное программирование", Санкт-Петербург, 2017г.
На этом все. Всем добра!
С пользой для клиентов, Рустем