stringtranslate.com

El método de Brent.

En análisis numérico , el método de Brent es un algoritmo híbrido de búsqueda de raíces que combina el método de bisección , el método de la secante y la interpolación cuadrática inversa . Tiene la confiabilidad de la bisección pero puede ser tan rápido como algunos de los métodos menos confiables. El algoritmo intenta utilizar el método secante potencialmente de rápida convergencia o la interpolación cuadrática inversa si es posible, pero recurre al método de bisección más robusto si es necesario. El método de Brent se debe a Richard Brent [1] y se basa en un algoritmo anterior de Theodorus Dekker . [2] En consecuencia, el método también se conoce como método de Brent-Dekker .

Las mejoras modernas al método de Brent incluyen el método de Chandrupatla , que es más simple y rápido para funciones que son planas alrededor de sus raíces; [3] [4] Método de Ridders , que realiza interpolaciones exponenciales en lugar de cuadráticas y proporciona una fórmula cerrada más simple para las iteraciones; y el método ITP , que es un híbrido entre regula-falsi y bisección que logra garantías óptimas en el peor de los casos y asintóticas.

El método de Dekker.

La idea de combinar el método de la bisección con el método de la secante se remonta a Dekker (1969).

Supongamos que queremos resolver la ecuación f ( x ) = 0. Al igual que con el método de bisección, necesitamos inicializar el método de Dekker con dos puntos, digamos a 0 y b 0 , tales que f ( a 0 ) y f ( b 0 ) tienen signos opuestos. Si f es continua en [ a 0 , b 0 ], el teorema del valor intermedio garantiza la existencia de una solución entre a 0 y b 0 .

En cada iteración intervienen tres puntos:

Se calculan dos valores provisionales para la siguiente iteración. El primero viene dado por interpolación lineal, también conocido como método de la secante:

y el segundo está dado por el método de la bisección

Si el resultado del método secante, s , se encuentra estrictamente entre b k y m , entonces se convierte en la siguiente iteración ( b k +1 = s ); de lo contrario, se utiliza el punto medio ( b k +1 = m ).

Luego, el valor del nuevo contrapunto se elige de manera que f ( a k +1 ) y f ( b k +1 ) tengan signos opuestos. Si f ( a k ) y f ( b k +1 ) tienen signos opuestos, entonces el contrapunto sigue siendo el mismo: a k +1 = a k . De lo contrario, f ( b k +1 ) y f ( b k ) tienen signos opuestos, por lo que el nuevo contrapunto se convierte en a k +1 = b k .

Finalmente, si | f ( ak +1 ) | < | f ( b k +1 )|, entonces a k +1 es probablemente una mejor suposición para la solución que b k +1 y, por lo tanto, se intercambian los valores de a k +1 y b k +1 .

Esto finaliza la descripción de una única iteración del método de Dekker.

El método de Dekker funciona bien si la función f se comporta razonablemente bien. Sin embargo, hay circunstancias en las que cada iteración emplea el método secante, pero las iteraciones b k convergen muy lentamente (en particular, | b kb k −1 | puede ser arbitrariamente pequeño). En este caso, el método de Dekker requiere muchas más iteraciones que el método de bisección.

El método de Brent.

Brent (1973) propuso una pequeña modificación para evitar el problema del método de Dekker. Inserta una prueba adicional que debe cumplirse antes de que se acepte el resultado del método secante como la siguiente iteración. Deben satisfacerse simultáneamente dos desigualdades:

Dada una tolerancia numérica específica , si en el paso anterior se utilizó el método de bisección, la desigualdad debe cumplirse para realizar la interpolación; de lo contrario, se realiza el método de bisección y su resultado se utiliza para la siguiente iteración.

Si el paso anterior realizó la interpolación, entonces la desigualdad se usa para realizar la siguiente acción (para elegir) la interpolación (cuando la desigualdad es verdadera) o el método de bisección (cuando la desigualdad no es verdadera).

Además, si en el paso anterior se utilizó el método de bisección, la desigualdad debe cumplirse; de ​​lo contrario, se realiza el método de bisección y su resultado se utiliza para la siguiente iteración. Si el paso anterior realizó una interpolación, entonces se utiliza la desigualdad.

