En análisis numérico y computación científica , los métodos de Gauss-Legendre son una familia de métodos numéricos para ecuaciones diferenciales ordinarias . Los métodos de Gauss-Legendre son métodos implícitos de Runge-Kutta . Más específicamente, son métodos de colocación basados en los puntos de cuadratura de Gauss-Legendre . El método de Gauss-Legendre basado en puntos s tiene un orden de 2 s . [1]
Todos los métodos de Gauss-Legendre son A-estables . [2]
El método de Gauss-Legendre de orden dos es la regla implícita del punto medio . Su cuadro de Butcher es:
1/2 1/2 1
El método de Gauss-Legendre de orden cuatro tiene un cuadro de Butcher:
El método de Gauss-Legendre de orden seis tiene un cuadro de Butcher:
El costo computacional de los métodos de Gauss-Legendre de orden superior suele ser excesivo y, por lo tanto, rara vez se utilizan. [3]
Intuición
Los métodos de Gauss-Legendre se utilizan para resolver cualquier ecuación diferencial ordinaria de la forma, dónde hay algún vector en . La idea intuitiva es tomar la identidad exactay aproximar la integral del lado derecho con la cuadratura gaussiana . Por ejemplo, usar una cuadratura de dos puntos da la aproximación
.
Desafortunadamente, se necesitan más aproximaciones, ya que el lado derecho todavía es imposible de evaluar con exactitud. Buscamos una aproximación de Runge-Kutta paraevaluado en estos momentos. Dejar y Sea abreviado para estos dos puntos de cuadratura.
Aquí . Esta es una restricción implícita que debe resolverse mediante un algoritmo de búsqueda de raíces como el método de Newton . Los valores de los parámetros de Runge-Kuttapuede determinarse a partir de una expansión de la serie de Taylor en. El esquema resultante es el método de cuarto orden.
Un ejemplo practico
Los métodos de Gauss-Legendre son implícitos, por lo que en general no se pueden aplicar con exactitud. En cambio, uno hace una conjetura, y luego usa el método de Newton para converger arbitrariamente cerca de la solución verdadera. A continuación se muestra una función de Matlab que implementa el método de Gauss-Legendre de orden cuatro.
%punto de partidax = [ 10,5440 ; 4,1124 ; 35,8233 ]; dt = 0,01 ; N = 10000 ;x_series = [ x ]; para i = 1 : N x = paso_gauss ( x , @ dinámica_lorenz , dt , 1e-7 , 1 , 100 ); x_series = [ x_series x ]; finalplot3 ( x_series ( 1 , :), x_series ( 2 , :), x_series ( 3 , :) ); set ( gca , 'xtick' , [], 'ytick' , [], 'ztick' , []);título ( 'Atractor de Lorenz' );volver ;función [td, j] = lorenz_dynamics ( estado ) % devuelve una derivada de tiempo y una derivada jacobiana de esa derivada de tiempo x = estado ( 1 ); y = estado ( 2 ); z = estado ( 3 ); sigma = 10 ; beta = 8 / 3 ; rho = 28 ; td = [ sigma * ( y - x ); x * ( rho - z ) - y ; x * y - beta * z ]; j = [ - sigma , sigma , 0 ; rho - z , - 1 , - x ; y , x , - beta ]; finalfunción x_next = gauss_step ( x, dinámica, dt, umbral, amortiguación, max_iteraciones ) [ d , ~ ] = tamaño ( x ); sq3 = sqrt ( 3 ); si amortiguamiento > 1 || amortiguación <= 0 error ( 'la amortiguación debe estar entre 0 y 1' ) end % Utilice pasos de Euler explícitos como conjeturas iniciales [ k , ~ ] = dinámica ( x ); x1_guess = x + ( 1 / 2 - SQ3 / 6 ) * dt * k ; x2_guess = x + ( 1 / 2 + SQ3 / 6 ) * dt * k ; [ k1 , ~ ] = dinámica ( x1_guimiento ); [ k2 , ~ ] = dinámica ( x2_guimiento ); a11 = 1 / 4 ; a12 = 1 / 4 - SQ3 / 6 ; a21 = 1 / 4 + SQ3 / 6 ; a22 = 1 / 4 ; error = @ ( k1 , k2 ) [ k1 - dinámica ( x + ( a11 * k1 + a12 * k2 ) * dt ); k2 - dinámica ( x + ( a21 * k1 + a22 * k2 ) * dt ) ]; er = error ( k1 , k2 ); iteración = 1 ; while ( norma ( er ) > umbral && iteración < max_iterations ) fprintf ( 'iteración de Newton% d: el error es% f. \ n' , iteración , norma ( er ) ); iteración = iteración + 1 ; [ ~ , j1 ] = dinámica ( x + ( a11 * k1 + a12 * k2 ) * dt ); [ ~ , j2 ] = dinámica ( x + ( a21 * k1 + a22 * k2 ) * dt ); j = [ ojo ( d ) - dt * a11 * j1 , - dt * a12 * j1 ; - dt * a21 * j2 , ojo ( d ) - dt * a22 * j2 ]; k_next = [ k1 ; k2 ] - amortiguamiento * linsolve ( j , er ); k1 = k_siguiente ( 1 : d ); k2 = k_siguiente ( d + ( 1 : d )); er = error ( k1 , k2 ); final if norm ( er ) > error de umbral ( 'Newton no convergió en% d iteraciones.' , max_iterations ); final x_siguiente = x + dt / 2 * ( k1 + k2 ); final
Este algoritmo es sorprendentemente económico. El error en puede caer debajo en tan solo 2 pasos de Newton. El único trabajo adicional en comparación con los métodos explícitos de Runge-Kutta es el cálculo del jacobiano.
Notas
- ^ Iserles 1996 , p. 47
- ^ Iserles 1996 , p. 63
- ^ Iserles 1996 , p. 47
Referencias
- Iserles, Arieh (1996), Un primer curso en el análisis numérico de ecuaciones diferenciales , Cambridge University Press , ISBN 978-0-521-55655-2.