Gauss-Legendre-metoden

Inom numerisk analys och vetenskaplig beräkning är Gauss-Legendre-metoderna en familj av numeriska metoder för vanliga differentialekvationer . Gauss-Legendre-metoder är implicita Runge-Kutta-metoder . Mer specifikt är de samlokaliseringsmetoder baserade på punkterna i Gauss–Legendre-kvadraturen . Gauss-Legendre-metoden baserad på s poäng har ordningen 2 s .

Alla Gauss-Legendre-metoder är A-stabila .

Gauss-Legendre-metoden av ordning två är den implicita mittpunktsregeln . Dess Butcher-tablå är:

1/2 1/2
1

Gauss-Legendre-metoden av ordning fyra har Butcher-tableau:

Gauss-Legendre-metoden för ordning sex har Butcher-tableau:

Beräkningskostnaden för Gauss-Legendre-metoder av högre ordning är vanligtvis överdriven, och därför används de sällan.

Intuition

Gauss-Legendre Runge-Kutta (GLRK) metoder löser en vanlig differentialekvation med . Det utmärkande för GLRK är uppskattningen av med Gaussisk kvadratur .

,

där är de samplade hastigheterna, är kvadraturvikterna , är abskissorna, och är rötterna av Legendre-polynomet av grad . En ytterligare approximation behövs, eftersom fortfarande är omöjlig att utvärdera. För att bibehålla trunkeringsfel av ordning behöver vi bara för att beställa . Runge-Kuttas implicita definition anropas för att åstadkomma detta. Detta är en implicit begränsning som måste lösas med en rothittande algoritm som Newtons metod . Värdena för Runge-Kutta-parametrarna kan bestämmas från en Taylor-serieexpansion i .

Praktiskt exempel

Gauss-Legendre-metoderna är implicita, så i allmänhet kan de inte tillämpas exakt. Istället gör man en kvalificerad gissning av , och använder sedan Newtons metod för att konvergera godtyckligt nära den sanna lösningen. Nedan finns en Matlab-funktion som implementerar Gauss-Legendre-metoden i ordning fyra.


     

  
  
  
   
         
     


    




 
  
    
    
    

    
     
      

      

      0
          
          


   
    
    
         0
    
  

  
    
      
      
    
    

    
      
      
    

           
     
  
         
       
        
   
       
       
   
         
            
    
           
      
      
   
       
  
     
     
  
            
 % startpunkt  x  =  [  10,5440  ;  4,1124  ;  35,8233  ];  dt  =  0,01  ;  N  =  10000  ;  x_serie  =  [  x  ];  för  i  =  1  :  Nx  =  gauss_steg  (  x  ,  @  lorenz_dynamics  ,  dt  ,  1e-7  ,  1  ,  100  )  ;  x_serie  =  [  x_serie  x  ];  slutplot3  (  x_series  (  1  ,:),  x_series  (  2  ,  :),  x_series  (  3  ,:)  );  set  (  gca  ,  'xtick'  ,[],  'ytick'  ,[],  'ztick'  ,[]);  titel  (  'Lorenz Attractor'  );  återvända  ;  funktion  [td, j] = lorenz_dynamics  (  tillstånd  )  % returnerar en tidsderivata och en jakobisk av den tidsderivatan  x  =  tillstånd  (  1  );  y  =  tillstånd  (  2  );  z  =  tillstånd  (  3  );  sigma  =  10  ;  beta  =  8/3  ;  _  _  rho  =  28  ;  td  =  [  sigma  *  (  y  -  x  );  x  *  (  rho  -  z  )  -y  ;  _  x  *  y  -  beta  *  z  ];  j  =  [  -  sigma  ,  sigma  ,  ;  rho  -  z  ,  -1  ,  -x  ;  _  _  y  ,  x  ,  -  beta  ];  slutfunktion  x_next  =  gauss_step  ( x, dynamik, dt   ,  tröskel, dämpning, max_iterationer  )  [  d  ,  ~  ]  =  storlek  (  x  );  sq3  =  sqrt  (  3  );  om  dämpning  >  1  ||  dämpning  <=  fel  (  'dämpningen bör vara mellan 0 och 1.' )  slut  %  Använd explicita Euler-steg som initiala gissningar  [  k  ,  ~  ]  =  dynamik  (  x  );  x1_guess  =  x  +  (  1  /  2  -  sq3  /  6  )  *  dt  *  k  ;  x2_guess  =  x  +  (  1  /  2  +  sq3  /  6  )  *  dt  *  k  ;  [  k1  ,  ~  ]  =  dynamik  (  x1_guess  );  [  k2  ,  ~  ]  =  dynamik  (  x2_guess  );  a11  =  1/4  ;  _  _  a12  =  1/4  -  sq3  /  6  ;  _  _  a21  =  1/4  +  sq3  /  6  ;  _  _  a22  =  1/4  ;  _  _  fel  =  @(  k1  ,  k2  )  [  k1  -  dynamik  (  x  +  (  a11  *  k1  +  a12  *  k2  )  *  dt  );  k2  -  dynamik  (  x  +  (  a21  *  k1  +  a22  *  k2  )  *  dt  )];  er  =  fel  (  k1  ,  k2  );  iteration  =  1  ;  while  (  norm  (  er  )  >  tröskel  &&  iteration  <  max_iterations  )  fprintf  (  'Newton iteration %d: felet är %f.\n'  ,  iteration  ,  norm  (  er  )  );  iteration  =  iteration  +  1  ;  [  ~  ,  j1  ]  =  dynamik  (  x  +  (  a11  *  k1  +  a12  *  k2  )  *  dt  );  [  ~  ,  j2  ]  =  dynamik  (  x  +  (  a21  *  k1  +  a22  *  k2  )  *  dt  );  j  =  [  öga  (  d  )  -dt  *  a11  *  j1  ,  -dt  *  a12  *  j1  ;  _  _  -dt  *  a21  *  j2  ,  öga  (  d  )  -dt  *  a22  *  j2  ]  ;  _  k_nästa  =  [  k1  ;  k2  ]  -  dämpning  *  linsolve  (  j  ,  er  );  k1  =  k_nästa  (  1  :  d  );  k2  =  k_nästa  (  d  +  (  1  :  d  ));  er  =  fel  (  k1  ,  k2  );  end  if  norm  (  er  )  >  tröskelfel  (  'Newton konvergerade inte med %d iterationer.'  ,  max_iterations  )  ;  slut  x_next  =  x  +  dt  /  2  *  (  k1  +  k2  );  slutet 

Denna algoritm är förvånansvärt billig. Felet i kan falla under i så få som 2 Newtonsteg. Det enda extraarbetet jämfört med explicita Runge-Kutta-metoder är beräkningen av Jacobian.

En integrerad bana nära Lorenz-attraktorn.

Tidssymmetriska varianter

Till priset av att lägga till en ytterligare implicit relation kan dessa metoder anpassas för att ha tidsomkastningssymmetri. I dessa metoder används den genomsnittliga positionen istället för att bara startpositionen i vanliga Runge-Kutta-metoder. Metoden för ordning 2 är bara en implicit mittpunktsmetod.

Metoden för ordning 4 med 2 steg är som följer.

Metoden för ordning 6 med 3 steg är som följer.

Anteckningar

  •   Iserles, Arieh (1996), A First Course in the Numerical Analysis of Differential Equations , Cambridge University Press , ISBN 978-0-521-55655-2 .