Esta modificación garantiza que en la k-ésima iteración, se realizará un paso de bisección en como máximo iteraciones adicionales, porque las condiciones anteriores obligan a que los tamaños de paso de interpolación consecutivos se reduzcan a la mitad cada dos iteraciones, y después de como máximo las iteraciones, el tamaño del paso será menor que , que invoca un paso de bisección. Brent demostró que su método requiere como máximo N 2 iteraciones, donde N denota el número de iteraciones para el método de bisección. Si la función f se comporta bien, entonces el método de Brent generalmente procederá mediante interpolación cuadrática inversa o lineal, en cuyo caso convergerá de forma superlineal .

Además, el método de Brent utiliza interpolación cuadrática inversa en lugar de interpolación lineal (como la que utiliza el método de la secante). Si f ( b k ), f ( a k ) y f ( b k −1 ) son distintos, aumenta ligeramente la eficiencia. Como consecuencia, la condición para aceptar s (el valor propuesto por interpolación lineal o interpolación cuadrática inversa) debe cambiarse: s debe estar entre (3 a k + b k ) / 4 y b k .

Algoritmo

ingrese  a , b y (un puntero a) una función para f
calcule f ( a )calcular f ( b ) si  f ( a ) f ( b ) ≥ 0 entonces  Salir de la función porque la raíz no está entre corchetes.terminar si si | f ( a )| < | f ( segundo )| luego intercambie ( a , b ) finalice si c  : = a set mflag repita hasta  f ( b o s ) = 0 o | segundo - un | es lo suficientemente pequeño (convergencia)  si  f ( a ) ≠ f ( c ) y  f ( b ) ≠ f ( c ) entonces  ( interpolación cuadrática inversa ) de lo contrario ( método secante ) termina si si (condición 1) s no está entre y b o (condición 2) (mflag está establecido y | sb | ≥ | bc |/2) o (condición 3) (mflag está desactivado y | sb | ≥ | cd |/2) o ( condición 4) (mflag está establecido y | bc | < | δ |) o (condición 5) (mflag está borrado y | cd | < | δ |) entonces ( método de bisección ) establece mflag ; de lo contrario, borra mflag end si calcular f ( s ) d  := c (d se asigna por primera vez aquí; no se usará arriba en la primera iteración porque mflag está configurado) c  := b si f ( a ) f ( s ) < 0 entonces b  := s else a  := s final si si | f ( a )| < |                                    f ( segundo )| luego intercambie ( a , b ) final si final repite la salida  b  o s (devuelve la raíz)

Ejemplo

Supongamos que buscamos un cero de la función definida por f ( x ) = ( x + 3)( x − 1) 2 .

Tomamos [ a 0 , b 0 ] = [−4, 4/3] como nuestro intervalo inicial.

Tenemos f ( a 0 ) = −25 y f ( b 0 ) = 0.48148 (todos los números en esta sección están redondeados), por lo que las condiciones f ( a 0 ) f ( b 0 ) < 0 y | f ( segundo 0 )| ≤ | f ( un 0 )| estan satisfechos.

