Рассчитать две разные системы одновременно и не перепутать Решение1 и Решение2

Учебные задачи

Первая система имеет ответ 2/1, вторая 3/2. Порядок описаний определяет номер колонки результата, а не порядок переменных.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Учебная база платформы 8.5.1.1343, серверный общий модуль УчебныеЗадачи. Фрагмент вставьте в тело ВыполнитьПример() Экспорт и вызовите из серверной команды собственной обработки.

  2. Все таблицы создаются в памяти. Документы, регистры, расчёт себестоимости конфигурации и внешние сервисы не используются.

  3. Номера уравнений и переменных 0 и 1 в этих задачах — собственные ключи. Имена колонок передаются явно; индексы коллекций начинаются с 0.

  4. Не запускайте расчёт больших матриц на рабочем сервере по аналогии с уроком: здесь только две неизвестные и контроль заранее известного решения.

Узлы = Новый ТаблицаЗначений;
Узлы.Колонки.Добавить("Уравнение", Новый ОписаниеТипов("Число"));
Узлы.Колонки.Добавить("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";
ВтороеОписание = Расчет.ОписанияСистем.Добавить();
ВтороеОписание.КолонкаКоэффициентовВСвязях = "A2";
ВтороеОписание.КолонкаКоэффициентовВУзлах = "B2";
Расчет.ТребуемаяТочность = 0.000001;
Расчет.ИспользованиеВычислительныхРесурсов = 1;
Сообщить(Расчет.ОписанияСистем.Количество() = 2);
Решения = Расчет.РассчитатьСистемыЛинейныхУравнений(Ложь);
Если Решения.Количество() <> 2 Тогда
    ВызватьИсключение "Ожидались две строки решения для собственных переменных";
КонецЕсли;
СтрокаX = Решения.Найти(0, "НомерУзла");
СтрокаY = Решения.Найти(1, "НомерУзла");
Если СтрокаX = Неопределено Или СтрокаY = Неопределено Тогда
    ВызватьИсключение "В результате отсутствует собственная переменная 0 или 1";
КонецЕсли;
Допуск = 0.00001;
Сообщить(Макс(СтрокаX.Решение1 - 2, 2 - СтрокаX.Решение1) <= Допуск);
Сообщить(Макс(СтрокаY.Решение1 - 1, 1 - СтрокаY.Решение1) <= Допуск);
Сообщить(Макс(СтрокаX.Решение2 - 3, 3 - СтрокаX.Решение2) <= Допуск);
Сообщить(Макс(СтрокаY.Решение2 - 2, 2 - СтрокаY.Решение2) <= Допуск);
НевязкаВторой = 2 * СтрокаX.Решение2 + 3 * СтрокаY.Решение2 - 12;
Сообщить(Макс(НевязкаВторой, -НевязкаВторой) <= Допуск);
Сообщить("Решение1 относится к A1/B1, Решение2 — к A2/B2.");

Разбор по шагам

  1. Общие таблицы содержат два комплекта коэффициентов A1/B1 и A2/B2 на одинаковых номерах переменных.

  2. Первая пара описывает 2x+y=5, x−y=1. Вторая — 2x+3y=12, x−y=1.

  3. Добавляем описания именно в таком порядке. Результат содержит две строки переменных и две колонки решений.

  4. Параметр Ложь отключает дополнительное редуцирование графа, но не выбирает другой смысл системы или алгоритм через ГраницаИзмененияАлгоритмаРешения.

  5. По ключу находим x и y и проверяем обе пары значений, затем отдельную невязку второй системы.

Как проверить результат

  1. Шесть сообщений Истина: два описания, решения 2/1 и 3/2 и правильная подстановка во вторую систему.

  2. Поменяйте порядок добавления описаний в собственной копии: соответствие колонок Решение1/Решение2 поменяется.

Ожидаемый результат

Одновременный расчёт разобран без смешения номера системы и номера неизвестной.

На что обратить внимание

  1. При перестановке описаний перепроверьте всю логику чтения нумерованных колонок результата.

  2. Наличие общей таблицы не означает одинаковые матрицы: A2 здесь отличается коэффициентом 3 вместо 1.

  3. Отключение редуцирования не гарантирует ускорение; режим показан как вариант API, а не рекомендация для промышленного расчёта.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.