Skjutmetod

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 21 september 2018; kontroller kräver 6 redigeringar .

Skjutmetoden (gränsvärdesproblem) är en numerisk metod , som består i att reducera gränsvärdesproblemet till något Cauchy-problem för samma system av differentialekvationer . Sammanfattning: den första lösningen med en successiv förändring av argumentet och upprepning av beräkningar blir mer exakt

Beskrivning av metoden

Problemet för ett system av två första ordningens ekvationer med randvillkor av en allmän form betraktas:

systemet



gränsförhållanden




Algoritm

1. Villkoret väljs godtyckligt .

2. Det vänstra gränsvillkoret betraktas som en algebraisk ekvation . Vi bestämmer värdet som uppfyller det .

3. Värden väljs som initiala villkor för Cauchy-problemet för det aktuella systemet, och detta Cauchy-problem är integrerat med vilken numerisk metod som helst (till exempel enligt Runge-Kutta-scheman).

4. Som ett resultat erhålls en lösning som beror på η som parameter.

Värdet väljs så att den hittade lösningen uppfyller det vänstra gränsvillkoret. Emellertid uppfyller denna lösning generellt sett inte det högra gränsvillkoret: när det ersätts, den vänstra sidan av det högra gränsvillkoret, betraktad som en funktion av parametern :

,

kommer inte att gå till noll.

5. Parametern η väljs i enlighet med villkoret för att hitta ett sådant värde för vilket med erforderlig noggrannhet.

Således reduceras lösningen av gränsvärdesproblemet till att hitta roten till en algebraisk ekvation . [ett]

Ett exempel på ett Python-program

importera matplotlib.pyplot som plt importera numpy som np a , b = 0,0 , 1,0 A , B = 1,0 , np . e n = 5 h = ( b - a ) / n D0 , D1 = A + h , h y = [[ A , D0 ], [ 0 , D1 ]] def p ( x ): returnera 1 def q ( x ): returnera 1 def f ( x ): returnera 3 * ( np . e ** x ) def get_c1 (): global n return ( B - y [ 0 ][ n ]) / y [ 1 ][ n ] def get_solv_y_i ( i ): returnera y [ 0 ][ i ] + get_c1 () * y [ 1 ][ i ] x = np . linspace ( a , b , n + 1 ) def div ( a , b ): returnera a / b för i inom intervallet ( 1 , n ): y [ 0 ] . append ( div ( ( h ** 2 * f ( x [ i ])) - ( 1.0 - ( h / 2 ) * p ( x [ i ])) * y [ 0 ][ i - 1 ] - ( h ** 2 * q ( x [ i ]) - 2 ) * y [ 0 ][ i ]), 1 + h / 2 * p ( x [ i ]) ) ) y [ 1 ] . append ( div ( - ( 1 - h / 2 * p ( x [ i ])) * y [ 1 ][ i - 1 ] - ( h ** 2 * q ( x [ i ]) - 2 ) * y [ 1 ][ i ], 1 + h / 2 * p ( x [ i ]) ) ) plt . plot ( x , [ get_solv_y_i ( i ) för i i intervallet ( n + 1 ) ]) plt . visa () för i inom intervallet ( n ): print ( x [ i ], get_solv_y_i ( i ))

Anteckningar

  1. Kalitkin N. N. Numeriska metoder M.: Nauka, 1978