PA081 Programování numerických výpočtů Přednáška 2
Sylabus V rámci PNV budeme řešit konkrétní úlohy a to z následujících oblastí: Nelineární úlohy –Řešení nelineárních rovnic –Numerická integrace Lineární úlohy –Řešení soustav lineárních rovnic –Metoda nejmenších čtverců pro lineární úlohy –Sumace obecné a s korekcí Numerické výpočty v C a C++ –Optimalizace výrazů, optimalizace při překladu
Domácí úkol Vytvořte co možná nejlepší program pro výpočet kořenů kvadratické rovnice. Ošetřete všechny problémové situace, které mohou nastat. Program otestujte na rovnici: x x +1 = 0 Programujte ve svém oblíbeném programovacím jazyce. Odevzdejte program a hodnoty kořenů testovací rovnice Datum odevzdání: do Hodnocení: 3%
Domácí úkol 1)Použít vhodný (dostatečný počet desetinných míst) datový typ – např. double v C 2)Vyloučit vstupní hodnoty, pro něž program nefunguje (a = 0, c = 0) 3)Ošetřit záporný diskriminant 4)Použít numericky stabilní algoritmus 5)Nevypisovat na více míst, než je přesnost datového typu
Domácí úkol Navrhněte jinou (numericky stabilní) metodu pro výpočet hodnoty výrazu: (1 - cos x)/x 2 Navrženou metodu otestujte pro x = 1, Datum odevzdání: do Hodnocení: 3% (za první metodu) + 1,5% za další originální metodu (nejvýše 6% na osobu)
Mocninné řady - rovnice (1)
Mocninné řady - rovnice (2)
Nelineární úlohy sin x / x(1) Výraz tvaru: sin x / x Pro malé x platí: Nelze ale x stále zmenšovat – program ohlásí dělení nulou. => Musíme výraz převést do vhodnějšího tvaru
Nelineární úlohy sin x / x(2) Řešení: Využití mocninných řad Problém s využitím mocninných řad: Nepřesnost pro velká x
Nelineární úlohy sin x / x(3) Problém s využitím mocninných řad: Nepřesnost pro velká x x = 0,99
Nelineární úlohy sin x / x(4) Problém s využitím mocninných řad: Nepřesnost pro velká x x = 0,99 Přesný výpočet: sin x / x = 0, … Výpočet pomocí mocninné řady:
Nelineární úlohy sin x / x (5) ? Jak to tedy řešit ?
Nelineární úlohy sin x / x(6) IF |x| > c THEN sin(x)/x ELSE Jak zjistit c?
Nelineární úlohy sin x / x(7) Jak zjistit c? Vím, jakou přesnost požaduji Zajistím, aby měl největší zanedbaný člen mocninné řady (x 6 /7!) menší hodnotu než je daná přesnost.
Nelineární úlohy sin x / x(8) Jak zjistit c? Vím, jakou přesnost požaduji Zajistím, aby měl největší zanedbaný člen mocninné řady (x 6 /7!) menší hodnotu než je daná přesnost. Příklad: Požadovaná přesnost: c 6 /7! = c 0,2821
Nelineární úlohy (1) Výraz tvaru: Pro malé x se jedná o odečítání 2 takřka stejně velkých čísel => Musíme výraz převést do vhodnějšího tvaru Nějaké návrhy?
Nelineární úlohy (2) a) Systematické řešení:
Nelineární úlohy (3) b) „Důmyslné“ řešení:
Nelineární úlohy (1) Výraz tvaru: Pro velké x se jedná o odečítání 2 takřka stejně velkých čísel => Musíme výraz převést do vhodnějšího tvaru Nějaké návrhy?
Nelineární úlohy (2) Výraz tvaru: Úpravy dle definice:
Nelineární úlohy (1) Výraz tvaru: Pro velké x se jedná o odečítání 2 takřka stejně velkých čísel => Musíme výraz převést do vhodnějšího tvaru Nějaké návrhy?
Nelineární úlohy (2) Výraz tvaru: Úpravy dle definice:
Nelineární úlohy (3) Výraz tvaru: Úpravy dle definice:
Domácí úkol Navrhněte metodu, jak určit přesnou hodnotu výrazu: Pro x /2 Otestujte pro x = Pracujte s co nejpřesnější hodnotou . Odevzdejte popis metody a hodnotu výrazu pro testovací hodnou x. Datum odevzdání: do Hodnocení: 3%
Nelineární úlohy (1) Výraz tvaru: Pro b 1 pracujeme s velmi malými hodnotami x a dochází ke ztrátě přesnosti. ‚ x2x2 x1x1 b1b1 b2b2 => Velmi malá změna b způsobí velkou změnu x.
Nelineární úlohy (2) Velmi malá změna b (pro b 1) způsobí velkou změnu x. Příklad: b 1 = 0, b 2 = 0, x 1 = acos(0,987654) = 0, x 2 = acos(0,987655) = 0, Relativní chyba = (x 2 – x 1 )/(b 2 - b 1 ) = 6,38 Čím blíž bude b k 1, tím větší bude relativní chyba
Nelineární úlohy (3) Problém je špatně podmíněný = malý rozdíl ve vstupních datech způsobuje velký rozdíl ve výsledku. Řešení: Musíme si uchovat malá čísla. b nahradíme 1 – e a cos x nahradíme pomocí mocninné řady. cos x = b
Nelineární úlohy (4) Problém převedeme na rekursivní tvar a iterativně hledáme řešení: t = x 2
Nelineární úlohy (5) Rekursivní tvar: Příklad: b = 0,98765 t 0 = 0 t 1 = ?
Věta o pevném bodě (1) Řešení rovnice x = f(x) pomocí rekursivní rovnice x i+1 = f(x i ) Jak tento postup funguje? Vysvětlím na tabuli.
Věta o pevném bodě (2) Řešení rovnice x = f(x) pomocí rekursivní rovnice x i+1 = f(x i ) Kdy lze tento postup použít (jaké jsou podmínky konvergence)? Věta (o pevném bodě): Nechť f: K K je spojitá funkce (kde K je interval v R), pro kterou existuje q < 1 tak, že pro všechna x, y K platí: | f(x) – f(y) | q.| x – y | (tedy f je kontrakce (dx je větší než df(x) )) Pak existuje x* K tak, že pro libovolné x 0 K je x* limitou posloupnosti: x i+1 = f(x i )i = 0, 1, 2, …
Nelineární úlohy (1) Výraz tvaru: Pro malé x při počítání a sčítáme řádově velmi odlišná čísla => ztrácíme přesnost, s jakou bylo původně známo číslo x. => Musíme výraz převést do vhodnějšího tvaru Nějaké návrhy?
Nelineární úlohy (2) Potřebujeme dostat čitatel i jmenovatel do tvaru: 1 e dělíme číslem a získáme výraz: použijeme