Hornerovo schéma. je algoritmus výpočtu hodnoty polynomu P(x) v bodě x 0. eliminuje výpočet i-té mocniny převodem na postupné násobení.

Podobné dokumenty
Šablony funkcí a tříd (Templates) Genericita

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

Množina v C++ (set, multiset).

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Jazyk C++ II. STL knihovna kontejnery část 1

Vector datový kontejner v C++.

Standardní algoritmy vyhledávací.

Funkční objekty v C++.

PB161 Programování v jazyce C++ Přednáška 3

Jazyk C++ II. STL knihovna kontejnery část 2

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

PB161 Programování v jazyku C++

PB161 Programování v jazyce C++ Přednáška 3

Standardní algoritmy v C++.

map, multimap - Asociativní pole v C++.

Konstruktory a destruktory

Více o konstruktorech a destruktorech

PB161 Programování v jazyce C++ Přednáška 10

Kolekce, cyklus foreach

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Programování v C++ 1, 1. cvičení

Mělká a hluboká kopie

PB161 Programování v jazyce C++ Přednáška 10

Množina čísel int stl-set-int.cpp

Programování v C++ 1, 5. cvičení

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Abstraktní datové typy

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Jazyk C++ I. Šablony

PB161 Programování v jazyce C++ Přednáška 6

PB161 Programování v jazyce C++ Přednáška 4

Jazyk C++ I. Šablony 2

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Algoritmizace prostorových úloh

PB přednáška (26. října 2015)

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Programování v C++ 2, 4. cvičení

Programovanie

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Struktura programu v době běhu

přetížení operátorů (o)

IUJCE 07/08 Přednáška č. 6

Algoritmizace prostorových úloh

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Řetězce. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Jazyk C++, některá rozšíření oproti C

Programování v C++ 1, 14. cvičení

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

PB161 Programování v jazyce C++ Přednáška 9

8 Třídy, objekty, metody, předávání argumentů metod

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

přetížení operátorů (o)

Kombinatorická minimalizace

Programování v C++ 1, 6. cvičení

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

1 Nejkratší cesta grafem

Základy programování (IZP)

Úvod do programování - Java. Cvičení č.4

Dynamické datové struktury I.

PB přednáška (23. listopadu 2015)

Pole a kolekce. v C#, Javě a C++

Abstraktní třídy, polymorfní struktury

Zpráva s popisem softwarového návrhu a specifikací rozhraní prototypového modulu pro odhad chyby a zjemnění sítě

Zobrazování 2D Nadpis křivek 2 Nadpis 3

PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

IRAE 07/08 Přednáška č. 7. Začátek (head)

Knihovny pro CUDA J. Sloup a I. Šimeček

Zpracoval:

Generické programování

Abstraktní datové typy: zásobník

Programování v C++ 2, 8. cvičení

ADT/ADS = abstraktní datové typy / struktury

Digitální učební materiál

Programování v C++ 3, 3. cvičení

Funkce, intuitivní chápání složitosti

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Aproximace funkcí. x je systém m 1 jednoduchých, LN a dostatečně hladkých funkcí. x c m. g 1. g m. a 1. x a 2. x 2 a k. x k b 1. x b 2.

Zápis programu v jazyce C#

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Programování v C++ 1, 17. cvičení

Úlohy k přednášce NMAG 101 a 120: Lineární algebra a geometrie 1 a 2,

Jazyk C# a platforma.net

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

konstruktory a destruktory (o)

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

PROGRAMOVÁNÍ V C++ CVIČENÍ

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Transkript:

Hornerovo schéma je algoritmus výpočtu hodnoty polynomu P(x) v bodě x 0 n + n 1 + L + + n n 1 1 P( x) = a x a x a x a eliminuje výpočet i-té mocniny převodem na postupné násobení 0

Vstup: Algoritmus výpočtu polynom stupně n: n n 1 n 1 P( x) = a x + a x + L + a x + a n 1 0 bod x 0 Výstup: hodnota polynomu v bodě x 0 P(x 0 )

