Metody numeryczne - Uniwersytet Zielonogórski
Transkrypt
Metody numeryczne - Uniwersytet Zielonogórski
Metody numeryczne- wybrane zagadnienia dr Bogdan Grabiec Zielona Góra 2010 Tytuł projektu: Wniosek: Priorytet: Działanie: Poddziałanie: Beneficjent: Unowocześnienie programów, poprawa jakości kształcenia oraz otwarcie nowej specjalności ekofizyka na kierunku fizyka w Uniwersytecie Zielonogórskim, POKL 04.01.01-00-041/09-00 Program Operacyjny Kapitał Ludzki IV. Szkolnictwo wyższe i nauka 4.1 Wzmocnienie i rozwój potencjału dydaktycznego uczelni oraz zwiększenie liczby absolwentów kierunków o kluczowym znaczeniu dla gospodarki opartej na wiedzy, 4.1.1 Wzmocnienie potencjału dydaktycznego uczelni Uniwersytet Zielonogórski, ul. Licealna 9, 65-417 Zielona Góra Spis treści 1 Interpolacja. Interpolacja Lagrange’a 3 2 Aproksymacja 9 2.0.1 Aproksymacja średniokwadratowa . . . . . . . . . . . . 9 2.0.2 Aproksymacja jednostajna . . . . . . . . . . . . . . . . 11 3 Numeryczne różniczkowanie 15 4 Całkowanie numeryczne 17 4.0.3 Metoda trapezów . . . . . . . . . . . . . . . . . . . . . 18 4.0.4 Metoda Simpsona . . . . . . . . . . . . . . . . . . . . . 20 5 Numeryczne rozwiązywanie równań 23 6 Równania rożniczkowe 27 1 2 SPIS TREŚCI Rozdział 1 Interpolacja. Interpolacja Lagrange’a Wyobraźmy sobie że mamy zadaną funkcje y=f(x) dla x0 ∈ [x1 , x2 ]. Określenie wartości funkcji dla x z tego przedziału, nie stanowi problemu, wystarczy wyznaczyć y0 = f (x0 ). Sprawa się komplikuje gdy nie dysponujemy już ścisłą postacią funkcji a jedynie zbiorem punktów (x1 , y1 ), ..., (xN , yn ). Sposób wyznaczenia przybliżonej wartości funkcji dla argumentu x0 znajdującego sie między zadanymi punktami już nie jest takie proste. Jednym z sposobów realizujących powyższe zagdanienie nosi nazwę interpolacji. Przykład 1 3 4 ROZDZIAŁ 1. INTERPOLACJA. INTERPOLACJA LAGRANGE’A Dysponując dwoma punktami o współrzędnych : (x1 , y1 = f (x1 )) oraz (x2 , y2 = f (x2 )).Określimy przybliżoną watość funkcji dla argumentu x0 z przedziału należącego do [x1 , x2 ]. Problem ten możemy rozwiązać następująco: szukamy równanie prostej przechodzącej przez dane punkty y1 − y y2 − y1 . = x1 − x x2 − x1 Na podstawie powyższego równania, możemy wyznaczyć wartość y y= y2 − y1 (x − x1 ) + y1 x2 − x1 a tym samym, przybliżona wartość dla x=x0 y0 = y2 − y1 (x0 − x1 ) + y1 x2 − x1 Przykład 2 Zagadnienie to możemy rozszerzyć o znajomość wspólrzędnych następnego punktu. Tym razem zadamy sobie pytanie jaki wielomian, tzn. o jakim stopniu możemy przeprowadziċ przez podane trzy punkty. Odpowiedzią na zadany problem jest funkacja kwadratowa postaci f (x) = a2 x2 +a1 x+a0 . Musimy znaleźć wielkości a,b i c wyrażone poprzez znajomość x1 , x2 , x3 , y1 , y2, y3 Uzyskujemy układ równań postaci: a2 x21 + a1 x1 + a0 = y1 a2 x22 + a1 x2 + a0 = y2 a2 x23 + a1 x3 + a0 = y3 Rozwiązanie ma postać: a2 = a1 = a2 = x21 x1 y1 x22 x2 y2 x23 x3 y3 W x21 y1 1 x22 y2 1 x23 y3 1 W y1 x1 1 y2 x2 1 y3 x3 1 W 5 gdzie x21 x1 1 W = x22 x2 1 = (x3 − x2 )(x3 − x1 )(x2 − x1 ) x23 x3 1 Co pozwala zapisać ostatecznie: W3 (x) = y1 (x − x2 )(x − x3 ) (x − x1 )(x − x2 ) (x − x1 )(x − x2 ) −y2 +y3 (x2 − x1)(x3 − x1) (x2 − x1 )(x3 − x2 ) (x3 − x1 )(x3 − x1 ) Możemy sformułować następującą własność w postaci twierdzenia. Twierdzenie 1.0.1 Dla zadanych N punktów :(x1 , y1), ...., (xN , yN ), które będziemy nazywać węzłami interpolacyjnymi, istnieje dokładnie jeden wielomian stopnia N, postaci WN (x) = N X ai xi . i=0 dowód Zadane punkty muszą spełniać powyższe rȯwnania a0 + a1 x1 + ... + aN xN = y1 1 ........................... a0 + a1 xN + ... + aN xN N = yN 6 ROZDZIAŁ 1. INTERPOLACJA. INTERPOLACJA LAGRANGE’A Ponownie, rozwiązania dla powyższego układu stosując twierdzenie Cramera, możemy zapisać w postaci: ai = n 1 X yj Dij D j=0 gdzie Dij oznacza dopełnienia algebraiczne elementów i-tej kolumny macierzy A postaci 1 x1 x21 ... xN 1 1 x x22 ... xN 2 2 A= ... ... ... ... ... 1 xN x2N ... xN N co kończy dowód. Warto wspomnieć że wyznacznik macierzy A nie jest trudny do obliczenia. Y (xi − xj ) 6= 0 |A| = 0¬j<i¬n Jest to tzw. wyznacznik Vandermonde’a. Twierdzenie 1.0.2 Dla danych węzłów interpolacyjnych x0 , x1 , ..., xN ∈ [a, b] i danej funkcji f ∈ C [n+1] [a, b] możemy dla dowolnego punktu x ∈ [a, b] znaleźć takie ζ = ζ(x) ∈ [a, b] że f (x) = P (x) + f (n+1) (ζ(x)) (x − x0 )(x − x1 )...(x − xN ) (n + 1)! gdzie P (x) = N X f (xk )Ln,k (x), k=0 Ln,k (x) = N Y (x − xi ) i=0,i6=k (xk − xi ) dla k = 0, 1, ..., n. dowód: Jeśli x = xk dla k = 0, 1, ..., n, f (xk ) = P (xk ). Natomiast gdy x 6= xk wprowadzam funkcję: (t − x0 )(t − x1 )...(t − xN ) (x − x0 )(x − x1 )...(x − xN ) n Y (t − xi ) = f (t) − P (t) − [f (x) − P (x)] i=0 (x − xi ) g(t) = f (t) − P (t) − [f (x) − P (x)] 7 Patrząc na funkcję g, widać że musi być klasy c[n+1] [a, b]. Dla t = xk oraz t = x g = 0. W związku z tym mogę wykorzystać n+1 razy twierdzenie Rolle’a. Wobec tego mogę zapisać: 0 = g (n+1) (ζ) = f (n+1) (ζ) − P (n+1) (ζ) − [f (x) − P (x)] n d(n+1) Y (t − xi ) |t=ζ . (n+1) dt i=0 (x − xi ) Wielkość P (x) jest wielomianem stopnia n. Pochodna (n+1) rzędu z wielkości daje nam w wyniku zero. Natomiast n d(n+1) Y (n + 1)! (t − xi ) . |t=ζ = Qn (n+1) dt i=0 (x − xi ) i=0 (x − xi ) ostatecznie uzyskujemy (n + 1)! . 0 = f (n+1) (ζ) − 0 − [f (x) − P (x)] Qn i=0 (x − xi ) f (x) = P (x) + n f (n+1) (ζ) Y (x − xi ). (n + 1)! i=0 Przykład 3 Dla danych punktów:(-2,3),(1,1),(2,-3),(4,8) znaleźć wielomian interpolacyjny rozwiązanie (x + 2)(x − 2)(x − 4) (x − 1)(x − 2)(x − 4) +1 W4 (x) = 3 (−2 − 1)(−2 − 2)(−2 − 4) (1 − 3)(1 − 2)(1 − 4) (x + 2)(x − 1)(x − 4) (x + 2)(x − 1)(x − 1) − 3 +8 . (2 + 2)(2 − 1)(2 − 4) (4 + 2)(4 − 1)(4 − 2) Oszacowanie błędu wzoru interpolacyjnego. Problem tego zagadnienia polega na wyznaczeniu wielkości ε(x) = f (x) − Wn (x), która będzie nas informowała o tym jak poważne są odchylenia wartości funkcji od wartości opartej na wielomianie interpolacyjnym. W tym celu wprowadzamy funkcje typu: ϕ(u) = f (u) − Wn (u) + K(U − x0 )(u − x1 )...(u − xn ), wykorzystujac twierdzenie Rolle’a (n+1) razy, uzyskamy K= f (n+1) (ζ) (n + 1)! a tym samym |f (x) − Wn (x)| ¬ Mn+1 |Wn (x)|. (n + 1)! 8 ROZDZIAŁ 1. INTERPOLACJA. INTERPOLACJA LAGRANGE’A Rozdział 2 Aproksymacja Wprowadzmy następujące oznaczenia: f(x) - funkcja która chcemy przbliżyć, F(x) - funkcja która przybliżamy funkcję f(x) i nazywamy ją funkcją aproksymującą. Warto wspomieć że jeśli aproksymacje rozważamy na przedziale to będziemy ją nazywać aproksymacją intergralna, natomiast jeśli na zbiorze dyskretnym to aproksymacją punktową. Poprzez aproksymacje funkcji f(x) rozumiemy znalezienie takiej funkcji F(x) F (x) = a0 φ0 (x) + ... + am φm (x) gdzie φ0 , φ1, ..., φm oznacza bazę w przestrzeni m+1 wymiarowej, tak aby np. minimalizowała normę ||f (x) − F (x)||. Całe zagadnienie sprowadza się do wyznaczenia współczynników a0 , a1 , ..., am . 2.0.1 Aproksymacja średniokwadratowa Dla tego problemu rozważymy aproksymacje punktową, której podstawą jest zminmalizowanie normy postaci ||F (x) − f (x)|| = n X (F (xi ) − f (xi ))2 i=0 gdzie i = 1, 2, 3, ...n. Jeśli rozważymy wykorzystanie bazy przestrzeni w postaci: φ0 (x) = 1, φ1 (x) = x, φ2 (x) = x2 , ...., φm (x) = xm . Funkcje aproksymujacą możemy zapisać w postaci F (x) = m X i=0 9 φi (x)xi . ROZDZIAŁ 2. APROKSYMACJA 10 Definiujemy funkcje H postaci: H(a0 , a1 , a2 , ..., am ) = n X fj − m X ai φi (xj ) i=0 j=1 !2 Warunek konieczny pozwalający znaleźć minimum: m n X X ∂H ai φi(xj ) xkj = 0 fj − = −2 ∂ak i=0 j=0 ! Co pozwala zapisać powyższa zależność w postaci m X ai gik = ρk , k = 0, 1, 2, ..., m i=0 gdzie gik = n X xi+k j j=0 ρk = n X f (xj )xkj j=0 Przykład: regresja liniowa Dysponujemy znajmościa współrzędnych punktów:(xi , yi), i = 1, 2, ..., m Aproksymacji dokonujemy za pomocą funkcji: F (x) = a0 + a1 x. W tym przypadku musimy zminimalizowac wyrażenie: H(a0 , a1 ) = m X (f (xj ) − (a0 + a1 xj ))2 . j=1 Warunek konieczny na istnienie minimum: ∂H(a0 ,a1 ) ∂a0 ∂H(a0 ,a1 ) ∂a1 = −2 = −2 m X j=1 m X (f (xj ) − (a0 + a1 xj )) = 0 xj (f (xj ) − (a0 + a1 x)) = 0 j=1 Rozwiązując powyższe równania uzyskujemy hyihx2i − hxihxyi hx2 i − (hxi)2 hxyi − hxihyi = hx2 i − (hxi)2 a0 = a1 11 gdzie 2.0.2 xi hxi = m X yi hyi = m X xi yi hxyi = m X hx2 i = m X i=0 m i=0 m i=0 m (xi )2 i=0 m Aproksymacja jednostajna W tym przypadku rozważamy funkcję f (x), x ∈< a, b >. Szukamy najmniejszej maksymalnej różnicy ||F (x) − f (x)|| = supx∈<a,b> |F (x) − f (x)| Metoda szeregów potęgowych Metoda ta jest jedną z najbardziej znanych sposobów aproksymacji jednostajnej. Polega ona na przybliżaniu funkcji szregiem potęgowym, oczywiście skończonym. F (x) = f (x0 ) + f (m) (x0 ) f (1) (x0 ) (x − x0 ) + ... + (x − x0 )m 1! m! W tym przypadku błąd aproksymacji wyznaczymy za pomocą zależności |f (x) − F (x)| ¬ Mm+1 m+1 δ (m + 1)! Przykład Funkcje f (x) = sin(x), dla x ∈< −0.1; 0.1 > możemy przybliżyć funkcją x3 x5 sin(x) = x − + 6 120 ROZDZIAŁ 2. APROKSYMACJA 12 Przybliżenie Pade’go W tym przypadku funkcja aproksymujacą przyjmuje postać F (x) = Rn,k (x) = Ln (x) a0 + aa x + ... + an xn = Mk (x) 1 + b1 x + ... + bk xk gdzie N = n + m. Na podaną funkcję nakładamy następującę warunki 1. f (0) = Rn,k (0) = Ln (0) Mk (0) (m) 2. pochodne f (m) (0) − Rn,k (0) = 0 dla m=1,2,..., N Rozwinięcie funkcji f (x) w szereg Taylora w x = 0 można zapisać: f (x) = ∞ X ci xi . i=0 Błąd aproksymacji będzie miał następującą postać: ε(x) = f (x) − Ln (x) . Mk (x) Uwzględniając warunki (1) i (2) uzyskujemy równanie: ∞ X i=0 ci xi k X bi xi − n X i=0 i=0 ai xi = ∞ X di xi i=n+k+1 które prowadzi do następujących zależności pomiędzy wspołczynnikami a, b ic c = =0 j<0 j b = =0 j>k j k X cn+k−s−j bj = 0 s = 0, 1, ..., k − 1 j=0 ar = k X cr−j bj r = 0, 1, ..., n. j=0 Przykład Rozważmy funkcje f (x) = ex na przedziale x ∈< −0.5; 0.5 >. Znajdziemy przybliżenie Pade’go R2,1 (x), n = 2, k = 1, N = 3 dla tej funkcji. Rozwinięcie Taylora ma postać f (x) = 1 + x + x2 x3 + = R3,0 (x) 2 6 13 wobec tego c0 = 1, c1 = 1, c2 = 0.5, c3 = 1/6. Z równań na wspołczynniki b i c otrzymujemy: c3−0−0 b0 + c3−0−1 b1 = c3 b0 + c2 b1 = a0 = c0 b0 = 1, a1 = c1 b0 + c0 b1 = 1 − 1 1 1 + b1 = 0 ⇒ b1 = − 6 2 3 2 1 1 1 1 = , a2 = c2 b0 + c1 b1 = − = . 3 3 2 3 6 Ostatecznie możemy zapisać R2,1 = 1 + 32 x + 16 x2 . 1 − 31 x 14 ROZDZIAŁ 2. APROKSYMACJA Rozdział 3 Numeryczne różniczkowanie Bogata w informację jest znajomość pochodnej pewnej wielkości. W fizyce najczęściej podawane przykłady to definicje prędkości i przyśpieszenia. v(t) = a(t) = dr(t) dt dv(t) dt = d2 r(t) dt2 Znając równanie toru ruchu ciała, czyli funkcje r = r(t), jesteśmy w stanie powiedzieć z jaką szybkością porusza się ciało oraz jaka działa na niego siła. Pierwszą uzyskamy z wyznaczenia pochodnej polożenia po czasie a drugą z pomnożenia masy przez drugą pochodną polożenia po czasie. Na tym przykładzie widaċ, że, umiejętność policzenia pochodnej z danej funkcji jest niezbędna dla każdego inżyniera, fizyka czy matematyka. 1. Pochodna numeryczna dwu-punktowa Rozważmy funkcję f ∈ C 2 [a, b], oraz dwa punkty x0 , x1 = x0 + h ∈ [a, b]. Korzystając z twierdzenia z rodziału 1, możemy zapisać f (x) = f0 x − x1 x − x0 (x − x0 )(x − x1 ) ” + f1 + f (ζ) x0 − x1 x1 − x0 2! Po podstawieniu i obliczeniu pochodnej po x f (x0 + h) − f (x0 ) (x − x0 )(x − x0 − h) d ” +((x−x0 )−h)f ” (ζ(x))+ f (ζ(x)). h 2! dx Gdy podstawimy za x = x0 , uzyskamy f ′ (x) = f ′ (x0 ) = f (x0 + h) − f (x0 ) h ” − f (ζ). h 2 czyli f ′ (x0 ) = f (x0 + h) − f (x0 ) + O(h). h 15 ROZDZIAŁ 3. NUMERYCZNE RÓŻNICZKOWANIE 16 W podobny sposób możemy wyprowadzić wzory: 2. Pochodna numeryczna trzy-punktowa f (x0 + h) − f (x0 − h) + O(h2 )). 2h 3. Pochodna numeryczna piecio-punktowa f ′ (x0 ) = f (x0 − 2h) − 8f (x0 − h) + 8f (x0 + h) + f (x0 + 2h) + O(h4 ). 12h Natomiast wyższe pochodne wyznaczymy za pomocą wzorów: 5. Druga pochodna numeryczna trzy-punktowa f ′ (x0 ) = f ”(x0 ) = f (x0 + h) − 2f (x0 ) + f (x0 − h) + O(h2 ). h2 oraz 6. Druga pochodna numeryczna piecio-punktowa −f (x0 − 2h) + 16f (x0 − h) − 30f (x0 ) + 16f (x0 + h) − f (x0 + 2h) +O(h2 ). 12h2 Powyższe równania można wyprowadzić korzystając z rozwinięcia w szereg Taylora funkcji f (x) w otoczeniu punktu x0 f ”(x0 ) = f ′ (x0 ) f “(x0 ) f (n) (x0 ) (x − x0 ) + (x − x0 )2 + ... + (x − x0 )n + .. 1 2! n! oraz wiedząc, ze xk+1 − x0 = xk+1 − xk = h f (x) = (f (x0 ) + Dla x = xk+1 1 (3) 1 f (xk+1 ) = fk+1 = fk + fk′ · h + fk′′ · h2 + fk · h3 + ... 2 6 Przykład Wyprowadzimy powyższa metoą wzór na pierwszą pochodną numeryczna 3-punktowa. Wymagana jest zanjomość: 1 f (xk+1 ) = fk+1 = fk + fk′ · h + fk′′ · h2 + O(h3 ) 2 1 f (xk−1 ) = fk−1 = fk − fk′ · h + fk′′ · h2 + O(h3 ) 2 Tworzymy następującą kombinacje: fk+1 − fk−1 = fk′ · h + O(h3 ) Po przeksztłceniu uzyskujemy: f ′k = fk+1 − fk−1 + O(h2 ). h Rozdział 4 Całkowanie numeryczne Sytuacja jest bardzo podobna jak do analizowanych zagadnień w rodziałe poprzednim. Tym razem szukamy sposobu na obliczenie Z t2 r(t) = t2 v(t) = Z v(t)dt t1 lub t1 a(t)dt. Zagadnienie możemy rozważyc w sposȯb następujący: Z b a f (x)dx ≃ n X ai f (xi ). i=0 Rozważymy stosowane najczęściej w obliczeniach: metode trapezów i Simpsona. 17 ROZDZIAŁ 4. CAŁKOWANIE NUMERYCZNE 18 4.0.3 Metoda trapezów Niech x0 = a, x1 = b, h = b − a ponownie wykorzystujemy twierdzenie z rozdziału pierwszego f (x) = x − x0 x − x1 f (x0 ) + f (x1 ) x0 − x1 x1 − x0 Po podstawieniu: Z b a x − x0 x − x1 f (x0 ) + f (x1 ) dx f (x)dx = x0 − x1 x1 − x0 xZ 0 1 x1 + f ”(ζ(x))(x − x0 )(x − x1 )dx. 2 x0 Z x1 Wykorzystując twierdzenie o wartości średniej: Z x1 x0 Z x1 f ”(ζ(x))(x − x0 )(x − x1 )dx = f ”(ζ) (x − x0 )(x − x1 )dx x0 1 = − h3 . 6 Ostatecznie po obliczeniach: Z b a f (x)dx = 1 h (f (x0 ) + f (x1 )) − h3 f ”(ζ). 2 12 Program w c/c++ oparty na tej metodzie możemy zrealizować w następujący sposób, wynik uzyskamy tak jak w obliczeniach, oczywiście 0.5. 19 #include<iostream> #include<cmath> using namespace std; double fun(double x) { return x; } int main() { double a=0.0; double b=1.0; int N=100; double h=(b-a)/100; double calka=0.; double x0=a; for(int i=0;i<N;i++) { calka=calka+(h/2.)*(fun(x0+i*h)+fun(x0+(i+1)*h)); } cout<<calka<<endl; return 0; } ROZDZIAŁ 4. CAŁKOWANIE NUMERYCZNE 20 4.0.4 Metoda Simpsona Tym razem wybieramy trzy punkty : x0 = a, x2 = b, x1 = a + h, h = (b − a)/2 Z (x − x1 )(x − x2 ) f (x0 )dx (x0 − x1 )(x0 − x2 ) x Z x0 2 (x − x0 )(x − x2 ) f (x1 )dx + (x1 − x0 )(x1 − x2 ) x Z x0 2 (x − x0 )(x − x1 ) + f (x2 )dx xZ0 (x2 − x0 )(x2 − x1 ) x2 + 61 f (3) (ζ(x))(x − x0 )(x − x1 )(x − x2 )dx. b a f (x)dx = Z x2 x0 Po odpowiednim wycałkowaniu, uzyskujemy: Z x2 x0 f (x)dx = h5 h (f (x0 ) + 4f (x1 ) + f (x2 )) − f (4) (ζ) 3 90 Kod programu w c/c++ realizujący powyższy problem: #include<iostream> #include<cmath> using namespace std; double fun(double x) { 21 return x; } int main() { double a=0.0; double b=1.0; int N=100; double h=(b-a)/100; double calka=0.; double x0=a; for(int i=0;i<N/2;i++) { calka=calka+(h/3.)*(fun(x0+2*i*h)+4.*fun(x0+(2*i+1)*h)+fun(x0+(2*i+2)*h)); } cout<<calka<<endl; return 0; } 22 ROZDZIAŁ 4. CAŁKOWANIE NUMERYCZNE Rozdział 5 Numeryczne rozwiązywanie równań Kiedy mamy dane równanie kwadratowe typu f (x) = ax2 + bx + c = 0, bez problemu, przypominamy sobie odpowiednie wzory, które pozwalają nam analitycznie wyznaczyć miejsca zerowe. Pojawia sie problem gdy mamy do rozwiązania równanie postaci f (x) = exp(−x) ln(x) − x ∗ x = 0. Niestety już nie jesteśmy analitycznie rozwiązać to równanie. Możemy jedynie podać przybliżona wartość miejsca zerowego. Numeryczne metody rozwiązywanie równan f (x) = 0 z jedną niewiadoma: 1. Metoda połowienia (bisekcji) Jeśli f ∈ C[a, b] i f (a) · f (b) < 0 to pierwiatek równania jest x0 ∈ [a, b]. Metoda oparta jest na procedurze zmiejszania przedziału w taki sposób że po każdym kroku jest o połowę mniejszy. przyklad Rozważmy funkcje f (x) = x3 + 4x2 − 10. Zadamy sobie pytanie czy w przedziale < 1, 2 > znajduję się miejsce zerowe. Wyznaczamy: f (1) = −5; f (2) = 6, f (1) · f (2) < 0. Miejsce zerowe znajduję się w tym przedziale. 23 24 ROZDZIAŁ 5. NUMERYCZNE ROZWIĄZYWANIE RÓWNAŃ Przykład Numerycznie rozwiązujemy równanie typu f (x) = exp(−x) ln(x) − x ∗ x = 0.. Program w c/c++ realizujący ten problem może mieć postać: #include<iostream> #include<cmath> using namespace std; double fun(double x) { return exp(x)*log(x)-x*x; } int main() { double a=1.0; double b=2.0; double ab=b-a; double delta=0.001; double x0; while( fabs(ab) > delta) { x0=(a+b)/2.0; if(fun(a)*fun(x0) < 0.) { 25 b=x0; ab=b-a; } else { a=x0; ab=b-a; } cout<<x0<<endl; } return 0; } i uzyskujemy rozwiązania kolejno krok po kroku: 1.5; 1.75; 1.625; 1.6875; 1.71875; 1.70312; 1.69531; 1.69141; 16336; 1.69434 2. Metoda Newtona Jeśli f ∈ C 2 [a, b] tworzę ciąg typu xn = xn−1 − f (xn−1 ) . f ′ (xn−1 ) Procedura trwa do momentu aż dla zadanej dokładności δ |xn − xn−1 | ¬ δ. 26 ROZDZIAŁ 5. NUMERYCZNE ROZWIĄZYWANIE RÓWNAŃ #include<iostream> #include<cmath> using namespace std; double fun(double x) { return exp(x)*log(x)-x*x; } double fun1(double x) { return exp(x)*log(x)+exp(x)*(1./x)-2.*x; } int main() { double a=1.0; double b=2.0; double ab=b-a; double delta=0.001; double x0=(a+b)/2.; double x1; while( fabs(ab) > delta) { x1=x0-fun(x0)/fun1(x0); ab=x1-x0; x0=x1; cout<<x1<<endl; } return 0; } Otrzymujemy w kolejnych krokach miejsc zerowe:1.7398; 1.69657; 1.6946; 1.6946. 3. Metoda siecznych xn+1 = xn − (xn − xn−1 )fn . fn − fn−1 Rozdział 6 Równania rożniczkowe Opis wielu zagadnień dla układów dynamicznych sprowadza się do równań rożniczkowych pierwszego rzędu. Ogólnie możemy zapisać to w postaci: dy1 dt dy2 dt .... dyn dt = g1 (y1, y2, ..., yn, t) = g2 (y1, y2, ..., yn, t) ... .............................. = gn (y1, y2, ..., yn, t) Przyklad Rozważmy oscylator harmoniczny w jednym wymiarze dx = g1 (x, v, t) dt dv = g2 (x, v, t) dt gdzie g1 (x, v, t) = v, g2 (x, v, t) = −kx/m. 1. Metoda Eulera Najprostszą metodą numerycznego przedstawienia równań różniczkowych jest metoda Eulera. Polega ona na zastąpieniu pochodnych, pochodnymi numerycznymi. yn+1 − yn yn+1 − yn dy = = = g(yn , tn ) dt tn+1 − tn h co pozwala zapisać yn+1 = yn + hgn + O(h2 ). Algorytm oparty na metodzie Eulera jest mało dokładny i szybko robiegający się. Dokładność metody można zwiększyć jedynie poprzez zwiększenie 27 ROZDZIAŁ 6. RÓWNANIA ROŻNICZKOWE 28 punktów początkowych. Dla wielu zagadnień nie jest to korzystne dlatego ze zwykle zadany jest tylko jeden punkt zwany warunkiem początkowym. 2. Metoda Rungego-Kutty Metoda Rungego-Kutty należy do tych algorytmow które nie wymagaja̧ znajomości wielu punktów początkowych. Korzysta ona z dwóch rożnych szergów Taylora dla zmiennych dynamicznych. 2 3 y(t + h) = y + hy ′ + h2 y“ + h3! y (3) + ... 2 3 = y + hg + h2 (gt + ggy ) + h3! (gtt + 2ggtuy + g 2 gyy + ggy2 + gt gy ) + ... 2 ∂ g . gdzie gα,β = ∂α∂β Równanie to możemy zapisać formalnie w postaci y(t + h) = y(t) + α1 k1 + α2 k2 + ... + αn kn , gdzie kn = hg(y + n−1 X mnl kl + h l=1 n−1 X mnl ). l=1 2a. Metoda Rungego-Kutty 2-go rzędu W tym przypadku n=2, równania mają postać, wyższe rzędy zaniedbujemy, traktując je jako zaniedbywalnie małe. y(t + h) = y(t) + hg + h2 (gt + ggy ) 2 y(t + h) = y(t) + α1 k1 + α2 k2 k1 = hg(y, t), k2 = h(y + m21 k1 , t + m21 h) = hg + m21 h2 (gt + ggy ) wraz z ich postaciami po rozwinięciu w szerg Taylora z dokładnością do wyrazów stopnia co najwyzej 2. Porównując oba równania uzyskujemy y(t+h) = y(t)+hg + h2 (gt +ggy ) ≡ y(t)+α1 hg(y, t)+α2hg +m21 h2 (gt +ggy ). 2 Poszukujemy współczynników spełniających relacje ( 1 = α1 + α2 1 = α2 m21 2 Rozwiązania mogą mieć postać: α1 = α2 = 21 , m21 = 13 α1 = 31 , α2 = 23 , m21 = 3 4 29 2b. Metoda Rungego-Kutty 4-go rzędu Postępując podobnie jak w poprzedniej metodzie (w tym przypadku n=4) y(t + h) = y(t) + α1 k1 + α2 k2 + α3 k3 + α4 k4 , gdzie i ich postać po rozwinięciu w szereg Taylora z dokładnością do wyrazów stopnia co najwyżej 2 k1 k2 k3 k4 = = = = hg(y, t), h(y + m21 k1 , t + m21 h) = hg + m21 h2 (gt + ggy ), hg(y + m31 k1 + m32 k2, t + m31 h + m32 h), hg(y + m41 h1 + m32 k2 + m33 k3, t + m31 h + m32 h + m33 h). Uzyskujemy następujące zależności pomiędzy współczynnikami 1 y(t + h) = (k1 + 2k2 + 2k3 + k4), 6 k1 k2 k 3 k4 = = = = hg(y, t) hg(y + 0.5k1 , t + 0.5h) hg(y + 0.5k3 , t + 0.5h) hg(y + k3 , t + h) Przyklad Rozważmy oscylator harmoniczny z tłumieniem (y1 = x, y2 = v) z warunkami początkowymi x(0) = 0, v(0) = v0 . Równania mają postać: dx = g1 (x, v, t) = v dt dv = g2 (x, v, t) = − kx − bv m dt Wykorzystując metodę Rungego-Kutty 4-rzędu uzyskujemy #include<iostream> #include<cmath> using namespace std; double g1(double x, double v,double t) { return v; } ROZDZIAŁ 6. RÓWNANIA ROŻNICZKOWE 30 double { double double return } g2(double x, double v, double t) a1=0.1; a2=0.1; -a1*x-a2*v; int main() { double h=0.001; int N=50; double x0=1.; double v0=0.; double k11,k12,k13,k14; double k21,k22,k23,k24; double x,v; double t; t=0.; x=x0; v=v0; for(int i=0;i<N;i++) { t=i*h; k11=h*g1(x,v,t); k21=h*g2(x,v,t); k12=h*g1(x+k11/2.,v+k21/2.,t+h/2.); k22=h*g2(x+k11/2.,v+k21/2.,t+h/2.); k13=h*g1(x+k12/2.,v+k22/2.,t+h/2.); k23=h*g2(x+k12/2.,v+k22/2.,t+h/2.); k14=h*g1(x+k13,v+k23,t+h); k24=h*g2(x+k13,v+k23,t+h); x=x+(k11+2.*k12+2.*k13+k14)/6.; v=v+(k21+2.*k22+2.*k23+k24)/6.; cout<<t<<"\t"<<x<<endl; cout<<t<<"\t"<<v<<endl; } return 0; } Bibliografia [1] Tao Pang, Metody obliczeniowe w fizyce, PWN 2001 [2] Z.Fortuna, B.Macukow, J.Wąsowski, Metody Numeryczne, WNT 1998 [3] J.N.Bronsztajn, K.A. Siemiendiajew, Matematyka. Poradnik encyklopedyczny, PWN 1999 [4] Jerzy Grębosz, Symfonia C++, Oficyna Kallimach, Kraków 1996 31 Skorowidz aproksymacja a. jednostajna 11 a. sredniokwadratowa 9 a. Pade’go 12 a. szeregami funkcyjnymi 11 interpolacja 3 całkowanie numeryczne c. numeryczne trapezami 18 c. numeryczne Simpsona 20 numeryczne rozwiązywanie równań 23 metoda Newtona 23 metoda połowienia 25 metood siecznych 26 pochodna numeryczna pierwsza pochodna numeryczna 2punktowa 15 pierwsza pochodna numeryczna 3punktowa 16 pierwsza pochodna numeryczna 5punktowa 16 równania różniczkowe 27 metoda Eulera 27 metoda Rungego-Kutty 28 32