Metoda de fotografiere

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 21 septembrie 2018; verificările necesită 6 modificări .

Metoda shooting (problema valorii la limită) este o metodă numerică , care constă în reducerea problemei valorii la limită la o problemă Cauchy pentru același sistem de ecuații diferențiale . Concluzia: prima soluție cu o schimbare succesivă a argumentului și repetarea calculelor devine mai precisă

Descrierea metodei

Se consideră problema pentru un sistem de două ecuații de ordinul întâi cu condiții la limită de formă generală:

sistem



condiţiile de frontieră




Algoritm

1. Condiția este aleasă în mod arbitrar .

2. Condiția limită stângă este considerată ca o ecuație algebrică . Determinăm valoarea care o satisface .

3. Valorile sunt alese ca condiții inițiale ale problemei Cauchy pentru sistemul luat în considerare, iar această problemă Cauchy este integrată prin orice metodă numerică (de exemplu, conform schemelor Runge-Kutta).

4. Ca urmare, se obține o soluție care depinde de η ca parametru.

Valoarea este aleasă astfel încât soluția găsită să satisfacă condiția limită stângă. Totuși, această soluție, în general, nu satisface condiția la limită dreaptă: atunci când este substituită, partea stângă a condiției la limită dreaptă, considerată ca o funcție a parametrului :

,

nu va ajunge la zero.

5. Parametrul η este selectat în funcție de condiția găsirii unei astfel de valori pentru care cu precizia necesară.

Astfel, soluția problemei valorii la limită se reduce la găsirea rădăcinii unei ecuații algebrice . [unu]

Un exemplu de program Python

import matplotlib.pyplot ca plt import numpy ca 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 ): returnează 1 def q ( x ): returnează 1 def f ( x ): return 3 * ( np . e ** x ) def get_c1 (): global n return ( B - y [ 0 ][ n ]) / y [ 1 ][ n ] def get_solv_y_i ( i ): return y [ 0 ][ i ] + get_c1 () * y [ 1 ][ i ] x = np . linspace ( a , b , n + 1 ) def div ( a , b ): returnează a / b pentru i în intervalul ( 1 , n ): y [ 0 ] . adăugați ( 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 ] . adauga ( 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 ) for i in range ( n + 1 )]) plt . arata () pentru i în interval ( n ): print ( x [ i ], get_solv_y_i ( i ))

Note

  1. Kalitkin N. N. Metode numerice M.: Nauka, 1978