Hornerovo schéma princip hodnotu polynomu v bodě x 0 =2 P(2) spočítáme: 5 2) 2) ((3 5 2) 2 (3 5 2 2 3 ) ( 2 2 3 + + = = + + = + + = x x x x x x x x x x P 33 5 2 14 14 2 2 8 8 2 2 3 = + = = +

Hornerovo schéma P( x) = 3x 3 + 2x 2 2x + 5 P(2) =? 3 2-2 5 3*2 +2 =8 8*2-2=14 14*2 +5 = 33

Algoritmus výpočtu 1. Polož i = n, s = a n 2. Je-li i = 0, konec 3. s = s x 0 + a i-1 4. i = i 1 5. Jdi na krok 2 v s je hodnota polynomu v bodě x 0

Příklad P( x) 5 4 = 5x 3x + 2x + 7x x 3 2 + 2 Vypočítejte hodnotu polynomu v bodě x 0 = 3

Eratostenovo síto algoritmus určí všechna prvočísla menší než zadané n vychází z následující úvahy: prvočíslo je dělitelné pouze sebou samým nebo jedničkou, není tedy násobkem žádného menšího přirozeného čísla máme-li např. vypsat všechna prvočísla od 1 do 100, napíšeme si všechna čísla do řádku a postupně vyškrtáme násobky 2, 3,..., n/2; zbylá čísla jsou prvočísla

vyškrtáme násobky 2: vyškrtáme násobky 3: 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 protože je 4 již škrtnutá, násobky 4 škrtat nemusíme, již jsou vyškrtnuté vyškrtáme násobky 5: Eratostenovo síto prvočísla jsou: 2, 3, 5, 7 2 3 4 5 6 7 8 9 10

implementace Eratostenovo síto pomocí pole přirozených čísel, resp. booleovských hodnot prvek pole A[i] má hodnotu 1, je-li číslo i prvočíslo, jinak má hodnotu 0 na počátku inicializujeme prvky na hodnotu 1 (předpokládáme, že všechna čísla jsou prvočísla) v cyklu přiřazujeme prvkům pole s indexy odpovídající násobkům čísel 2, 3,..., n/2 hodnotu 0 algoritmus zrychlit tím, že je-li A[j]=0, již nenulujeme prvky s indexy odpovídající násobkům čísla i (jsou již vynulovány) vypíšeme indexy prvků pole, kde A[j]=1

STL vektory a matice reprezentujeme statickým nebo dynamickým polem problémy s velikostí (přetečením), neznáme-li předem velikost dat, nutnost realokace v C++ existuje knihovna STL (standard template llibrary), která implementuje jako šablony vektor a ostatní ADT (fronta, zásobník)

STL STL je knihovna šablon (generických tříd) implementující zmíněné datové typy fronta, zásobník, seznam, vektor je součástí normy C++

v STL jsou definovány tři skupiny generických tříd: kontejnery představují vlastní ADT vektor, zásobník, fronta, string iterátory třídy, jejichž metody umožňují procházet kontejnery, např. nastavit se na první nebo poslední prvek, postoupit na další atd. algoritmy provádějí inicializaci, třídění, vyhledávání nad kontejnery

každý kontejner má definován vlastní alokátor alokátor řídí přidělování paměti pro kontejnery standardní alokátor je instance třídy allocator, která je definována v STL uživatel si může definovat vlastní alokátory

Kontejnery Kontejner Popis Hlav. soubor bitset sada bitů <bitset> deque oboustr. zakončená fronta <deque> list lineární seznam <list> map ukládá páry klíč/hodnota <map> multimap ukládá páry klíč/hodnoty <multimap> multiset sada (množina) <multiset> priority_queue prioritní fronta <queue> queue fronta <queue> set sada, každý prvek jednozn. <set> stack zásobník <stack> vector vektor (dynamické pole) <vector>

Iterátory objekty, jejichž metody slouží k pohybu po prvcích kontejnerů umožňují např. stejným způsobem procházet vektor, frontu od začátku do konce, od konce k začátku atd. pracuje se s nimi jako s ukazateli (mají přetížené operátory *,++,--) lze je dekrementovat, inkrementovat,

typy iterátorů: dopředný (ForIter) ukládá a získává hodnoty, pohyb vpřed obousměrný(biiter) ukládá a získává hodnoty, pohyb vpřed i vzad vstupní (InIter) získává, ale neukládá hodnoty, pohyb pouze vpřed výstupní (OutIter) ukládá, ale nezískává hodnoty, pohyb pouze vpřed přímý přístup (RandIter) získává a ukládá hodnoty, přímý přístup k prvkům jako u pole

Poznámky: dopředný nemá přetížený operátor - vstupní nemůže být použit na levé straně přiřazovacího příkazu

Vektor deklarace v souboru <vector>: template<class _Ty,class _Ax = allocator<_ty> > class vector konstruktory vector(const _Alloc& _Al) vector(size_type _Count, const _Ty& _Val) vector(size_type _Count, const _Ty& _Val, const _Alloc& _Al)

reference front() Příklad metod vrací odkaz na první prvek vektoru (reference je datový typ představující odkaz) typedef T& reference; void clear() odstraní všechny prvku vektoru iterator insert(iterator _Where, const _Ty& _Val) vloží prvek Val před (?) prvek označený Where insert je 3x přetíženo

void insert(iterator _Where, const Ty& val = Ty()); vloží 1 prvek void insert(iterator _Where, size_type n, const Ty& val = Ty()) vloží n kopií prvku template<class InputIterator> void insert(iterator _Where, InputIterator zacatek, InputIterator konec); vloží prvky z jiného iterátoru

reference back() vrací referenci na poslední prvek void push_back() vloží nový prvek "za" konec void pop_back() odebere prvek z konce vektoru

Použití #include <vector> using namespace std; void main(void) { vector<int> v; // vytvori prazdny vektor for(int i=0;i<10;i++) v.push_back(i); for(int i=0;i<10;i++) cout << v[i] << ' '; }

Použití include <vector> using namespace std; void main(void) { vector<int> v(10); // vytvori vektor o 10 polozkach for(int i=0;i<10;i++) v[i] = i; for(int i=0;i<10;i++) cout << v[i] << ' '; }

Použití include <vector> using namespace std; void main(void) { vector<int> v(10,5); // nastavi vsechny prvky vektoru na 5 for(int i=0;i<10;i++) v[i] = i; for(int i=0;i<10;i++) cout << v[i] << ' '; cout << "\npocet prvku ve vektoru: "; cout << v.size(); }

přístup přes iterátor vector<int>::iterator p=v.begin(); while(p!= v.end()) { cout << *p << ' '; p++; }

Poznámky: všechny kontejnery jsou ve jmenném prostoru std parametrem <bitset> je počet bitů, nikoliv typ template <size_t N> class { } bitset

každý kontejner má veřejné metody: begin vrací iterátor na počáteční prvek. empty - vrací true, jestliže je kontejner prázdný. end vrací iterátor za poslední prvek max_size - vrací maximální možnou velikost kontejneru. size - vrací aktuální velikost kontejneru. swap - zajistí výměnu prvků s jiným kontejnerem

Algoritmy funkce jsou definovány v hlavičkovém souboru algorithm dělení algoritmy nepracující s kontejnery min, max, swap parametry jsou reference na typ kopírující algoritmy copy, copy_backward kopírují části kontejnerů určené iterátory

přesouvací algoritmy remove, remove_if odstraňují prvky remove_copy, remove_copy_if kopíruje prvky do jiného kontejneru vyhledávací algoritmy find a další generování permutací next_permutation(bidit f, BidIt l) pěkný přehled je na http://www.cplusplus.com/

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 Fourier Transforms) 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 b x I S = N N I N I = I N ( b a) d

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ů N I, 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 1. volání inicializačních a alokačních funkcí 2. použití vlastních funkcí numerickým metod 3. volání dealokačních funkcí

Inicializace Funkce pro základní metodu gsl_monte_plain_state *gsl_monte_plain_alloc (size_t dim) parametry dim dimenze funkce, kterou integruji návratová hodnota ukazatel na strukturu gsl_monte_plain_state

Funkce pro základní metodu Výpočet int gsl_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 strukturu gsl_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

Dealokace Funkce pro základní metodu void gsl_monte_plain_free (gsl_monte_plain_state * s) praktická ukázka na cvičení

Integrace jednodimenzionální funkce funkce y = x 2 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 int main (void) { double integral, err; double xl[1] = { 0 }; double xu[1] = { 2 }; const gsl_rng_type *T; gsl_rng *r; gsl_monte_function G = { &funkce, 1, 0 };

Integrace jednodimenzionální funkce hlavní program size_t pocet_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 << "Odhad chyby = " << err << endl; } return 0;

Integrace dvouimenzionální funkce funkce z = x 2 + y 2 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 int main (void) { double integral, err; double xl[2] = { 0,0 }; double xu[2] = { 2,1 }; const gsl_rng_type *T; gsl_rng *r; gsl_monte_function G = { &funkce, 2, 0 };

Integrace jednodimenzionální funkce hlavní program size_t pocet_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 << "Odhad chyby = " << err << endl; } return 0;