РасчетСистемЛинейныхУравнений.ИспользованиеВычислительныхРесурсов

Свойства · ComputationalResourcesUsage

Тип: Число. В качестве количества потоков можно указать любое целое число, большее или равное 0. Значение по умолчанию - 0. Если указано значение 0, прикладное решение будет использовать n-1 поток, где n – максимальное число неконкурирующих потоков, которые можно запустить на компьютере (обычно количество потоков равно числу ядер, при использовании HyperThreading – удвоенному числу ядер). Не рекомендуется устанавливать значение больше максимального возможного числа неконкурирующих потоков – это приведет к замедлению работы прикладного решения.

Полное описание, параметры и ограничения

РасчетСистемЛинейныхУравнений.ИспользованиеВычислительныхРесурсов (SystemOfLinearEquationsCalculation.ComputationalResourcesUsage)

РасчетСистемЛинейныхУравнений (SystemOfLinearEquationsCalculation)

ИспользованиеВычислительныхРесурсов (ComputationalResourcesUsage)

Доступен, начиная с версии 8.3.14.

Использование:
Чтение и запись.
Описание:
Тип: Число.
В качестве количества потоков можно указать любое целое число, большее или равное 0. Значение по умолчанию - 0.
Если указано значение 0, прикладное решение будет использовать n-1 поток, где n – максимальное число неконкурирующих потоков, которые можно запустить на компьютере (обычно количество потоков равно числу ядер, при использовании HyperThreading – удвоенному числу ядер).
Не рекомендуется устанавливать значение больше максимального возможного числа неконкурирующих потоков – это приведет к замедлению работы прикладного решения.
Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.3.14.

Методическая информация

Практические примеры

Рассчитать две разные системы одновременно и не перепутать Решение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, а не рекомендация для промышленного расчёта.

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

Решить 2x+y=5 и x−y=1 и проверить не только готовые x и y

Из двух таблиц коэффициентов получаем x≈2, y≈1. Подставляем результат обратно в оба уравнения с заданным допуском.

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

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

Подготовка

  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";
Расчет.ТребуемаяТочность = 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) <= Допуск);
Сообщить("Проверены две собственные переменные и обе невязки.");

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

  1. Узлы содержит свободные члены B1 по номеру уравнения. Связи содержит каждый коэффициент A1 по паре уравнение/переменная, включая диагональные.

  2. Уравнение 0 имеет коэффициенты 2 и 1 и правую часть 5. Уравнение 1 имеет 1 и −1 и правую часть 1.

  3. ОписаниеСистемы выбирает колонки A1/B1 из общих источников. Колонки A2/B2 пока не используются.

  4. Точность положительная, число итераций 200, ресурсы ограничены одним потоком. Эти настройки не являются замером скорости.

  5. Таблица результата содержит НомерУзла и Решение1. Ищем переменные по ключу, а не предполагаем порядок строк.

  6. Сравниваем с 2/1 через абсолютное отклонение и отдельно подставляем в оба уравнения. Макс(a,−a) даёт модуль без выдуманного глобального Абс.

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

  1. Четыре сообщения Истина при указанной точности: x≈2, y≈1, невязки обоих уравнений в допуске.

  2. Измените только B1 первого уравнения в собственной таблице: старые проверки ожидаемо перестанут проходить.

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

Полный числовой источник, описание, расчёт и обратная подстановка разобраны на системе с известным ответом.

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

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

  2. ТребуемаяТочность — условие расчёта, а не гарантия правильности бизнес-модели. Невязки нужно проверять по исходной системе.

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

  4. Этот урок не запускает закрытие месяца или расчёт себестоимости КА2.

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

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

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

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

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