Richardsons extrapolering
I numerisk analys är Richardson-extrapolering en sekvensaccelerationsmetod används för att förbättra konvergenshastigheten för en sekvens av uppskattningar av något värde h . I huvudsak, givet värdet på för flera värden på , kan vi uppskatta genom att extrapolera uppskattningarna till . Den är uppkallad efter Lewis Fry Richardson , som introducerade tekniken i början av 1900-talet, även om idén redan var känd för Christiaan Huygens i hans beräkning av π . Med Birkhoffs och Rotas ord , "kan dess användbarhet för praktiska beräkningar knappast överskattas."
Praktiska tillämpningar av Richardson-extrapolering inkluderar Romberg-integration , som tillämpar Richardson-extrapolation på trapetsregeln , och Bulirsch-Stoer-algoritmen för att lösa vanliga differentialekvationer.
Allmän formel
Notation
Låt vara en approximation av (exakt värde) som beror på en positiv stegstorlek h med en felformel i formen
där är okända konstanter och är kända konstanter så att . Dessutom representerar trunkeringsfelet för approximationen så att i A sägs vara vara en approximation.
Observera att genom att förenkla med Big O-notation är följande formler ekvivalenta:
Syfte
Richardsons extrapolering är en process som hittar en bättre approximation av genom att ändra felformeln från till Därför, genom att ersätta med trunkeringsfelet har minskat från } till för samma stegstorlek . Det allmänna mönstret uppstår där har en mer exakt uppskattning än när . Genom denna process har vi uppnått en bättre approximation av genom att subtrahera den största termen i felet som var . Denna process kan upprepas för att ta bort fler feltermer för att få ännu bättre uppskattningar.
Bearbeta
Genom att använda stegstorlekarna och för någon konstant är de två formlerna för
För att förbättra vår approximation från till genom att ta bort första feltermen multiplicerar vi den andra ekvationen (2) med och subtraherar den första ekvationen (1) för att ge oss
Återkommande förhållande
En allmän återkommande relation kan definieras för approximationerna med
där uppfyller
- .
Egenskaper
Richardson-extrapoleringen kan betraktas som en linjär sekvenstransformation .
Dessutom kan den allmänna formeln användas för att uppskatta (stegstorleksbeteende i ledande ordning för Truncation error ) när varken dess värde eller är känt a priori . En sådan teknik kan vara användbar för att kvantifiera en okänd konvergenshastighet . Givet approximationer av från tre distinkta stegstorlekar , , och , exakt förhållande
Exempel på Richardson-extrapolering
Antag att vi vill approximera , och vi har en metod som beror på en liten parameter i en sådan sätt att
Låt oss definiera en ny funktion
Sedan
Mycket ofta är det mycket lättare att få en given precision genom att använda R ( h ) snarare än A ( h′ ) med mycket mindre h′ . Där A ( h′ ) kan orsaka problem på grund av begränsad precision ( avrundningsfel ) och/eller på grund av det ökande antalet beräkningar som behövs (se exempel nedan).
Exempel pseudokod kod för Richardson extrapolation
Följande pseudokod i MATLAB-stil demonstrerar Richardsons extrapolering för att hjälpa till att lösa ODE , med trapetsmetoden . I det här exemplet halverar vi stegstorleken varje iteration och så i diskussionen ovan skulle vi ha att . Felet i den trapetsformade metoden kan uttryckas i termer av udda potenser så att felet över flera steg kan uttryckas i jämna potenser; detta leder till att vi höjer till andra potensen och tar potenserna i pseudokoden. Vi vill hitta värdet på , som har den exakta lösningen eftersom den exakta lösningen av ODE är . Denna pseudokod antar att en funktion som kallas Trapezoidal(f, tStart, tEnd, h, y0)
existerar som försöker beräkna y(tEnd)
genom att utföra trapetsmetoden på funktionen f
, med startpunkt y0
och tStart
och stegstorlek h
.
Observera att att börja med en för liten inledande stegstorlek potentiellt kan introducera fel i den slutliga lösningen. Även om det finns metoder utformade för att hjälpa till att välja den bästa initiala stegstorleken, är ett alternativ att börja med en stor stegstorlek och sedan låta Richardson-extrapoleringen minska stegstorleken varje iteration tills felet når den önskade toleransen.
0
tStart = % Starttid tEnd = 5 % Sluttid f = - y ^ 2 % Derivatan av y, så y' = f(t, y(t)) = -y^2 % Lösningen till denna ODE är y = 1/(1 + t) y0 = 1 % Startpositionen (dvs. y0 = y(tStart) = y(0) = 1) tolerans = 10 ^ - 11 % 10-siffrig noggrannhet önskas max . Rader = 20 % Tillåt inte iterationen för att fortsätta på obestämd tid initialH = tStart - TEnd % Välj ett inledande stegstorlek haveWeFoundSolution = falskt % Kunde vi hitta lösningen inom den önskade toleransen? inte än. h = initialH % Skapa en 2D-matris med storleken maxRows by maxRows för att hålla Richardson-extrapoleringen % Observera att detta kommer att vara en lägre triangulär matris och att högst två rader faktiskt behövs % när som helst i beräkningen. A = nollMatrix ( maxRows , maxRows ) % Beräkna det övre vänstra elementet i matrisen. Den första raden i denna (nedre triangulära) matris har nu fyllts. A ( 1 , 1 ) = trapetsformad ( f , tStart , tEnd , h , y0 ) % Varje rad i matrisen kräver ett anrop till trapetsformad % Denna loop börjar med att fylla den andra raden i matrisen, eftersom den första raden beräknades ovan för i = 1 : maxRows - 1 % Börja vid i = 1, iterera högst maxRows - 1 gånger h = h / 2 % Halvera det föregående värdet på h eftersom detta är början på en ny rad. % Börja fylla rad i+1 från vänster genom att anropa den trapetsformade funktionen med denna nya mindre stegstorlek A ( i + 1 , 1 ) = Trapetsformad ( f , tStart , tEnd , h , y0 ) för j = 1 : i % Go över denna nuvarande (i+1)-te rad tills diagonalen nås % För att beräkna A(i + 1, j + 1), vilket är nästa Richardson-extrapolering, använder % det senast beräknade värdet (dvs. A(i + 1, j)) och värdet från %-raden ovanför den (dvs. A(i, j)). A ( i + 1 , j + 1 ) = (( 4 ^ j ) .* A ( i + 1 , j ) - A ( i , j )) / ( 4 ^ j - 1 ); slut % Efter att ha lämnat ovanstående inre slinga har diagonalelementet i rad i + 1 beräknats % Detta diagonalelement är det senaste Richardson-extrapoleringen som har beräknats. % Skillnaden mellan denna extrapolering och den sista extrapoleringen av rad i är en bra % indikation på felet. if ( absolutVärde ( A ( i + 1 , i + 1 ) - A ( i , i )) < tolerans ) % Om resultatet är inom tolerans skriv ut ( "y = " , A ( i + 1 , i + 1 )) % Visa resultatet av Richardson-extrapoleringen haveWeFoundSolution = true break % Klart, så lämna slingslutet if ( haveWeFoundSolution == false ) % Om vi inte kunde hitta en lösning inom den önskade toleransutskriften ( " Warning: Not able att hitta en lösning inom den önskade toleransen av " , tolerans ) ; print ( "Den sista beräknade extrapoleringen var " , A ( maxRows , maxRows )) slut
Se även
- Extrapolationsmetoder. Teori och praktik av C. Brezinski och M. Redivo Zaglia , North-Holland, 1991.
- Ivan Dimov, Zahari Zlatev, Istvan Farago, Agnes Havasi: Richardson Extrapolation: Practical Aspects and Applications , Walter de Gruyter GmbH & Co KG, ISBN 9783110533002 (2017).
externa länkar
- Grundläggande metoder för numerisk extrapolering med applikationer, mit.edu
- Richardson-Extrapolation
- Richardsons extrapolering på en webbplats för Robert Israel (University of British Columbia)
- Matlab-kod för generisk Richardson-extrapolering.
- Julia-kod för generisk Richardson-extrapolering.