gifts2017

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

Опубликовал Михаил Гусев (Идальго) в раздел Программирование - Универсальные функции

Представлены программы (без теории) на языке 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). Чтож, неплохо. 

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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