Численное интегрирование: многочлен Лагранжа
Рассмотрим многочлен вида
Очевидно, что . Сложив подобных многочленов можно получить
где штрих у произведения означает, что произведение берётся по всем . Этот многочлен называется многочленом Лагранжа. Нетрудно видеть, что
то есть этот многочлен совпадает с интерполяционным . Однако, при его интегрировании обнаруживается интересная особенность: для интегрирования нужно знать лишь интегралы от полиномов вроде рассмотренного выше :
где коэффициенты
зависят только от разбиения и не зависят от интегрируемой функции. Следовательно, они общие для всех функций и для расчёта интеграла больше не нужно решать систему.
Для большего обобщения можно рассмотреть отображение
Тогда
Точки называются узлами разбиения, а соответствующие им значения – весами.
Теперь обратимся к задаче поиска весов. Подынтегральное произведение является многочленом степени и может быть представлено в виде
Для определения коэффициентов рассмотрим вспомогательную задачу: определим коэффициенты произведения многочлена степени на двучлен . Расписывая, получим:
Этот процесс можно описать в программе, представив многочлен в виде списка его коэффициентов:
Используя полученное выражение для коэффициентов, можно определить коэффициенты , последовательно домножая на :
Зная коэффициенты, можно рассчитать значение многочлена в любой точке. Это нам потребуется для определения знаменателя:
Для определения веса нужно проинтегрировать полученный многочлен на промежутке :
Видно, что слагаемые с нечётными обращаются в , что позволяет написать вот такой вот код:
Ну а теперь, собрав всё вместе, можно определить веса:
Внимательный читатель заметит, что произведения отличаются друг от друга только одним множителем, поэтому их можно не пересчитывать несколько раз. Вместо этого можно посчитать произведение всех двучленов, а затем получать каждый многочлен после однократного деления полного произведения на . Для этого можно воспользоваться схемой Горнера.
Ну а теперь можно коротко и ясно описать интегрирование:
Обратите внимание, что пределы интегрирования нужно передавать как числа с плавающей точкой, то есть не 0 или 1, а 0.0 и 1.0. Это особенность python2.