Из двух таблиц коэффициентов получаем x≈2, y≈1. Подставляем результат обратно в оба уравнения с заданным допуском.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Учебная база платформы 8.5.1.1343, серверный общий модуль УчебныеЗадачи. Фрагмент вставьте в тело ВыполнитьПример() Экспорт и вызовите из серверной команды собственной обработки.
Все таблицы создаются в памяти. Документы, регистры, расчёт себестоимости конфигурации и внешние сервисы не используются.
Номера уравнений и переменных 0 и 1 в этих задачах — собственные ключи. Имена колонок передаются явно; индексы коллекций начинаются с 0.
Не запускайте расчёт больших матриц на рабочем сервере по аналогии с уроком: здесь только две неизвестные и контроль заранее известного решения.
Узлы = Новый ТаблицаЗначений;
Узлы.Колонки.Добавить("Уравнение", Новый ОписаниеТипов("Число"));
Узлы.Колонки.Добавить("B1", Новый ОписаниеТипов("Число"));
Узлы.Колонки.Добавить("B2", Новый ОписаниеТипов("Число"));
Узел0 = Узлы.Добавить();
Узел0.Уравнение = 0;
Узел0.B1 = 5;
Узел0.B2 = 12;
Узел1 = Узлы.Добавить();
Узел1.Уравнение = 1;
Узел1.B1 = 1;
Узел1.B2 = 1;
Связи = Новый ТаблицаЗначений;
Связи.Колонки.Добавить("Уравнение", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("Переменная", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("A1", Новый ОписаниеТипов("Число"));
Связи.Колонки.Добавить("A2", Новый ОписаниеТипов("Число"));
Коэффициенты = Новый Массив;
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 0, 0, 2, 2));
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 0, 1, 1, 3));
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 1, 0, 1, 1));
Коэффициенты.Добавить(Новый Структура("Уравнение,Переменная,A1,A2", 1, 1, -1, -1));
Для Каждого Коэффициент Из Коэффициенты Цикл
НоваяСвязь = Связи.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСвязь, Коэффициент);
КонецЦикла;
Расчет = Новый РасчетСистемЛинейныхУравнений;
Расчет.ИсточникДанныхУзлов = Узлы;
Расчет.ИсточникДанныхСвязей = Связи;
Расчет.КолонкаУравненияВУзлах = "Уравнение";
Расчет.КолонкаУравненияВСвязях = "Уравнение";
Расчет.КолонкаПеременныеВСвязях = "Переменная";
Описание = Расчет.ОписанияСистем.Добавить();
Описание.КолонкаКоэффициентовВСвязях = "A1";
Описание.КолонкаКоэффициентовВУзлах = "B1";
Расчет.ТребуемаяТочность = 0.000001;
Расчет.КоличествоИтераций = 200;
Расчет.ГраницаИзмененияАлгоритмаРешения = 10000;
Расчет.ИспользованиеВычислительныхРесурсов = 1;
Решения = Расчет.РассчитатьСистемыЛинейныхУравнений(Истина);
Если Решения.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались две строки решения для собственных переменных";
КонецЕсли;
СтрокаX = Решения.Найти(0, "НомерУзла");
СтрокаY = Решения.Найти(1, "НомерУзла");
Если СтрокаX = Неопределено Или СтрокаY = Неопределено Тогда
ВызватьИсключение "В результате отсутствует собственная переменная 0 или 1";
КонецЕсли;
X = СтрокаX.Решение1;
Y = СтрокаY.Решение1;
Допуск = 0.00001;
Сообщить(Макс(X - 2, 2 - X) <= Допуск);
Сообщить(Макс(Y - 1, 1 - Y) <= Допуск);
Отклонение0 = 2 * X + Y - 5;
Отклонение1 = X - Y - 1;
Сообщить(Макс(Отклонение0, -Отклонение0) <= Допуск);
Сообщить(Макс(Отклонение1, -Отклонение1) <= Допуск);
Сообщить("Проверены две собственные переменные и обе невязки.");Разбор по шагам
Узлы содержит свободные члены B1 по номеру уравнения. Связи содержит каждый коэффициент A1 по паре уравнение/переменная, включая диагональные.
Уравнение 0 имеет коэффициенты 2 и 1 и правую часть 5. Уравнение 1 имеет 1 и −1 и правую часть 1.
ОписаниеСистемы выбирает колонки A1/B1 из общих источников. Колонки A2/B2 пока не используются.
Точность положительная, число итераций 200, ресурсы ограничены одним потоком. Эти настройки не являются замером скорости.
Таблица результата содержит НомерУзла и Решение1. Ищем переменные по ключу, а не предполагаем порядок строк.
Сравниваем с 2/1 через абсолютное отклонение и отдельно подставляем в оба уравнения. Макс(a,−a) даёт модуль без выдуманного глобального Абс.
Как проверить результат
Четыре сообщения Истина при указанной точности: x≈2, y≈1, невязки обоих уравнений в допуске.
Измените только B1 первого уравнения в собственной таблице: старые проверки ожидаемо перестанут проходить.
Ожидаемый результат
Полный числовой источник, описание, расчёт и обратная подстановка разобраны на системе с известным ответом.
На что обратить внимание
Невырожденность и корректность учебной системы заданы специально. Произвольные данные могут не иметь единственного устойчивого решения.
ТребуемаяТочность — условие расчёта, а не гарантия правильности бизнес-модели. Невязки нужно проверять по исходной системе.
Больше потоков или итераций не означает автоматически быстрее и лучше. Для больших задач требуется отдельный замер и оценка ресурсов.
Этот урок не запускает закрытие месяца или расчёт себестоимости КА2.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.