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

25.11.14

Разработка - Универсальные функции

Представлены программы (без теории) на языке 1С8 для вычисления определенных интегралов по методам левых, правых и средних прямоугольников, методу трапеций и Симпсона. Статья может быть интересной для тех, кто не знал или подзабыл простые способы вычисления интегралов.

Подробное изложение теоретической части алгоритмов и численного интегрирования вообще, можно найти практически в любой книге о численных методах, например - Е. А. Волков "Численные методы", ну или в Википедии -"https://ru.wikipedia.org/wiki/Численное_интегрирование". Особое внимание нужно уделить вопросам выбора узлов и шага интегрирования, обеспечения требуемой точности вычислений, а также применимости и целесообразности выбора того или другого метода.  

 

В качестве подинегральной функции рассмотрим "обычную" гладкую и непрерывную функцию (одного аргумента):

Функция Функция_1(х)
	Возврат х*х;
КонецФункции	

Так будет выглядеть вызов расчетных функций:

Процедура ВыполнитьРасчет()
	Число_шагов = 100; 	
	Х_нач 	= 0; 
	Х_кон 	= 5; 
	Сообщить("Метод левых прямоугольников	= " + РассчитатьЛевымиПрямоугольниками(Х_нач, Х_кон, Число_шагов));
	Сообщить("Метод правых прямоугольников	= " + РассчитатьПравымиПрямоугольниками(Х_нач, Х_кон, Число_шагов));
	Сообщить("Метод средних прямоугольников	= " + РассчитатьСреднимиПрямоугольниками(Х_нач, Х_кон, Число_шагов));
	Сообщить("Метод трапеций				= " + РассчитатьТрапециями(Х_нач, Х_кон, Число_шагов));
	Сообщить("Метод Симпсона				= " + РассчитатьСимпсона(Х_нач, Х_кон, Число_шагов));
КонецПроцедуры	

Таким образом, функция F(x)=x^2 интегрируется на интервале от Х_нач до Х_кон, число шагов фиксировано и равно 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). Чтож, неплохо. 

В завершении нужно отметить, что вообще различных методов интегрирования существует довольно много, тем не менее, на практике большинство задач можно с успехом решать и этими.

Вступайте в нашу телеграмм-группу Инфостарт

интегрирование метод прямоугольников метод трапеций метод Симпсона

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3422    Abysswalker    8    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6355    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    48730    dimanich70    83    

169

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7298    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    60936    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9095    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Taktic 40 26.11.14 08:21 Сейчас в теме
О-да... незаменимая для 1С вещь - интегралы.
davay2000; +1 Ответить
4. DrAku1a 1785 27.11.14 02:36 Сейчас в теме
(1) А почему бы и не да?
6. Gotcha 5 24.12.14 14:41 Сейчас в теме
(1) Taktic,
Спасибо, хоть вспомнил численные методы
10. eugeniezheludkov 45 26.12.14 03:00 Сейчас в теме
(1) Taktic, а чего вы смеетесь ? мне как то понадобилось реализовывать задачу где со слов заказчика "цена б/у товара меняется каждый день в зависимости от лежания на витрине, в сторону уменьшения, но не плавно, а сначала быстро, затем замедляется и совсем останавливается в течении полугода"... так вот Арктангенс решил эту задачку в одну строчку, а если-б понадобилось решать её в запросе то думаю через подаваемую таблицу рассчитанных арктангенсов в запрос, ну край если загрузить проц на сервере через ряды Макларена. думаю гдето могут и интегралы пригодиться, на вскидку: рассчитывать площади стекол для эксклюзивных оконных рам , изогнутых и тд., если это оконное предприятие. ПС 1/pow(х,2) не подошел
11. Идальго 240 26.12.14 08:12 Сейчас в теме
(10) eugeniezheludkov, почему не подошел f(x)=B + А/x^2 (где В - цена, ниже которой уже не опустится, А - влияет на изогнутость (скорость) уменьшения)? А почему арктангенс подошел я не понял, тогда уж 1/арктангенс, который в первой четверти как раз и напоминает предыдущую функцию. Или м.б. вообще что-то вроде f(x)=B+A/exp(x)
2. Михаил Козлов 111 26.11.14 10:53 Сейчас в теме
По поводу длинных дробных частей при арифметических операциях. Имеет смысл типизировать результат вычисления. Например, вместо массива лучше оперировать таблицей значений с одним типизированным столбцом.
И до кучи: проверял как-то метод Жордана-Гаусса для плохо обусловленной матрицы (система Горбунова). В свое время на Паскале для вещ. число с одинарной точностью получил, что метод давал правильное решение для размера матрицы = 18, для двойной точности - 23. В 1С метод был устойчив для размеров до 70.
3. Идальго 240 26.11.14 13:32 Сейчас в теме
(2) Михаил Козлов,
1. Да, именно из-за типизации такая штука.
2. Ну, если в 1с получалось точнее, то там наверно не одинарная точность была у чисел. А то, не совсем тогда ясна причина этого результата.
mr.Samuelson; +1 Ответить
5. Михаил Козлов 111 27.11.14 11:54 Сейчас в теме
(3) Идальго, Т.к. матрица было таб. частью обработки, то максимальная длина мантиссы - 32. Если через таблицу значений, то, вроде бы, - 64.
7. jobkostya1c_ERP 101 24.12.14 20:26 Сейчас в теме
Все публикации говорят что раз автор разбирается в высшей математике и не поленился переписать алгоритмы на 1С то в остальном разберется. Может, заодно и курсовой проект (лабу, зачет, экзамен) сдал :)
Потом только предметную область изучать не отвлекаясь на язык 1С.
8. Идальго 240 24.12.14 20:34 Сейчас в теме
(7) kostyaomsk, да нее ))) Давно это всё изучали, сейчас уже подзабыл, вот и решил освежить в памяти.
9. so-quest 140 25.12.14 14:19 Сейчас в теме
Одежды на тетке много. А так - плюс.
12. jobkostya1c_ERP 101 26.12.14 20:19 Сейчас в теме
Это уже из военного юмора. Слова отставного полковника или генерала "Мне, вашу мать, интеграл понадобился только чтоб из металла согнуть загогулину и что-то подцепить". Тут хоть куда-то арктангенс пригодился.
Для отправки сообщения требуется регистрация/авторизация