Numeryczne zagadnienie własne Podstawy fizyki komputerowej. Obliczenia numeryczne Biblioteka Lapack i Eispack (Fortran) Biblioteki przepisane na inne języki programowania Funkcjonalność bibliotek numerycznych
Ograniczenia analizy matematycznej i fizyki komputerowej Przy pomocy ścisłych metod jesteśmy w stanie rozwiązać proste przykładowe modele. Bardziej skomplikowane modele wymagają metod przybliżonych. Zagadnienia dwóch ciał- rozwiązywalne. Układy fizyczne w ujęciu fizyki komputerowej muszą być dyskretne i skończone. Możliwość opisania układu przy pomocy dużej liczby zmiennych. Ograniczenia. 10 10 long int (ilość cząstek, punktów). 10 8, 101 6 double (ograniczenie na przedział)
Elementy metody różnicowej Szeroki zakres zagadnień sformowano wychodząc z koncepcji ciągłego ośrodka. Uzyskujemy równania różniczkowe. W wielu sytuacjach problem nierozwiązywalny Jeśli chcemy takie równania rozwiązać i zinterpretować musimy wykonać w pewnym sensie odwrotną pracę do tej, którą przeprowadzili ich twórcy i zrównań różniczkowych otrzymać równania algebraiczne
Reprezentacja dyskretna zmiennej ciągłej Rozważmy ciągłą zmienną niezależną ex, leżącą w obszarze: X( X, X 1 2) X1 xx 2 Kontinuum zastępujemy siatką punktów, dzieląc obszar IX na zbiór J-1 elementów. 1 jj x X Ciągłą zmienną Zastępujemy poprzez wektor j 1 i 1 x k k 1
Dyskretyzacja funkcji Daną funkcję of(x)określoną na kontinuum możemy przybliżyć poprzez wektor F i =f(x i ) Wybrany przedział dx musi być taki aby istotne zmiany funkcji zachodziły na przedziale>>>dx. Taka dyskretyzacja jest nie jest dobra dla funkcji szybkozmiennych
Numeryczne przybliżenie pochodnej funkcji Aproksymacja pierwszej pochodnej: df dx ( xi ) fi 1 i1 f 2 F(x) Fi-1 2 Fi+1 dfxi tg ( ) dx i-1 i i+1
Błąd numerycznego przybliżenia pierwszej pochodnej Rozważając pojęcie dobrej-złej aproksymacji, przy stosowaniu metody różnicowej np. Analiza Fouriera: Aproksymacja dyskretna funkcji f(x) f i (wektor) Moduły Fouriera tworzą zbiór ortogonalny f ( x) g f k g j k J k k g e k f ( x) e J k1 J j1 g f ijk S ee j 1 k j i2kx i2 x e e dx i2kj i2kj J 2 ijk 2' ijkk )' 2( e j 1
Błąd numerycznego wyznaczenia pochodnej funkcji Ocena błędu. Rozwinięcie wzoru różnicowego dla pochodnej w szereg dla małych kδ Operator różnicowy działa z dokładnością do wyrazów drugiego rzędu ze względu na kδ 1 N 22 k 44d x' 1 ( ko ) 6 dx Dokładność 1/N 2
Różnicowa aproksymacja drugiej pochodnej dfx () f 2 j 2 dx j 1 2 ff j 2 F j F j+1 j 1 F j-1 J-1 J J+1 punkt J-1/2 1 Pochodna w punkcie Punkt J+1/2 1 pochodna w punkcie f j 1 f j f j 1 f j
Błąd aproksymacji drugiej pochodnej Postępując analogicznie jak dla pierwszej pochodnej Dokładność k 2 Δ 2 22 k x' 1 ( ko 12 Dokładność=1/N 2 2 44 d ) 2 dx
Numeryczne obliczanie całki Całka z funkcji w przedziale <a,b>= pole pod wykresem fj fj a J-1 J J+1 b Metoda prostokątów a J-1 J J+1 b Metoda trapezów f ( xdx ) if i fx () dxf 1 i 1 ( fi fi 1 ) 2 i
Lapack LAPACK (Linear Algebra PACKage) to napisana w Fortranie biblioteka procedur numerycznych z zakresu algebry liniowej; oferuje podobne możliwości jak starsze od niej biblioteki LINPACK i EISPACK. (definicja z wikipedia) LAPACK Linear Algebra PACKage: http://www.netlib.org/lapack/ Pod c++ http://math.nist.gov/lapack++/ Visual Studio: http://icl.cs.utk.edu/lapack-for-windows/visualstudio_install.html
Numeryczne rozwiązanie zagadnienia własnego zhpev( ) funkcja rozwiązująca zagadnienia własne dla zespolonej macierzy Hermitowskiej Nagłówek procedury w Fortranie SUBROUTINE ZHPEV( JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, RWORK, $ INFO ) * -- LAPACK driver routine (version 3.1) -- * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. * November 2006 * *.. Scalar Arguments. CHARACTER JOBZ, UPLO INTEGER INFO, LDZ, N *.. *.. Array Arguments.. DOUBLE PRECISION RWORK( * ), W( * ) COMPLEX*16 AP( * ), WORK( * ), Z( LDZ, * )
Funkcja zhpev c++ Funkcja z biblioteki Lapack zostały przepisane na język c++. Użycie ich wymaga stosowania się pewnych zasad zaczerpniętych z macierzystej formy. Macierze (tablice 2 wymiarowe) transponujemy do postaci tablicy Jednowymiarowej!!!!!
Opis funkcji zhpev JOBZ (input) CHARACTER*1 = 'N': Compute eigenvalues only; = 'V': Compute eigenvalues and eigenvectors. UPLO (input) CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored. N AP (input) INTEGER The order of the matrix A. N >= 0. (input/output) COMPLEX*16 array, dimension (N*(N+1)/2) On entry, the upper or lower triangle of the Hermitian matrix A, packed columnwise in a linear array. The j-th column of A is stored in the array AP as follows: if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n.
On exit, AP is overwritten by values generated during the reduction to tridiagonal form. If UPLO = 'U', the diagonal and first superdiagonal of the tridiagonal matrix T overwrite the corresponding elements of A, and if UPLO = 'L', the diagonal and first subdiagonal of T overwrite the corresponding elements of A. W (output) DOUBLE PRECISION array, dimension (N) If INFO = 0, the eigenvalues in ascending order. Z (output) COMPLEX*16 array, dimension (LDZ, N) If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal eigenvectors of the matrix A, with the i-th column of Z holding the eigenvector associated with W(i). If JOBZ = 'N', then Z is not referenced.
LDZ (input) INTEGER The leading dimension of the array Z. LDZ >= 1, and if JOBZ = 'V', LDZ >= max(1,n). WORK (workspace) COMPLEX*16 array, dimension (max(1, 2*N-1)) RWORK (workspace) DOUBLE PRECISION array, dimension (max(1, 3*N-2)) INFO (output) INTEGER = 0: successful exit. < 0: if INFO = -i, the i-th argument had an illegal value. > 0: if INFO = i, the algorithm failed to converge; i off-diagonal elements of an intermediate tridiagonal form did not converge to zero.
Dołączenie bibliteki Lapack do c++ Aby z korzystać z biblioteki zewnętrznej należy dołączyć jej skompilowaną wersję do aktualnego programu W różnych środowiskach robi się to inaczej W Visual Studio można bezpośrednio dołączyć pliki biblioteczne *.lib to projektu głównego Pamiętać należy że język c++ ( w przeciwieństwie do c) wymaga dodatkowo dołożenia poza funkcją main() nagłówków i funkcji użytych w programie głównym Podobnie należy dołączyć dodatkowe typy zdefiniowane w bibliotekach (doublecomplex)
Definiowanie dodatkowych typów: Przykładowe wywołanie funkcji w programie: