В численном анализе , метод Ромберга ( Ромберга 1 955 ) используется для оценки определенного интеграла
многократно применяя экстраполяцию Ричардсона ( Richardson 1911 ) к правилу трапеции или правилу прямоугольника (правило средней точки). Оценки формируют треугольный массив . Метод Ромберга - это формула Ньютона – Котеса - он вычисляет подынтегральное выражение в равноотстоящих точках. Подынтегральная функция должна иметь непрерывные производные, хотя довольно хорошие результаты могут быть получены, если существует только несколько производных. Если можно оценить подинтегральный в разнесенных точках неодинакова, то другие методы , такие как гауссовая квадратура и Clenshaw-Curtis квадратура , как правило , более точные.
Метод назван в честь Вернера Ромберга (1909–2003), опубликовавшего метод в 1955 году.
Метод [ править ]
С использованием
метод может быть определен индуктивно следующим образом:
или же
где и . В нотации большой буквы O ошибка для R ( n , m ) равна ( Мысовских, 2002 ) :
Нулевая экстраполяция R ( n , 0) эквивалентна правилу трапеций с 2 n + 1 точкой; первая экстраполяция R ( n , 1) эквивалентна правилу Симпсона с 2 n + 1 баллами. Вторая экстраполяция, R ( n , 2), эквивалентна правилу Буля с 2 n +1 балл. Дальнейшие экстраполяции отличаются от формул Ньютона-Котеса. В частности, дальнейшие экстраполяции Ромберга очень незначительно расширяют правило Буля, изменяя веса в соотношения, подобные как в правиле Буля. Напротив, дальнейшие методы Ньютона-Котеса производят все более разные веса, что в конечном итоге приводит к большим положительным и отрицательным весам. Это свидетельствует о том, что методы Ньютона-Котеса с интерполяцией полиномов большой степени не могут сходиться для многих интегралов, в то время как интегрирование Ромберга более стабильно.
Когда вычисления функций дороги, может быть предпочтительнее заменить полиномиальную интерполяцию Ричардсона рациональной интерполяцией, предложенной Bulirsch & Stoer (1967) .
Геометрический пример [ править ]
Чтобы оценить площадь под кривой, правило трапеции применяется сначала к цельному элементу, затем к двум, затем к четырем и так далее.
После получения оценок по правилу трапеций применяется экстраполяция Ричардсона .
- Для первой итерации двухчастные и однократные оценки используются в формуле (4 × (более точная) - (менее точная)) / 3. Затем та же формула используется для сравнения четырехчастной и двухчастной оценки, а также аналогичным образом. для высших оценок
- Для второй итерации значения первой итерации используются в формуле (16 (более точная) - менее точная)) / 15
- Третья итерация использует следующую степень 4: (64 (более точная) - менее точная)) / 63 для значений, полученных во второй итерации.
- Схема продолжается до тех пор, пока не будет одна оценка.
Количество штук | Оценки трапеции | Первая итерация | Вторая итерация | Третья итерация |
---|---|---|---|---|
(4 MA - LA) / 3 * | (16 MA - LA) / 15 | (64 MA - LA) / 63 | ||
1 | 0 | (4 × 16-0) / 3 = 21,333 ... | (16 × 34,667 - 21,333) / 15 = 35,556 ... | (64 × 42,489 - 35,556) / 63 = 42,599 ... |
2 | 16 | (4 × 30 - 16) / 3 = 34,666 ... | (16 × 42 - 34,667) / 15 = 42,489 ... | |
4 | 30 | (4 × 39 - 30) / 3 = 42 | ||
8 | 39 |
- MA означает более точный, LA означает менее точный
Пример [ править ]
Например, функция Гаусса интегрируется от 0 до 1, т.е. функция ошибок erf (1) ≈ 0,842700792949715. Треугольный массив вычисляется построчно, и вычисление прекращается, если две последние записи в последней строке отличаются менее чем на 10 −8 .
0,77174333 0,82526296 0,84310283 0,83836778 0,84273605 0,84271160 0,84161922 0,84270304 0,84270083 0,84270066 0,84243051 0,84270093 0,84270079 0,84270079 0,84270079
Результат в правом нижнем углу треугольного массива соответствует показанным цифрам. Примечательно, что этот результат получен из менее точных приближений, полученных с помощью правила трапеции в первом столбце треугольного массива.
Реализация [ править ]
Вот пример компьютерной реализации метода Ромберга (на языке программирования Си ).
#include <stdio.h>#include <math.h>void dump_row ( size_t i , double * R ) { printf ( "R [% 2zu] =" , i ); для ( size_t j = 0 ; j <= i ; ++ j ) { printf ( "% f" , R [ j ]); } printf ( " \ п " ); }double romberg ( double ( * f / * функция для интегрирования * / ) ( double ), double / * нижний предел * / a , double / * верхний предел * / b , size_t max_steps , double / * желаемая точность * / acc ) { двойной R1 [ max_steps ], R2 [ max_steps ]; // буферизует двойной * Rp = & R1 [ 0 ], * Rc = & R2 [ 0 ]; // Rp - предыдущая строка, Rc - текущая строка double h = ( b - a ); // размер шага Rp [ 0 ] = ( f ( a ) + f ( b )) * h * .5 ; // первая трапециевидная ступенька dump_row ( 0 , Rp ); for ( size_t i = 1 ; i < max_steps ; ++ i ) { h / = 2 .; двойной c = 0 ; size_t ep = 1 << ( i -1 ); // 2 ^ (n-1) for ( size_t j = 1 ; j <= ep ; ++ j ) { c + = f ( a + ( 2* j -1 ) * h ); } Rc [ 0 ] = h * c + .5 * Rp [ 0 ]; // R (i, 0) для ( size_t j = 1 ; j <= i ; ++ j ) { двойной n_k = pow ( 4 , j ); Rc [ j ] = ( n_k * Rc [ j -1 ] - Rp [ j -1 ]) / ( n_k -1 ); // вычисляем R (i, j) } // Дамп i-й строки R, R [i, i] - лучшая оценка на данный момент dump_row ( i , Rc ); if ( i > 1 && fabs ( Rp [ i -1 ] - Rc [ i ]) < acc ) { return Rc [ i -1 ]; } // меняем местами Rn и Rc, поскольку нам нужна только последняя строка double * rt = Rp ; Rp = Rc ; Rc = rt ; } return Rp [ max_steps -1 ]; // возвращаем наше лучшее предположение }
________________________________________________________
Вот пример компьютерной реализации метода Ромберга (на языке программирования javascript ).
function auto_integrator_trap_romb_hnm ( func , a , b , nmax , tol_ae , tol_rae ) // ВХОДЫ // func = интегрируемая функция // a = нижний предел интегрирования // b = верхний предел интегрирования // nmax = количество разделов, n = 2 ^ nmax // tol_ae = максимальная допустимая абсолютная приблизительная ошибка (должна быть> = 0) // tol_rae = максимальная допустимая абсолютная относительная приблизительная ошибка (должна быть> = 0) // ВЫХОДЫ // Integ_value = оценочное значение интеграла{ if ( typeof a ! == 'number' ) { throw new TypeError ( '<a> должно быть числом' ); } if ( typeof b ! == 'number' ) { throw new TypeError ( '<b> должно быть числом' ); } if (( ! Number . isInteger ( nmax )) || ( nmax < 1 )) { throw new TypeError ('<nmax> должно быть целым числом, большим или равным единице.' ); } if (( typeof tol_ae ! == 'number' ) || ( tol_ae < 0 )) { throw new TypeError ( '<tole_ae> должно быть числом больше или равным нулю' ); } if (( typeof tol_rae ! == 'number' ) || ( tol_rae <= 0 )) { throw new TypeError ('<tole_ae> должно быть числом больше или равным нулю' ); } var h = b - a // инициализируем матрицу, в которой хранятся значения интегралавар Ромб = []; // строки для ( var i = 0 ; i < nmax + 1 ; i ++ ) { Romb . push ([]); для ( var j = 0 ; j < nmax + 1 ; j ++ ) { Romb [ i ]. толчок ( математика . bignumber ( 0 )); } }// вычисление значения по односегментной трапециевидной линейке Romb [ 0 ] [ 0 ] = 0,5 * h * ( func ( a ) + func ( b )) var integ_val = Romb [ 0 ] [ 0 ]for ( var i = 1 ; i <= nmax ; i ++ ) // обновление значения с удвоением количества сегментов // с использованием только тех значений, где они должны быть вычислены // См. https://autarkaw.org / 2009/02/28 / эффективная-формула-для-автоматического интегратора на основе правила трапеции / { h = 0,5 * h var inte = 0 для ( var j = 1 ; j <= 2 ** i - 1 ; j+ = 2 ) { var inte = inte + func ( a + j * h ) }Romb [ i ] [ 0 ] = 0,5 * Romb [ i - 1 ] [ 0 ] + integer * h // Использование метода Ромберга для вычисления следующего экстраполируемого значения // См. Https://young.physics.ucsc.edu/115/ romberg.pdf для ( k = 1 ; k <= i ; k ++ ) { var addterm = Romb [ i ] [ k - 1 ] - Romb [i - 1 ] [ k - 1 ] addterm = addterm / ( 4 ** k - 1.0 ) Ромб [ i ] [ k ] = Ромб [ i ] [ k - 1 ] + addterm// Расчет абсолютной приблизительной погрешности var Ea = math . abs ( Ромб [ i ] [ k ] - Ромб [ i ] [ k - 1 ])// Расчет абсолютной относительной приблизительной погрешности var epsa = math . абс ( Ea / Romb [ i ] [ k ]) * 100,0// Присваиваем самое последнее значение возвращаемой переменной inte_val = Romb [ i ] [ k ]// возвращаем значение, если соблюдается любой из допусков if (( epsa < tol_rae ) || ( Ea < tol_ae )) { return ( integ_val ) } } } // возвращаем последнее вычисленное значение интеграла независимо от того, соблюден допуск или нет return ( inte_val ) }
Ссылки [ править ]
- Ричардсон, Л.Ф. (1911), "Приближенное арифметическое решение конечными разностями физических задач, связанных с дифференциальными уравнениями, с приложением к напряжениям в каменной дамбе", Философские труды Королевского общества A , 210 (459–470): 307 -357, DOI : 10.1098 / rsta.1911.0009 , JSTOR 90994
- Ромберг, В. (1955), "Vereinfachte numerische Integration", Det Kongelige Norske Videnskabers Selskab Forhandlinger , Тронхейм, 28 (7): 30–36.
- Тэчер младший, Генри С. (июль 1964), "Замечание об алгоритме 60: Ромберга интеграции" , коммуникаций ACM , 7 (7): 420-421, DOI : 10,1145 / 364520,364542
- Бауэр, Флорида; Rutishauser, H .; Штифель, Э. (1963), Метрополис, Северная Каролина; и другие. (ред.), «Новые аспекты в числовой квадратуре», Экспериментальная арифметика, высокоскоростные вычисления и математика, Труды симпозиумов по прикладной математике , AMS (15): 199–218
- Булирш, Роланд; Stoer, Йозеф (1967), "Справочник по серии Численное интегрирование Численное квадратурной экстраполяцией." , Numerische Mathematik , 9 : 271-278, DOI : 10.1007 / bf02162420
- Мысовских, И.П. (2002) [1994], "Метод Ромберга" , в Hazewinkel, Michiel (ed.), Encyclopedia of Mathematics , Springer-Verlag , ISBN 1-4020-0609-8
- Нажмите, WH; Теукольский, С.А. Феттерлинг, Вашингтон; Фланнери, Б.П. (2007), «Раздел 4.3. Интеграция Ромберга» , Численные рецепты: Искусство научных вычислений (3-е изд.), Нью-Йорк: Cambridge University Press, ISBN 978-0-521-88068-8
Внешние ссылки [ править ]
- ROMBINT - код для MATLAB (автор: Мартин Каценак)
- Бесплатный онлайн-инструмент интеграции с использованием методов Ромберга, Фокса – Ромберга, Гаусса – Лежандра и других численных методов.
- SciPy реализация метода Ромберга