Подробное изложение теоретической части алгоритмов и численного интегрирования вообще, можно найти практически в любой книге о численных методах, например — Е. А. Волков «Численные методы», ну или в Википедии -«https://ru.wikipedia.org/wiki/Численное_интегрирование». Особое внимание нужно уделить вопросам выбора узлов и шага интегрирования, обеспечения требуемой точности вычислений, а также применимости и целесообразности выбора того или другого метода.
В качестве подинегральной функции рассмотрим «обычную» гладкую и непрерывную функцию (одного аргумента):
Функция Функция_1(х)
Возврат х*х;
КонецФункции
Так будет выглядеть вызов расчетных функций:
Процедура ВыполнитьРасчет()
Число_шагов = 100;
Х_нач = 0;
Х_кон = 5;
Сообщить("Метод левых прямоугольников = " + РассчитатьЛевымиПрямоугольниками(Х_нач, Х_кон, Число_шагов));
Сообщить("Метод правых прямоугольников = " + РассчитатьПравымиПрямоугольниками(Х_нач, Х_кон, Число_шагов));
Сообщить("Метод средних прямоугольников = " + РассчитатьСреднимиПрямоугольниками(Х_нач, Х_кон, Число_шагов));
Сообщить("Метод трапеций = " + РассчитатьТрапециями(Х_нач, Х_кон, Число_шагов));
Сообщить("Метод Симпсона = " + РассчитатьСимпсона(Х_нач, Х_кон, Число_шагов));
КонецПроцедуры
Таким образом, функция F(x)=x#k8SjZc9Dxk2 интегрируется на интервале от Х_нач до Х_кон, число шагов фиксировано и равно 100 (вообще, для различных методов с целью обеспечения требуемой точности можно рассчитать минимально необходимое число шагов, но для наших ознакомительных целей берем именно фиксированное значение).
Важно также помнить, что при расчетах могут получаться числа с длинной дробной частью, работа с которыми занимает у 1С много времени и сильно тормозит вычисления. Поэтому, например, при определении функции имеет смысл вместо «Возврат F(X)» писать «Возврат Окр(F(X), 16)».
1) Метод левых прямоугольников:
Функция РассчитатьЛевымиПрямоугольниками(Х_нач, Х_кон, Число_шагов)
Сумма = 0;
h = (Х_кон-Х_нач)/Число_шагов;
х = Х_нач;
Для й=0 По Число_шагов-1 Цикл
Сумма = Сумма + h*Функция_1(х);
х = (х + h);
КонецЦикла;
Возврат Сумма;
КонецФункции
2) Метод правых прямоугольников:
Функция РассчитатьПравымиПрямоугольниками(Х_нач, Х_кон, Число_шагов)
Сумма = 0;
h = (Х_кон-Х_нач)/Число_шагов;
х = Х_кон;
Для й=1 По Число_шагов Цикл
Сумма = Сумма + h*Функция_1(х);
х = (х - h);
КонецЦикла;
Возврат Сумма;
КонецФункции
3) Метод средних прямоугольников:
Функция РассчитатьСреднимиПрямоугольниками(Х_нач, Х_кон, Число_шагов)
Сумма = 0;
h = (Х_кон-Х_нач)/Число_шагов;
х = Х_нач;
Для й=1 По Число_шагов Цикл
Сумма = Сумма + Функция_1(х + 0.5*h);
х = (х + h);
КонецЦикла;
Возврат h*Сумма;
КонецФункции
4) Метод трапеций:
Функция РассчитатьТрапециями(Х_нач, Х_кон, Число_шагов)
Сумма = 0;
h = (Х_кон-Х_нач)/Число_шагов;
х = Х_нач;
Для й=0 По Число_шагов Цикл
Если й=0 или й=Число_шагов Тогда
Сумма = Сумма + 0.5*Функция_1(х);
Иначе
Сумма = Сумма + Функция_1(х);
КонецЕсли;
х = х + h;
КонецЦикла;
Возврат h*Сумма;
КонецФункции
5) Метод Симпсона:
Функция РассчитатьСимпсона(Х_нач, Х_кон, Число_шагов)
Сумма = 0;
h = (Х_кон-Х_нач)/Число_шагов;
х = Х_нач;
СуммаЧетных = 0;
СуммаНеЧетных = 0;
Для й=0 По Число_шагов Цикл
Если й=0 или й=Число_шагов Тогда
Сумма = Сумма + Функция_1(х);
Иначе
Если й % 2 = 0 Тогда
СуммаЧетных = СуммаЧетных + Функция_1(х);
Иначе
СуммаНеЧетных = СуммаНеЧетных + Функция_1(х);
КонецЕсли;
КонецЕсли;
х = х + h;
КонецЦикла;
Возврат (h/3)*(Сумма + 2*СуммаЧетных + 4*СуммаНеЧетных);
КонецФункции
Итак, для рассматриваемого примера получились вот такие результаты:
Метод левых прямоугольников = 41,04375
Метод правых прямоугольников = 42,29375
Метод средних прямоугольников = 41,665625
Метод трапеций = 41,66875
Метод Симпсона = 41,6666666666666667
Точное же значение интеграла = 125/3 ~ 41,6(6). Чтож, неплохо.
В завершении нужно отметить, что вообще различных методов интегрирования существует довольно много, тем не менее, на практике большинство задач можно с успехом решать и этими.
О-да… незаменимая для 1С вещь — интегралы.
По поводу длинных дробных частей при арифметических операциях. Имеет смысл типизировать результат вычисления. Например, вместо массива лучше оперировать таблицей значений с одним типизированным столбцом.
И до кучи: проверял как-то метод Жордана-Гаусса для плохо обусловленной матрицы (система Горбунова). В свое время на Паскале для вещ. число с одинарной точностью получил, что метод давал правильное решение для размера матрицы = 18, для двойной точности — 23. В 1С метод был устойчив для размеров до 70.
(2) Михаил Козлов,
1. Да, именно из-за типизации такая штука.
2. Ну, если в 1с получалось точнее, то там наверно не одинарная точность была у чисел. А то, не совсем тогда ясна причина этого результата.
(1) А почему бы и не да?
(3) Идальго, Т.к. матрица было таб. частью обработки, то максимальная длина мантиссы — 32. Если через таблицу значений, то, вроде бы, — 64.
(1) Taktic,
Спасибо, хоть вспомнил численные методы
Все публикации говорят что раз автор разбирается в высшей математике и не поленился переписать алгоритмы на 1С то в остальном разберется. Может, заодно и курсовой проект (лабу, зачет, экзамен) сдал 🙂
Потом только предметную область изучать не отвлекаясь на язык 1С.
(7) kostyaomsk, да нее ))) Давно это всё изучали, сейчас уже подзабыл, вот и решил освежить в памяти.
Одежды на тетке много. А так — плюс.
(1) Taktic, а чего вы смеетесь ? мне как то понадобилось реализовывать задачу где со слов заказчика «цена б/у товара меняется каждый день в зависимости от лежания на витрине, в сторону уменьшения, но не плавно, а сначала быстро, затем замедляется и совсем останавливается в течении полугода»… так вот Арктангенс решил эту задачку в одну строчку, а если-б понадобилось решать её в запросе то думаю через подаваемую таблицу рассчитанных арктангенсов в запрос, ну край если загрузить проц на сервере через ряды Макларена. думаю гдето могут и интегралы пригодиться, на вскидку: рассчитывать площади стекол для эксклюзивных оконных рам , изогнутых и тд., если это оконное предприятие. ПС 1/pow(х,2) не подошел
(10) eugeniezheludkov, почему не подошел f(x)=B + А/x#k8SjZc9Dxk2 (где В — цена, ниже которой уже не опустится, А — влияет на изогнутость (скорость) уменьшения)? А почему арктангенс подошел я не понял, тогда уж 1/арктангенс, который в первой четверти как раз и напоминает предыдущую функцию. Или м.б. вообще что-то вроде f(x)=B+A/exp(x)
Это уже из военного юмора. Слова отставного полковника или генерала «Мне, вашу мать, интеграл понадобился только чтоб из металла согнуть загогулину и что-то подцепить». Тут хоть куда-то арктангенс пригодился.