Применение сплайнов для численного интегрирования
Материал из MachineLearning.
(Добавил основную часть теории) |
|||
Строка 6: | Строка 6: | ||
где <tex>a</tex> и <tex>b</tex> - нижний и верхний пределы интегрирования; <tex>f(t)</tex> - непрерывная функция на отрезке <tex>[a,b]</tex>. | где <tex>a</tex> и <tex>b</tex> - нижний и верхний пределы интегрирования; <tex>f(t)</tex> - непрерывная функция на отрезке <tex>[a,b]</tex>. | ||
- | Введем на отрезке интегрирования | + | Введем на отрезке интегрирования сетку, определим значения функции в узлах сетки. Пусть имеется совокупность узлов |
- | <tex>\left\{{t_i}\right\}_{i = 0}^{N},\; | + | <tex>\left\{{t_i}\right\}_{i = 0}^{N},\; i\in \left[{a, b}\right].</tex> Тогда интервал <tex>[a,b]</tex> разобьется на участки <tex>\tau_i = t_i-t_{i-1},\; i-1,\dots,N.</tex> |
Пусть также задана таблица | Пусть также задана таблица | ||
<tex>f_i = \left\{{f(t_i)}\right\}_{i = 0}^{N}.</tex> | <tex>f_i = \left\{{f(t_i)}\right\}_{i = 0}^{N}.</tex> | ||
Строка 20: | Строка 20: | ||
== Изложение метода == | == Изложение метода == | ||
- | + | Возьмем в {{eqref|3}} в качестве аппроксимирующей функции [[Интерполяция кубическими сплайнами|кубический сплайн]]: | |
- | Возьмем в {{eqref|3}} в качестве аппроксимирующей функции кубический сплайн: | + | |
{{eqno |4}} | {{eqno |4}} | ||
::<tex>\int_a^bf(t)dt \approx \sum_{i=1}^N\;\int_{t_{i-1}}^{t_i}\varphi_i(t)dt,</tex> где | ::<tex>\int_a^bf(t)dt \approx \sum_{i=1}^N\;\int_{t_{i-1}}^{t_i}\varphi_i(t)dt,</tex> где | ||
- | <tex>\varphi_i(t) = a_i+b_i(t-t_{i-1})+c_i(t - t_{i-1})^2 + d_i(t - t_{i-1})^3, \; t \in [t_{i-1},\;t_i]. </tex> | + | {{eqno|φ}} |
+ | ::<tex>\varphi_i(t) = a_i+b_i(t-t_{i-1})+c_i(t - t_{i-1})^2 + d_i(t - t_{i-1})^3, \; t \in [t_{i-1},\;t_i]. </tex> | ||
Коэффициенты вычисляются по следующим формулам: | Коэффициенты вычисляются по следующим формулам: | ||
- | {{eqno| | + | {{eqno|5a}} |
- | <tex> a_i=f_{i-1}</tex> | + | ::<tex> a_i=f_{i-1}</tex> |
- | <tex>b_i=\frac{f_i-f_{i-1}}{\ | + | {{eqno|5b}} |
+ | ::<tex>b_i=\frac{f_i-f_{i-1}}{\tau_i}\;-\;\frac{\tau_i(2c_i+c_{i+1})}{3}</tex> | ||
- | <tex>c_{i-1}+ | + | {{eqno|5c}} |
+ | ::<tex>\tau_{i-1}c_{i-1}+2(\tau_{i-1}+\tau_i)c_i+\tau_i c_{i+1}=3\left(\frac{f_i-f_{i-1}}{\tau_i} \; - \; \frac{f_{i-1}-f_{i-2}}{\tau_{i-1}}\right),\;\; 2 \le i \le N, \;\;c_1=c_{N+1}=0</tex> | ||
- | <tex>d_i=\frac{c_{i+1}-c_i}{3\ | + | {{eqno|5d}} |
+ | ::<tex>d_i=\frac{c_{i+1}-c_i}{3\tau_i}</tex> | ||
Тогда интеграл {{eqref|4}} запишется как сумма интегралов от сплайнов: | Тогда интеграл {{eqref|4}} запишется как сумма интегралов от сплайнов: | ||
- | ::<tex>J=\int_a^bf(t)dt \approx \sum_{i=1}^N\;\int_{t_{i-1}}^{t_i}\varphi_i(t)dt=\sum_{i=1}^N\left(a_i\ | + | ::<tex>J=\int_a^bf(t)dt \approx \sum_{i=1}^N\;\int_{t_{i-1}}^{t_i}\varphi_i(t)dt=\sum_{i=1}^N\left(a_i\tau_i+{b_i\over2}\tau_i^2+{c_i\over3}\tau_i^3+{d_i\over4}\tau_i^4\right).</tex> |
- | Последняя формула упрощается при подстановке в неё выражений {{eqref| | + | Последняя формула упрощается при подстановке в неё выражений {{eqref|5a}}, {{eqref|5b}} и {{eqref|5d}} для коэффициентов <tex>a_i,\;b_i</tex> и <tex>d_i:</tex> |
- | <tex>J \;\approx \;\sum_{i=1}^n\;\frac{f_i+f_{i-1}}{2}\ | + | {{eqno|6}} |
+ | ::<tex>J \;\approx \;\sum_{i=1}^n\;\frac{f_i+f_{i-1}}{2}\tau_i\;-\;\sum_{i=1}^n\;\frac{\tau_i^3(c_{i+1}+c_i)}{12}.</tex> | ||
+ | Нетрудно видеть, что матриа для решения СЛАУ {{eqref|5c}} есть трехдиагональная матрица с диагональным преобладанием. Поэтому коэффициенты <tex>c_i</tex> можно вычислить с помощью метода прогонки. | ||
+ | == Анализ метода и ошибок == | ||
+ | Анализ формулы {{eqref|6}} показывает, что первый член в правой части совпадает с [[Методы прямоугольников и трапеций|формулой трапеций]]. Следовательно, второй член характеризует поправку к методу трапеций, которую дает использование сплайнов. | ||
+ | Как следует из формулы {{eqref|φ}}, коэффициенты <tex>c_i</tex> выражаются через вторые производные <tex>\varphi_i''(t):</tex> | ||
+ | ::<tex>c_i=\frac{1}{2}\varphi_i''(t_{i-1})\approx\frac{1}{2}f_{i-1}''.</tex> | ||
+ | |||
+ | Это позволяет оценить второй член правой части формулы {{eqref|6}}: | ||
+ | |||
+ | ::<tex>\frac{\tau_i^3}{12}(c_{i-1}+c_i)\approx\frac{\tau_i^3}{12}f_*'',</tex> | ||
+ | |||
+ | где <tex>f_*''</tex> - вторая производная в некоторой нутренней точке. Полученная оценка показывает, что добавка к формуле трапеций, которую дает использование сплайнов, компенсирует погрешность самой формулы трапеций. | ||
- | |||
- | |||
== Числовой пример == | == Числовой пример == | ||
+ | |||
+ | |||
== Рекомендации программисту == | == Рекомендации программисту == | ||
+ | ===Пример программы=== | ||
+ | Ниже приведен пример программы на языке C++, считающей приближенное значение интеграла с помощью сплайн-квадратур: | ||
+ | [[Media:Splineint.zip|Splineint.zip [0.7Кб]]] | ||
+ | |||
+ | '''Некоторые комментарии по работе с программой:''' | ||
+ | |||
+ | В 5-й строке <code>const int N=100;</code> N - число отрезков <tex>\tau_i.</tex> | ||
+ | |||
+ | В 7-й строке <code>const double a=1,b=6;</code> <tex>a</tex> и <tex>b</tex> - пределы интегрирования. | ||
+ | |||
+ | В 49-й строке <code>f[i]=0.6*x*x*x-3*x*x+3*x;</code> f[i] - интегрируемая функция. | ||
+ | |||
+ | |||
+ | === Случай с равномерной сеткой === | ||
+ | Пусть на отрезке <tex>[a,b]</tex> задана равномерная сетка, т.е. <tex>\tau_1=\tau_2=\dots=\tau_N=\tau.</tex> Тогда выражение {{eqref|6}} перепишется в виде: | ||
+ | |||
+ | {{eqno|7}} | ||
+ | ::<tex>J\;\approx\;\frac{\tau}{2}(f_0+f_N)+\tau\sum_{i=1}^{N-1}f_i-\frac{\tau^3}{6}\sum_{i=2}^Nc_i.</tex> | ||
+ | |||
+ | Просуммируем уравнения {{eqref|5c}} от i=2 до N. Получим: | ||
+ | |||
+ | {{eqno|8}} | ||
+ | ::<tex> 6\sum_{i=2}^Nc_i=(c_2+c_N)+\frac{3}{\tau^2}(f_0-f_1+f_N-f_{N-1}).</tex> | ||
+ | |||
+ | Подставим {{eqref|8}} в {{eqref|7}} и получим окончательное выражение для <tex>J</tex>: | ||
+ | |||
+ | ::<tex> J\;\approx\;\tau\sum_{i=2}^{N-2}f_i+\frac{\tau}{2}(-5f_0+8f_1+8f_{N-1}-5f_N)-\tau^3(c_2+c_N)</tex> | ||
+ | |||
+ | Несмотря на то, что <tex>c_2</tex> и <tex>c_N</tex> все равно придется вычислять методом прогонки, точность и скорость вычисления приближенного значения интеграла будут увеличены за счет сокращения числа слагаемых. | ||
+ | |||
<!-- У Богдана интересная хрень про заданную точность --> | <!-- У Богдана интересная хрень про заданную точность --> | ||
== Заключение == | == Заключение == | ||
- | < | + | Итак, мы получили, что погрешность сплайн-квадратуры меньше, чем погрешность метода трапеций. Однако алгоритм интегрирования с помощью сплайнов сложнее алгоритмов методов трапеций и Симпсона за счет необходимости решения СЛАУ для опрееления коэффициентов сплайнов <tex>c_i.</tex> Также при решении СЛАУ теряется точность. Поэтому рационально использовать сплайн-квадратуры в комплексе, когда сплайны применяются для сглаживания зависимостей, обработки эксперимениальных данных и т.п. |
== Ссылки == | == Ссылки == | ||
* [[Практикум ММП ВМК, 4й курс, осень 2008|Практикум ММП ВМК, 4й курс, осень 2008]] | * [[Практикум ММП ВМК, 4й курс, осень 2008|Практикум ММП ВМК, 4й курс, осень 2008]] | ||
+ | * [[Интерполяция кубическими сплайнами]] | ||
== Список литературы == | == Список литературы == | ||
* http://www.intuit.ru/department/calculate/calcmathbase/7/1.html | * http://www.intuit.ru/department/calculate/calcmathbase/7/1.html | ||
* http://mathalgo.blogspot.com/2007/11/blog-post.html | * http://mathalgo.blogspot.com/2007/11/blog-post.html | ||
- | * | + | * http://myhomepage.h17.ru/Lect06/lect06.htm#02 |
- | * Мудров | + | * А.Е. Мудров. Численные методы для ПЭВМ на языках Бейсик, Фортран и Паскаль. - Томск:МП "РАСКО", 1991. |
- | + | ||
- | <!--не забыть про ссылки | + | <!--не забыть про ссылки--> |
{{stub}} | {{stub}} | ||
[[Категория:Численное интегрирование]] | [[Категория:Численное интегрирование]] |
Версия 10:02, 19 октября 2008
Содержание |
Введение
Ставится задача вычислить интеграл вида
где и - нижний и верхний пределы интегрирования; - непрерывная функция на отрезке .
Введем на отрезке интегрирования сетку, определим значения функции в узлах сетки. Пусть имеется совокупность узлов Тогда интервал разобьется на участки Пусть также задана таблица Представим интеграл (1) в виде суммы интегралов по частичным отрезкам:
Сущность большинства методов вычисления определенных интегралов состоит в замене подынтегральной функции на отрезке аппроксимирующей функцией , для которой можно легко записать первообразную в элементарных функциях, т.е.
где S - приближеное значение интеграла; R - погрешность вычисления интеграла. Лучше всего изучена замена алгебраическим многочленом.
Изложение метода
Возьмем в (3) в качестве аппроксимирующей функции кубический сплайн:
- где
Коэффициенты вычисляются по следующим формулам:
Тогда интеграл (4) запишется как сумма интегралов от сплайнов:
Последняя формула упрощается при подстановке в неё выражений (5a), (5b) и (5d) для коэффициентов и
Нетрудно видеть, что матриа для решения СЛАУ (5c) есть трехдиагональная матрица с диагональным преобладанием. Поэтому коэффициенты можно вычислить с помощью метода прогонки.
Анализ метода и ошибок
Анализ формулы (6) показывает, что первый член в правой части совпадает с формулой трапеций. Следовательно, второй член характеризует поправку к методу трапеций, которую дает использование сплайнов.
Как следует из формулы (φ), коэффициенты выражаются через вторые производные
Это позволяет оценить второй член правой части формулы (6):
где - вторая производная в некоторой нутренней точке. Полученная оценка показывает, что добавка к формуле трапеций, которую дает использование сплайнов, компенсирует погрешность самой формулы трапеций.
Числовой пример
Рекомендации программисту
Пример программы
Ниже приведен пример программы на языке C++, считающей приближенное значение интеграла с помощью сплайн-квадратур: Splineint.zip [0.7Кб]
Некоторые комментарии по работе с программой:
В 5-й строке const int N=100;
N - число отрезков
В 7-й строке const double a=1,b=6;
и - пределы интегрирования.
В 49-й строке f[i]=0.6*x*x*x-3*x*x+3*x;
f[i] - интегрируемая функция.
Случай с равномерной сеткой
Пусть на отрезке задана равномерная сетка, т.е. Тогда выражение (6) перепишется в виде:
Просуммируем уравнения (5c) от i=2 до N. Получим:
Подставим (8) в (7) и получим окончательное выражение для :
Несмотря на то, что и все равно придется вычислять методом прогонки, точность и скорость вычисления приближенного значения интеграла будут увеличены за счет сокращения числа слагаемых.
Заключение
Итак, мы получили, что погрешность сплайн-квадратуры меньше, чем погрешность метода трапеций. Однако алгоритм интегрирования с помощью сплайнов сложнее алгоритмов методов трапеций и Симпсона за счет необходимости решения СЛАУ для опрееления коэффициентов сплайнов Также при решении СЛАУ теряется точность. Поэтому рационально использовать сплайн-квадратуры в комплексе, когда сплайны применяются для сглаживания зависимостей, обработки эксперимениальных данных и т.п.
Ссылки
Список литературы
- http://www.intuit.ru/department/calculate/calcmathbase/7/1.html
- http://mathalgo.blogspot.com/2007/11/blog-post.html
- http://myhomepage.h17.ru/Lect06/lect06.htm#02
- А.Е. Мудров. Численные методы для ПЭВМ на языках Бейсик, Фортран и Паскаль. - Томск:МП "РАСКО", 1991.