Gráfica de f ( x ) = ( x + 3)( x − 1) 2
  1. En la primera iteración, usamos interpolación lineal entre ( b −1 , f ( b −1 )) = ( a 0 , f ( a 0 )) = (−4, −25) y ( b 0 , f ( b 0 )) = (1,33333, 0,48148), lo que produce s = 1,23256. Este se encuentra entre (3 a 0 + b 0 ) / 4 y b 0 , por lo que se acepta este valor. Además, f (1,23256) = 0,22891, por lo que establecemos a 1 = a 0 y b 1 = s = 1,23256.
  2. En la segunda iteración, usamos interpolación cuadrática inversa entre ( a 1 , f ( a 1 )) = (−4, −25) y ( b 0 , f ( b 0 )) = (1.33333, 0.48148) y ( b 1 , f ( segundo 1 )) = (1,23256, 0,22891). Esto produce 1,14205, que se encuentra entre (3 a 1 + b 1 ) / 4 y b 1 . Además, la desigualdad |1.14205 − b 1 | ≤ | segundo 0 - segundo -1 | /2 se cumple, por lo que se acepta este valor. Además, f (1,14205) = 0,083582, por lo que establecemos a 2 = a 1 y b 2 = 1,14205.
  3. En la tercera iteración, usamos interpolación cuadrática inversa entre ( a 2 , f ( a 2 )) = (−4, −25) y ( b 1 , f ( b 1 )) = (1.23256, 0.22891) y ( b 2 , f ( segundo 2 )) = (1,14205, 0,083582). Esto produce 1,09032, que se encuentra entre (3 a 2 + b 2 ) / 4 y b 2 . Pero aquí entra en juego la condición adicional de Brent: la desigualdad |1.09032 − b 2 | ≤ | segundo 1 - segundo 0 | /2 no se cumple, por lo que se rechaza este valor. En cambio, se calcula el punto medio m = −1,42897 del intervalo [ a 2 , b 2 ]. Tenemos f ( m ) = 9,26891, por lo que establecemos a 3 = a 2 y b 3 = −1,42897.
  4. En la cuarta iteración, usamos interpolación cuadrática inversa entre ( a 3 , f ( a 3 )) = (−4, −25) y ( b 2 , f ( b 2 )) = (1.14205, 0.083582) y ( b 3 , f ( segundo 3 )) = (−1,42897, 9,26891). Esto produce 1,15448, que no está en el intervalo entre (3 a 3 + b 3 ) / 4 y b 3 ). Por tanto, se reemplaza por el punto medio m = −2,71449. Tenemos f ( m ) = 3,93934, por lo que establecemos a 4 = a 3 y b 4 = −2,71449.
  5. En la quinta iteración, la interpolación cuadrática inversa produce −3,45500, que se encuentra en el intervalo requerido. Sin embargo, la iteración anterior fue un paso de bisección, por lo que la desigualdad |−3.45500 − b 4 | ≤ | segundo 4 - segundo 3 | / 2 necesitan estar satisfechos. Esta desigualdad es falsa, por lo que usamos el punto medio m = −3,35724. Tenemos f ( m ) = −6.78239, por lo que m se convierte en el nuevo contrapunto ( a 5 = −3.35724) y la iteración sigue siendo la misma ( b 5 = b 4 ).
  6. En la sexta iteración, no podemos usar la interpolación cuadrática inversa porque b 5 = b 4 . Por lo tanto, usamos interpolación lineal entre ( a 5 , f ( a 5 )) = (−3.35724, −6.78239) y ( b 5 , f ( b 5 )) = (−2.71449, 3.93934). El resultado es s = −2,95064, que satisface todas las condiciones. Pero como la iteración no cambió en el paso anterior, rechazamos este resultado y volvemos a la bisección. Actualizamos s = -3,03587 y f ( s ) = -0,58418.
  7. En la séptima iteración, podemos volver a utilizar la interpolación cuadrática inversa. El resultado es s = −3,00219, que satisface todas las condiciones. Ahora, f ( s ) = −0.03515, entonces establecemos a 7 = b 6 y b 7 = −3.00219 ( a 7 y b 7 se intercambian de modo que la condición | f ( b 7 )| ≤ | f ( a 7 ) | está satisfecho). ( Correcto  : interpolación lineal )
  8. En la octava iteración, no podemos usar la interpolación cuadrática inversa porque a 7 = b 6 . La interpolación lineal produce s = −2,99994, lo cual se acepta. ( Correcto  : )
  9. En las siguientes iteraciones, la raíz x = −3 se aproxima rápidamente: b 9 = −3 + 6·10 −8 y b 10 = −3 − 3·10 −15 . ( Correcto  : Iter 9: f ( s ) = −1,4 × 10 −7 , Iter 10: f ( s ) = 6,96 × 10 −12 )

Implementaciones

Referencias

  1. ^ Brent 1973
  2. ^ Dekker 1969
  3. ^ Chandrupatla, Tirupathi R. (1997). "Un nuevo algoritmo híbrido cuadrático/bisección para encontrar el cero de una función no lineal sin utilizar derivadas". Avances en software de ingeniería . 28 (3): 145-149. doi :10.1016/S0965-9978(96)00051-8.
  4. ^ "Diez pequeños algoritmos, parte 5: interpolación de extremos cuadráticos y método de Chandrupatla - Jason Sachs".

Otras lecturas

enlaces externos