7.7.: Решаем систему линейных уравнений
Разработка - Математика и алгоритмы
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Вот здесь http://forum.infostart.ru/forum14/topic40487/ была попытка выяснить, кому и зачем может потребоваться решать в 1С систему линейных уравненний. Оказалось, что речь шла всего лишь об учебном задании.
На самом деле, решать систему линейных уравнений приходится при расчете себестоимости услуг вспомогательных цехов ( см //infostart.ru/public/61847/ ), когда эти цеха оказывают услуги, в том числе, друг другу.
Предлагается обработка, решающая методом Гаусса систему
a1_1*x1+a1_2*x2+...+a1_N*xN = b1
........
aN_1*x1+aN_2*x2+...+aN_N*xN = bN
Сначала задаем размерность системы, затем в таблице выставляем коэффициенты (двойной клик по ячейке). Если интересно посмотреть процесс преобразования матрицы к верхнетреугольному виду по шагам - задаем паузу между шагами. Для сортировки строк используется "пузырьковый" метод от Д. Кнута.
Если коэффициенты заданы как на первом скрине, по кнопке Решить получим второй скрин. Ответ округляется до второго знака (мы же с рублями работаем).
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Загрузка и выгрузка в Excel Математика и алгоритмы Разработчик 1С:Предприятие 7.7 1С:Предприятие 8 Бесплатно (free)
Статья посвящена распространённому вопросу - как сохранить несколько таблиц (отчетов) в формате MXL, с которым работает 1С, на отдельные листы одного Excel файла. Освещается простой алгоритм решения проблемы штатными средствами, без использования внешних модулей и библиотек (не относящихся к 1С и Excel).
23.11.2015 21502 etmarket 14
Разработка внешних компонент Математика и алгоритмы Разработчик 1С:Предприятие 7.7 1С:Предприятие 8 Бесплатно (free)
Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры для использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать классы .Net только на языке 1С. Реализация 1C Messenger описанного здесь http://infostart.ru/public/434771/
12.11.2015 55756 Serginio 38
Математика и алгоритмы Разработчик 1С:Предприятие 7.7 1С:Предприятие 8 Абонемент ($m)
Статья посвящена исследованию следующего вопроса: необходимо сравнить 2 наименования справочников с целью вычисления их степени сходства. По задумке, степень сходства должна выражаться в процентах.
1 стартмани
25.02.2015 27917 etmarket 46
Математика и алгоритмы Разработчик 1С:Предприятие 7.7 1C77 Абонемент ($m)
Часто при приеме на работу встречается задача про сгибание листка
1 стартмани
26.02.2013 21845 11 Sbelyi78 38
Управление взаимоотношениями с клиентами (CRM) Оптовая торговля Розничная торговля Математика и алгоритмы Разработчик Пользователь Оперативный учет 7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 1С:Производство+Услуги+Бухгалтерия Розничная и сетевая торговля (FMCG) Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Управленческий учет Абонемент ($m)
Формирование маршрутов доставки на основе генетического алгоритма (решения задачи коммивояжера) для 1С Предприятия 7.7
1 стартмани
12.01.2013 31006 117 phsin 10
Математика и алгоритмы Системный администратор Разработчик Бухгалтер Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 1C77 Россия Абонемент ($m)
Универсальная печать таблицы значений, которую не стыдно прикрутить к рабочей базе данных. Группировка данных, подсчет итогов, составление диаграмм, выгрузка в быстрый доступ к исходной ТЗ.
1 стартмани
23.05.2012 16423 66 McSeem 3
Математика и алгоритмы Разное Оперативный учет 7.7 Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 1С:Производство+Услуги+Бухгалтерия Россия Абонемент ($m)
Определение объема жидкости в цилиндрическом горизонтальном резервуаре измерением глубины жидкости
1 стартмани
03.04.2012 19116 5 akrazan 11
Математика и алгоритмы Разработчик 1С:Предприятие 7.7 1C77 Россия Абонемент ($m)
Алгоритм получения значения тригонометрических функций путем разложения их в ряд Тейлора
1 стартмани
04.03.2012 10323 4 nysysimara 10
// Решает систему линейных уравнений методом простых итераций (метод Якоби)
//
Функция РешитьСЛУБезИспользованияВременныхТаблиц(ДатаНач, ДатаКон, РегламентныйДокумент, РегистрУчета, ВидОтраженияВУчете, МенеджерВременныхТаблиц,СтруктураПараметров,ОперацияРасчетаСебестоимостиВыпуска)
Перем МассивСвободныхЧленов, МассивСвободныхЧленовСтоимостьНУ, МассивСвободныхЧленовПостояннаяРазница;
// Стоимость товара на складе равна стоимости, полученной извне (например, при покупке товара) плюс начальный остаток
// плюс стоимость товара перемещенного с других складов, умноженная на количество перемещенного товара
//
// Это можно представить в виде СЛУ
// K(1) * X(1) = S(1) + K(2) * X(2) + K(3) * X(3) + ... + K(j) * X(j)
// K(2) * X(2) = S(1) + K(1) * X(1) + K(3) * X(3) + ... + K(j) * X(j)
// ...
// K(i) * X(i) = S(i) + K(1) * X(1) + K(2) * X(2) + ... + K(j) * X(j)
//
// где
// K(i) - количество товара на складе i
// X(i) - стоимость товара на складе i
// K(j) - количество перемещенного товара со склада j на склад i
// X(j) - стоимость товара на складе j
// S(i) - стоимость товара, полученного извне плюс начальный остаток на складе i
// При решении уравнения используются следующие данные
// S(i)/K(i) - берется средняя стоимость внешних поступлений из регистра УчетЗатрат
// (перед расчетом помещается в регистр УзлыКорректировкиСтоимостиСписания)
// K(i) - берется общее количество поступления из регистра УчетЗатрат
// (перед расчетом помещается в регистр УзлыКорректировкиСтоимостиСписания)
// K(j) - берутся движения "расход" из регистра УчетЗатрат
// X(j) - берется из решения предыдущей итерации (для первой итерации берется S(i)/K(i))
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Регистратор", РегламентныйДокумент);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
//Сформируем список состояний
КоличествоУравненийСЛУ = СформироватьДвиженияПоРегиструУзлыКорректировкиСтоимостиСпис ания(
Запрос,
РегистрУчета,
ВидОтраженияВУчете,
СтруктураПараметров,
ОперацияРасчетаСебестоимостиВыпуска
);
Если КоличествоУравненийСЛУ = 0 Тогда
Возврат Ложь;
КонецЕсли;
МаксимальноеКоличествоИтераций = СтруктураПараметров.МаксимальноеКоличествоИтераций;
ТребуемаяТочность = СтруктураПараметров.СреднееОтклонениеСЛУ;
// Получим S(i)/K(i)
ЗаполнитьМассивыСвободныхЧленов(МассивСвободныхЧленов, МассивСвободныхЧленовСтоимостьНУ, МассивСвободныхЧленовПостояннаяРазница, ВидОтраженияВУчете, Запрос);
КоличествоУравненийСЛУ = МассивСвободныхЧленов.Количество();
// Выберем начальное приближение X(j)
ТекущееРешение = СкопироватьМассив(МассивСвободныхЧленов);
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВРегламентированномУчете Тогда
ТекущееРешениеСтоимостьНУ = СкопироватьМассив(МассивСвободныхЧленовСтоимостьНУ);
ТекущееРешениеПостояннаяРазница = СкопироватьМассив(МассивСвободныхЧленовПостояннаяРазница);
КонецЕсли;
// Получим K(j) для всех уравнений системы
МассивСЛУ = ПолучитьСЛУ(ВидОтраженияВУчете, КоличествоУравненийСЛУ, Запрос);
// По умолчанию примем за решение начальное приближение
НовоеРешение = СкопироватьМассив(ТекущееРешение);
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВРегламентированномУчете Тогда
НовоеРешениеСтоимостьНУ = СкопироватьМассив(ТекущееРешениеСтоимостьНУ);
НовоеРешениеПостояннаяРазница = СкопироватьМассив(ТекущееРешениеПостояннаяРазница);
КонецЕсли;
// Решим СЛУ методом простых итераций
ТекущееОтклонение = КоличествоУравненийСЛУ;
КоличествоИтераций = 0;
Пока (ТекущееОтклонение/КоличествоУравненийСЛУ > ТребуемаяТочность)
И (КоличествоИтераций < МаксимальноеКоличествоИтераций) Цикл
ТекущееОтклонение = 0;
ТекущееОтклонениеПР = 0;
ТекущееОтклонениеНУ = 0;
Для НомерТекущегоУравнения = 0 По МассивСЛУ.Количество() - 1 Цикл
Если МассивСЛУ[НомерТекущегоУравнения] = Неопределено Тогда
// Для этой переменной считать ничего не нужно, первое приближение - это и есть точное решение
Продолжить;
КонецЕсли;
// Получим первое выражение уравнения: S(i)/K(i)
НовоеРешение[НомерТекущегоУравнения] = МассивСвободныхЧленов[НомерТекущегоУравнения];
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВРегламентированномУчете Тогда
НовоеРешениеСтоимостьНУ[НомерТекущегоУравнения] = МассивСвободныхЧленовСтоимостьНУ[НомерТекущегоУравнения];
НовоеРешениеПостояннаяРазница[НомерТекущегоУравнения] = МассивСвободныхЧленовПостояннаяРазница[НомерТекущегоУравнения];
КонецЕсли;
// Добавим к уравнению остальные выражения: (K(1) * X(1) + K(2) * X(2) + ... + K(j) * X(j)) / K(i)
Для Каждого ТекущийКоэффициент Из МассивСЛУ[НомерТекущегоУравнения] Цикл
КоличествоПеремещенногоТовара = ?(ТекущийКоэффициент.ЗначениеКоэффициента = 0, ТекущийКоэффициент.Стоимость, ТекущийКоэффициент.ЗначениеКоэффициента);
НовоеРешение[НомерТекущегоУравнения] = ДобавитьСтоимостьТовараПеремещенногоСДругихСкладов(
НовоеРешение[НомерТекущегоУравнения],
КоличествоПеремещенногоТовара, // K(j)
ТекущийКоэффициент.УзелКоличество, // K(i)
ТекущееРешение[ТекущийКоэффициент.НомерПеременной]); // X(j)
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВРегламентированномУчете Тогда
КоличествоПеремещенногоТовара = ?(ТекущийКоэффициент.КоличествоНУ = 0, ТекущийКоэффициент.СтоимостьНУ + ТекущийКоэффициент.ПостояннаяРазница, ТекущийКоэффициент.КоличествоНУ);
НовоеРешениеСтоимостьНУ[НомерТекущегоУравнения] = ДобавитьСтоимостьТовараПеремещенногоСДругихСкладов(
НовоеРешениеСтоимостьНУ[НомерТекущегоУравнения],
КоличествоПеремещенногоТовара, // K(j)
ТекущийКоэффициент.УзелКоличествоНУ, // K(i)
ТекущееРешениеСтоимостьНУ[ТекущийКоэффициент.НомерПеременной]); // X(j)
НовоеРешениеПостояннаяРазница[НомерТекущегоУравнения] = ДобавитьСтоимостьТовараПеремещенногоСДругихСкладов(
НовоеРешениеПостояннаяРазница[НомерТекущегоУравнения],
КоличествоПеремещенногоТовара, // K(j)
ТекущийКоэффициент.УзелКоличествоНУ, // K(i)
ТекущееРешениеПостояннаяРазница[ТекущийКоэффициент.НомерПеременной]); // X(j)
КонецЕсли;
КонецЦикла;
АА = НовоеРешение[НомерТекущегоУравнения] - ТекущееРешение[НомерТекущегоУравнения];
Если АА < 0 Тогда
АА = -АА;
КонецЕсли;
ТекущееОтклонение = ТекущееОтклонение + АА;
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВРегламентированномУчете Тогда
АА = НовоеРешениеСтоимостьНУ[НомерТекущегоУравнения] - ТекущееРешениеСтоимостьНУ[НомерТекущегоУравнения];
Если АА < 0 Тогда
АА = -АА;
КонецЕсли;
ТекущееОтклонениеНУ = ТекущееОтклонениеНУ + АА;
АА = НовоеРешениеПостояннаяРазница[НомерТекущегоУравнения] - ТекущееРешениеПостояннаяРазница[НомерТекущегоУравнения];
Если АА < 0 Тогда
АА = -АА;
КонецЕсли;
ТекущееОтклонениеПР = ТекущееОтклонениеПР + АА;
КонецЕсли;
КонецЦикла;
ТекущееОтклонение = Макс(ТекущееОтклонение, ТекущееОтклонениеПР, ТекущееОтклонениеНУ);
// Запомним решение текущей итерации чтобы использовать его в следующей итерации
ТекущееРешение = СкопироватьМассив(НовоеРешение);
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВРегламентированномУчете Тогда
ТекущееРешениеСтоимостьНУ = СкопироватьМассив(НовоеРешениеСтоимостьНУ);
ТекущееРешениеПостояннаяРазница = СкопироватьМассив(НовоеРешениеПостояннаяРазница);
КонецЕсли;
КоличествоИтераций = КоличествоИтераций + 1;
КонецЦикла;
ВременнаяТаблицаРешений = Новый ТаблицаЗначений;
ВременнаяТаблицаРешений.Колонки.Добавить("НомерУзла", Новый ОписаниеТипов("Число"));
ВременнаяТаблицаРешений.Колонки.Добавить("ПостояннаяРазница", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(23, 10)));
ВременнаяТаблицаРешений.Колонки.Добавить("СтоимостьНУ", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(23, 10)));
ВременнаяТаблицаРешений.Колонки.Добавить("Стоимость", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(23, 10)));
НомерУзла = 1;
Для каждого ЭлКоллекции Из ТекущееРешение Цикл
НовоеРешение = ВременнаяТаблицаРешений.Добавить();
НовоеРешение.НомерУзла = НомерУзла;
НовоеРешение.Стоимость = ЭлКоллекции;
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВРегламентированномУчете Тогда
НовоеРешение.СтоимостьНУ = ТекущееРешениеСтоимостьНУ[НомерУзла-1];
НовоеРешение.ПостояннаяРазница = ТекущееРешениеПостояннаяРазница[НомерУзла-1];
КонецЕсли;
НомерУзла = НомерУзла + 1;
КонецЦикла;
Запрос.Текст = "
|УНИЧТОЖИТЬ ТаблицаРешений
|;
|ВЫБРАТЬ * ПОМЕСТИТЬ ВременнаяТаблицаРешений ИЗ &ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
|;
|ВЫБРАТЬ
| УзлыКорректировкиСтоимостиСписания.НомерУзла КАК НомерУзла,
| //ДляРеглУчета ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница, 0) КАК ПостояннаяРазница,
| //ДляРеглУчета ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьНУ, 0) КАК СтоимостьНУ,
| ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость, 0) КАК Стоимость
|
|ПОМЕСТИТЬ ТаблицаРешений
|ИЗ
| РегистрСведений.УзлыКорректировкиСтоимостиСписания КАК УзлыКорректировкиСтоимостиСписания
|
| ЛЕВОЕ СОЕДИНЕНИЕ
| ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
| ПО
| ВременнаяТаблицаРешений.НомерУзла = УзлыКорректировкиСтоимостиСписания.НомерУзла
|ГДЕ
| УзлыКорректировкиСтоимостиСписания.Регистратор = &Регистратор
|
|ИНДЕКСИРОВАТЬ ПО
| НомерУзла
|;
|УНИЧТОЖИТЬ ВременнаяТаблицаРешений";
Запрос.УстановитьПараметр("ВременнаяТаблицаРешений", ВременнаяТаблицаРешений);
Запрос.Текст = УправлениеЗатратами.ЗаменитьКомментарииВТекстеЗапроса(Запрос.Текст, ВидОтраженияВУчете);
Запрос.Выполнить();
ОбщегоНазначения.Сообщение("Выполненное количество итераций расчета стоимости: " + Строка(КоличествоИтераций));
ОбщегоНазначения.Сообщение("Полученное среднее отклонение решений: " + Строка(Окр(ТекущееОтклонение/КоличествоУравненийСЛУ, 13)));
Возврат Истина;
КонецФункции
Показать(74) да, действительно можно найти такие условия, при которых обычные методы решения не прокатывают (недаром даже аппроксимационные методы есть) , но здесь другой вопрос - а на практике это встречается, при расчете себестоимости?
Для i=0 По N-1 Цикл
max = i;
Для j = i + 1 По N-1 Цикл
Если abs(ТЗ[j][i])>abs(ТЗ[max][i]) Тогда max=j КонецЕсли;
КонецЦикла;
Для k = i По N Цикл
temp = ТЗ[i][k];
ТЗ[i][k] = ТЗ[max][k];
ТЗ[max][k] = temp;
КонецЦикла;
Для j = i + 1 По N-1 Цикл
Для k = i По N Цикл
ТЗ[j][N+i-k] = ТЗ[j][N+i-k] - ТЗ[i][N+i-k]*ТЗ[j][i]/ТЗ[i][i];
КонецЦикла;
КонецЦикла;
КонецЦикла;
ну а дальше сделать обход снизу верх и найти корни
Процедура Пузырек(Матр,Ж,Ю)
ММ=Ю-1;
НН=Ж;
Пока ММ>=НН Цикл
Если Абс(Матр.ПолучитьЗначение(ММ+1,Ж))>Абс(Матр.ПолучитьЗначение(ММ,Ж)) Тогда
Матр.СдвинутьСтроку(-1,ММ+1);
КонецЕсли;
ММ=ММ-1;
КонецЦикла;
КонецПроцедуры //Пузырек
//__________________________________________________________ ___________________
Процедура Гаусс(Матрица)
Состояние("Решение системы уравнений");
Размер=Матрица.КоличествоСтрок();
Для Ж=1 По Размер-1 Цикл
Пузырек(Матрица,Ж,Размер);
Для КК=Ж+1 ПО Размер Цикл
Коэфф=Матрица.ПолучитьЗначение(КК,Ж)/Матрица.ПолучитьЗначение(Ж,Ж);
Для ВВ=Ж По Размер+1 Цикл
Матрица.УстановитьЗначение(КК,ВВ,Матрица.ПолучитьЗначение(КК,ВВ)-Коэфф*Матрица.ПолучитьЗначение(Ж,ВВ));
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры //Гаусс(Матрица) ПоказатьТ.1. Основные алгоритмы (в т.ч. деревья, списки и т.д.)
Т.2. Получисленные алгоритмы (в т.ч. случайные числа)
Т.3. Сортировка и поиск.
OFF для тех, у кого нет Кнута - упражнение из введения.
Докажите, что если n - целое число, n > 2, то уравнение x**n + y**n = z**n не имеет решения в целых положительных числах x, y, z.
ЗЫ да, теперь фраза -вот это у тебя запросы, - носит двусмысленный оттенок :D ....
Ты рассматриваешь данные отвлеченно. Дескать, данные - они данные и есть . ТЗ и чего тут думать ?
Я же прежде всего рассматриваю данные как некоторую таблицу , хранящуюся на сервере.
Раз она хранится на сервере , то эффективнее всего, в общем случае , обрабатывать ее там же на сервере.
Не перегоняя её в ТЗ на стороне клиента. Т.е. использовать язык запросов.
В этом смысл изврата по реализации метода Гаусса языком запросов.
Пусть даже такая попытка будет неудачной - всё равно это интереснее чем повторять известные еще при царе Горохе реализации на языке 1с.
Другое дело, что в реальной задаче для заполнения массива я использовал (естественно) запрос.
Рассматриваем 8-ку только как приложение к реляционной СУБД : Oracle,MSSQL,DB2.
Все данные 8-ки хранятся только в БД.
Файловый вариант я не рассматриваю.
Когда извращение (реализация метода Гаусса на SQL) представяет итерес - для меня, конечно.
И когда извращение (обработка Арчибальда) не представляет интереса -для меня, конечно.
При решении реальной же задачи для вполне оределенной предметной области - подходы ,конечно, могут быть разными.
Дано:
- таблица А с тремя полями: номер строки, номер столбца, коэффициент
- таблица Б с двумя полями: номер строки, свободный член
- все значения заполнены
- система имеет единственное решение
Требуется:
вывести набор данных из двух столбцов: номер переменной, значение.
Текст запроса не должен зависеть от количества переменных
Ответ - можно.
Найти нормальное псевдорешение А(m,n)x=b,где А(m,n)- некая рациональня матрица.
Нет там никакого упора на "крутые БД". Там информация о "тупиковом" пути реляционной модели СУБД снабжённой "запросным" ЯМД. Ссылка дана в тему от Игоря "Мы пишем з...".
(50)
"причем здесь правда 1С...непонятно..."(с)
Печально, что непонятно. :-(
Цитата от Игоря из (30) сообщения: "Рассматриваем 8-ку только как приложение к реляционной СУБД : Oracle,MSSQL,DB2.".
P.S. Хотя, Вы правы - "...пускай..."(с)...
1. реляционные БД -тупик в развитии
2. Запрос как средство обращения к БД - недоразумение.
Вот скоро придут альтернативные СУБД и увеличат свою долю на рынке с 0.1% до 0.2%.
Как жить дальше 1с-никам ... куды бечь ?
Итак, в извратах надо знать толк. Я толку в извратах не знаю, потому и не занимаюсь оными. Выложенная обработка - просто кусочек модуля формы реального документа из реальной конфигурации. Интересно, неинтересно - система уравнений должна быть решена. Тебе интересно было бы извратиться, мне интересно решить практическую задачу. Я занимаюсь созданием данных и записью их в базу.
Экстраполируя твой подход: что мы имеем при проведении многострочного документа? Вполне очевидную таблицу, а значит, надо ее обрабатывать запросом. Перебор строк в цикле - это так скучно!
Словом, подход потребителя информации. Юзера БД.
Ну, а я уж останусь создателем. В неизвращенной форме и без цинизма.
в любом случае они решают СЛАУ методом простой итерации,
Который, разумеется , предполагает существенную погрешность решения (при 1-2 итерациях).
Ты читал только статью ? А книгу читал ?
Кстати, та самая погрешность у меня называется невязкой. На картинке - 4 копейки. Это максимум модуля остатков по субконто 23 счета после закрытия месяца. В течение 2002 года колебания по месяцам были от 2 до 5 копеек.
(72) В контексте расчета вторичных затрат равенство нулю определителя означает, что в матрицу взаимных услуг включены подразделения, не участвующие в этом процессе (это в запросе к данным отсеивается)
(68) Ну, не считать же определители (я имею в виру решение СЛАУ вручную)
1. У тебя "невязка" похоже - даже не евклидова норма ||b-Ax|| , а простая сумма координат вектора невязки.
2. Я тебе запросто подброшу примерчик 10х10 с неравным 0 определителем. И погрешность будет очень велика.
Впрочем , проблема плохой обусловленности системы - проблема не твоя , а общая.
Касательно плохой обусловленности. Именно в условиях плохой обусловленности системы я и решал свою пракическую задачу. Конкретно, себестоимость услуг одних подразделений на три-четыре порядка превосходила себестоимость услуг других, соответственно выглядела и матрица. Но проблема решается простым округлением: ищем решение (цены) "в рублях и копейках", маленькие коэффициенты при этом вырождаются в нулевые.
"Матрицу вполне можно описать справочником (таблицей) НомерСтроки,НомерСтолбца, Значение. К этой таблице и запрос."(с)
В (21) написано:
"Я же прежде всего рассматриваю данные как некоторую таблицу , хранящуюся на сервере.
Раз она хранится на сервере , то эффективнее всего, в общем случае , обрабатывать ее там же на сервере."(с)
Игорь.
Для получение "матрицы" придётся её сначала "собрать" по базе данных, схема которой описывает предметную область. А потом уже выполнять "К этой таблице и запрос"(с). Ведь, такая "матрица" (таблица) не может и не должна существовать постоянно в БД. Именно этим и будет загружен сервер БД - тупой работой по перелопачиванию данных нескольких таблиц в "матрицу". Т.е. сервер будет решать свои проблемы - преобразовывать данные под удобства их обработки запросным ЯМД. Но тогда проще и логичней собрать "матрицу", например, в таблицу значений и порешить задачу как это сделано в данной публикации. Кстати, распределить нагрузку сети, в целом, на мозги рабочей станции. Если встаёт вопрос (проблема) размеров такой "матрицы", то это решается простейшим алгоритмом поддержки "динамических массивов" рабочими файлами на стороне клиента (рабочей станции).
Ссылка для ознакомления:
ЗЫ насчет запросов и алгоритмов - плохая практика переносить задачи сервера приложений на сервер БД...
а_1_1, а_1_2, в_1;
а_2_1, а_2_2, в_2Превращаем в
а_1_1, а_1_2, в_1;
*, а_2_2-(а_1_2*а_2_1/а_1_1), в_2-(в_1*а_2_1/а_1_1)И так далее. Интерпретация нужна, чтобы на ноль не делить (вовремя остановиться).
ЗЫ к сожалению я очень ленивый прагматик, потому как для меня смысла делать на запросах нет, то не буду
Повторюсь еще N-раз. При наличии в СУБД различных "моделей" БД и ЯМД не требуется, например, "средний уровень" (т.н. сервер приложений).И решаются задачи от Игоря в теме "Мы пишем з..." - элементарно...
А реляционная модель и только "запросный" ЯМД - это ошибка в СУБД-строении, приводящая к порождению многоуровневых монстров типа "1С 8.х". Вроде, об этом уже столько сказано (и сделано), что агрессивно восторгаться SQL-ем (фраза для Игоря) уже и неприлично... ;-) А пытаться решать ВСЕ задачи, только запросами - глупо...
(56)
"Как жить дальше 1с-никам ... куды бечь ?"(с)
Игорь, "бечь" всегда есть куда... ;-)
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 86963
Создание 05.07.11 14:09
Обновление 05.07.11 13:38
Просмотры 25935
Загрузки 110
Рейтинг
31
Комментарии 81
Код открыт Не указано
Рубрики Математика и алгоритмы
Кому Для всех
Тип файла Внешняя обработка (ert,epf)
Платформа
Оперативный учет 7.7
,
Бухгалтерский учет 7.7
,
Расчет 7.7
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)