stringtranslate.com

Метод Мюллера

Метод Мюллера — это алгоритм нахождения корня , численный метод решения уравнений вида f ( x ) = 0. Впервые он был представлен Дэвидом Э. Мюллером в 1956 году.

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

Рекуррентное соотношение

Метод Мюллера — это рекурсивный метод, который генерирует новое приближение корня ξ функции f на каждой итерации, используя три предыдущих итерации. Начиная с трех начальных значений x 0 , x −1 и x −2 , первая итерация вычисляет приближение x 1 с использованием этих трех, вторая итерация вычисляет приближение x 2 с использованием x 1 , x 0 и x −1 , третья итерация вычисляет приближение x 3 с использованием x 2 , x 1 и x 0 , и так далее: k итерация генерирует приближение x k с использованием x k-1 , x k-2 и x k-3 . Каждая итерация принимает в качестве входных данных последние три сгенерированных приближения и значение f при этих приближениях: значения x k -1 , x k -2 и x k -3 и значения функции f ( x k -1 ), f ( x k -2 ) и f ( x k -3 ). Приближение x k вычисляется следующим образом из этих шести значений.

Сначала парабола y k ( x ) строится путем интерполяции через три точки ( x k -1f ( x k -1 )), ( x k -2f ( x k -2 )) и ( x k -3f ( x k -3 )) с использованием полинома Ньютона . y k ( x ) равен

где f [ x k -1 , x k -2 ] и f [ x k -1 , x k -2 , x k -3 ] обозначают разделенные разности . Это можно переписать как

где

Итерация x k затем задается как решение квадратного уравнения y k ( x ) = 0, ближайшее к x k -1 . В целом это подразумевает общее нелинейное рекуррентное соотношение третьего порядка [1]

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

Обратите внимание, что x k может быть комплексным, даже если все предыдущие итерации были действительными. Это контрастирует с другими алгоритмами поиска корней, такими как метод секущих , обобщенный метод секущих Сиди или метод Ньютона , чьи итерации останутся действительными, если начать с действительных чисел. Наличие комплексных итераций может быть преимуществом (если ищутся комплексные корни) или недостатком (если известно, что все корни действительны), в зависимости от задачи.

Скорость сближения

Для хорошо ведущих себя функций порядок сходимости метода Мюллера составляет приблизительно 1,84 и точно равен постоянной трибоначчи . Это можно сравнить с приблизительно 1,62, точно золотым сечением , для метода секущих и точно 2 для метода Ньютона . Таким образом, метод секущих дает меньший прогресс за итерацию, чем метод Мюллера, а метод Ньютона дает больший прогресс.

Точнее, если ξ обозначает единственный корень f (то есть f (ξ) = 0 и f '(ξ) ≠ 0), f трижды непрерывно дифференцируема, а начальные приближения x 0 , x 1 и x 2 взяты достаточно близко к ξ, то итерации удовлетворяют

где μ ≈ 1,84 — положительное решение уравнения , определяющего константу трибоначчи.

Обобщения и родственные методы

Метод Мюллера подгоняет параболу, т. е. многочлен второго порядка , к последним трем полученным точкам f ( x k -1 ), f ( x k -2 ) и f ( x k -3 ) в каждой итерации. Можно обобщить это и подгонять многочлен p k,m ( x ) степени m к последним m +1 точкам в k итерации. Наша парабола y k записывается как p k ,2 в этой нотации. Степень m должна быть 1 или больше. Следующее приближение x k теперь является одним из корней p k,m , т. е. одним из решений p k,m ( x )=0. Взяв m = 1, мы получаем метод секущих, тогда как m = 2 дает метод Мюллера.

Мюллер вычислил, что последовательность { x k }, сгенерированная таким образом, сходится к корню ξ с порядком μ m , где μ m — положительное решение уравнения .

Однако этот метод гораздо сложнее для m >2, чем для m =1 или m =2, поскольку гораздо сложнее определить корни многочлена степени 3 или выше. Другая проблема заключается в том, что, по-видимому, нет предписания, какой из корней p k,m выбрать в качестве следующего приближения x k для m >2.

Эти трудности преодолеваются обобщенным методом секущих Сиди , который также использует многочлен p k,m . Вместо того, чтобы пытаться решить p k,m ( x )=0, следующее приближение x k вычисляется с помощью производной p k,m при x k -1 в этом методе.

Пример расчета

Ниже метод Мюллера реализован на языке программирования Python . Затем он применяется для нахождения корня функции f ( x ) = x 2 − 612 .

из  ввода  import  * из  cmath  import  sqrt  # Используйте комплексный sqrt, так как мы можем генерировать комплексные числаNum  =  Union [ float ,  complex ] Func  =  Callable [[ Num ],  Num ]def  div_diff ( f :  Func ,  xs :  list [ Num ]): """Вычислить разделенную разность f[x0, x1, ...].""" if len ( xs ) == 2 : a , b = xs return ( f ( a ) - f ( b )) / ( a - b ) else : return ( div_diff ( f , xs [ 1 :]) - div_diff ( f , xs [ 0 : - 1 ])) / ( xs [ - 1 ] - xs [ 0 ])                            def  mullers_method ( f :  Func ,  xs :  ( Num ,  Num ,  Num ),  iterations :  int )  ->  float : """Возвращает корень, вычисленный с помощью метода Мюллера.""" x0 , x1 , x2 = xs for _ in range ( iterations ): w = div_diff ( f , ( x2 , x1 )) + div_diff ( f , ( x2 , x0 )) - div_diff ( f , ( x2 , x1 )) s_delta = sqrt ( w ** 2-4 * f ( x2 ) * div_diff ( f , ( x2 , x1 , x0 ) )) denoms = [ w + s_delta , w - s_delta ] # Берем знаменатель большей величины x3 = x2-2 * f ( x2 ) / max ( denoms , key = abs ) # Продвижение x0 , x1 , x2 = x1 , x2 , x3 возврат x3                                                                  def  f_example ( x :  Num )  ->  Num : """Пример функции. При использовании более дорогой функции может быть полезно запоминание последних 4 вызванных точек.""" return x ** 2 - 612       root  =  mullers_method ( f_example ,  ( 10 ,  20 ,  30 ),  5 ) print ( "Корень: {} " . format ( root ))  # Корень: (24.738633317099097+0j)

Смотрите также

Ссылки

  1. ^ Мюллер, Дэвид Э. (1956). «Метод решения алгебраических уравнений с использованием автоматического компьютера». Математические таблицы и другие вспомогательные средства для вычислений . 10 (56): 208–215. doi : 10.1090/S0025-5718-1956-0083822-0 . JSTOR  2001916. MR  0083822.

Дальнейшее чтение