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



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

Подробное изложение теоретической части алгоритмов и численного интегрирования вообще, можно найти практически в любой книге о численных методах, например — Е. А. Волков «Численные методы», ну или в Википедии -«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). Чтож, неплохо. 

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

12 Comments

  1. Taktic

    О-да… незаменимая для 1С вещь — интегралы.

    Reply
  2. Михаил Козлов

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

    И до кучи: проверял как-то метод Жордана-Гаусса для плохо обусловленной матрицы (система Горбунова). В свое время на Паскале для вещ. число с одинарной точностью получил, что метод давал правильное решение для размера матрицы = 18, для двойной точности — 23. В 1С метод был устойчив для размеров до 70.

    Reply
  3. Идальго

    (2) Михаил Козлов,

    1. Да, именно из-за типизации такая штука.

    2. Ну, если в 1с получалось точнее, то там наверно не одинарная точность была у чисел. А то, не совсем тогда ясна причина этого результата.

    Reply
  4. DrAku1a

    (1) А почему бы и не да?

    Reply
  5. Михаил Козлов

    (3) Идальго, Т.к. матрица было таб. частью обработки, то максимальная длина мантиссы — 32. Если через таблицу значений, то, вроде бы, — 64.

    Reply
  6. Gotcha

    (1) Taktic,

    Спасибо, хоть вспомнил численные методы

    Reply
  7. jobkostya1c8

    Все публикации говорят что раз автор разбирается в высшей математике и не поленился переписать алгоритмы на 1С то в остальном разберется. Может, заодно и курсовой проект (лабу, зачет, экзамен) сдал 🙂

    Потом только предметную область изучать не отвлекаясь на язык 1С.

    Reply
  8. Идальго

    (7) kostyaomsk, да нее ))) Давно это всё изучали, сейчас уже подзабыл, вот и решил освежить в памяти.

    Reply
  9. so-quest

    Одежды на тетке много. А так — плюс.

    Reply
  10. eugeniezheludkov

    (1) Taktic, а чего вы смеетесь ? мне как то понадобилось реализовывать задачу где со слов заказчика «цена б/у товара меняется каждый день в зависимости от лежания на витрине, в сторону уменьшения, но не плавно, а сначала быстро, затем замедляется и совсем останавливается в течении полугода»… так вот Арктангенс решил эту задачку в одну строчку, а если-б понадобилось решать её в запросе то думаю через подаваемую таблицу рассчитанных арктангенсов в запрос, ну край если загрузить проц на сервере через ряды Макларена. думаю гдето могут и интегралы пригодиться, на вскидку: рассчитывать площади стекол для эксклюзивных оконных рам , изогнутых и тд., если это оконное предприятие. ПС 1/pow(х,2) не подошел

    Reply
  11. Идальго

    (10) eugeniezheludkov, почему не подошел f(x)=B + А/x#k8SjZc9Dxk2 (где В — цена, ниже которой уже не опустится, А — влияет на изогнутость (скорость) уменьшения)? А почему арктангенс подошел я не понял, тогда уж 1/арктангенс, который в первой четверти как раз и напоминает предыдущую функцию. Или м.б. вообще что-то вроде f(x)=B+A/exp(x)

    Reply
  12. jobkostya1c8

    Это уже из военного юмора. Слова отставного полковника или генерала «Мне, вашу мать, интеграл понадобился только чтоб из металла согнуть загогулину и что-то подцепить». Тут хоть куда-то арктангенс пригодился.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *