220 likes | 332 Views
Knihovna GSL. GSL. GNU Scientific Library numerická knihovna pro programátory v C/C++ převažují rysy klasického C aktuální verze 1.15 (květen 2011) verze pro Linux i se zdrojovými kódy verze pro MS Windows - 1.8 pro překladač GCC. Webové stránky. hlavní stránka
E N D
GSL • GNU Scientific Library • numerická knihovna pro programátory v C/C++ • převažují rysy klasického C • aktuální verze 1.15 (květen 2011) • verze pro Linux i se zdrojovými kódy • verze pro MS Windows - 1.8 • pro překladač GCC
Webové stránky • hlavní stránka • http://www.gnu.org/software/gsl/ • zkompilovaná verze pro MS Windows • http://www.cygwin.com
Oblasti využití • komplexní čísla • hledání kořenů polynomů • vektory a matice • generování permutací • lineární algebra • vlastní čísla matic • FFT (Fast FourierTransforms) • speciální generátory náhodných čísel
Oblasti využití • statistika – histogramy • integrace metodou Monte Carlo • simulované žíhání • řešení diferenciálních rovnic • interpolace • Čebyševova aproximace • hledání kořenů
Oblasti využití • minimalizace metodou nejmenších čtverců • spline funkce
Integrace metodou Monte Carlo • stochastická metoda • založena na sérii náhodných pokusů
Integrace metodou Monte Carlo y d I a x b
Integrace metodou Monte Carlo • generuji náhodně s rovnoměrným rozložením body do "modrého obdélníka" • poměr plochy pod křivkou I ku ploše obdélníka S je roven poměru počtu bodů NI, které padnou pod křivku, ku celkovému počtu vygenerovaných bodů N
Hlavičkové soubory • gsl_math.h • gsl_monte.h • gsl_monte_plain.h • gsl_monte_miser.h • gsl_monte_vegas.h
Obecný princip práce z knihovnou • volání inicializačních a alokačních funkcí • použití vlastních funkcí numerickým metod • volání dealokačních funkcí
Funkce pro základní metodu Inicializace gsl_monte_plain_state *gsl_monte_plain_alloc (size_tdim) • parametry • dim – dimenze funkce, kterou integruji • návratová hodnota • ukazatel na strukturugsl_monte_plain_state
Funkce pro základní metodu Výpočet intgsl_monte_plain_integrate (gsl_monte_function * f, const double xl[], const double xu[], size_t dim, size_t calls, gsl_rng * r, gsl_monte_plain_state * s, double * result, double * abserr) • parametry • f – ukazatel na funkci, kterou integruji (speciální struktura knihovny) • xl, xu – interval, na kterém integruji • dim – dimenze problému • calls – počet pokusů • r – ukazatel na generátor náhodných čísel • s - ukazatel na strukturugsl_monte_plain_state vytvořenou voláním funkce gsl_monte_plain_alloc • result – hodnota integrálu • abserr – odhad chyby • návratová hodnota • 0 – bez chyby, jinak chyba
Funkce pro základní metodu Dealokace • voidgsl_monte_plain_free (gsl_monte_plain_state * s) • praktická ukázka na cvičení
Integrace jednodimenzionální funkce • funkce y = x2 na intervalu <0,2> • definuji funkci double funkce(double *x, size_t dim, void *params) { return x[0]*x[0]; }
Integrace jednodimenzionální funkce • hlavní program intmain (void) { doubleintegral, err; doublexl[1] = { 0 }; doublexu[1] = { 2 }; constgsl_rng_type *T; gsl_rng *r; gsl_monte_function G = { &funkce, 1, 0 };
Integrace jednodimenzionální funkce • hlavní program size_tpocet_volani = 100000; gsl_rng_env_setup (); T = gsl_rng_default; r = gsl_rng_alloc(T); gsl_monte_plain_state *s = gsl_monte_plain_alloc(1); gsl_monte_plain_integrate (&G, xl, xu, 1, pocet_volani, r, s,&integral, &err); gsl_monte_plain_free (s);
Integrace jednodimenzionální funkce • hlavní program cout << "Integral = " << integral << endl; cout << "Odhadchyby = " << err << endl; return 0; }
Integrace dvouimenzionální funkce • funkce z= x2 + y2 na intervalu <0,2> x <0,1> • definuji funkci double funkce(double *x, size_t dim, void *params) { return x[0]*x[0]+x[1]*x[1]; }
Integrace jednodimenzionální funkce • hlavní program intmain (void) { doubleintegral, err; doublexl[2] = { 0,0 }; doublexu[2] = { 2,1 }; constgsl_rng_type *T; gsl_rng *r; gsl_monte_function G = { &funkce, 2, 0 };
Integrace jednodimenzionální funkce • hlavní program size_tpocet_volani = 100000; gsl_rng_env_setup (); T = gsl_rng_default; r = gsl_rng_alloc(T); gsl_monte_plain_state *s = gsl_monte_plain_alloc(2); gsl_monte_plain_integrate (&G, xl, xu, 2, pocet_volani, r, s,&integral, &err); gsl_monte_plain_free (s);
Integrace jednodimenzionální funkce • hlavní program cout << "Integral = " << integral << endl; cout << "Odhadchyby = " << err << endl; return 0; }