At line 1 changed 1 line. |
[{ColorTitle |
[{ALLOW view All}] |
[{ALLOW edit,upload Trusted}] |
[{ColorTitle bgcolor='#F6931B' |
At line 7 added 3 lines. |
%%(text-align: right) |
[Předchozí|Math5] [Další|Math7] [Obsah|Math]%% |
|
At line 15 added 99 lines. |
|
[{nbsp count='5'}][Math6/index_gr_1.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_2.gif] |
|
A je určen k řešení polynomiálních rovnic. Při transcendentních rovnicích řešení nalezeno není: |
|
[{nbsp count='5'}][Math6/index_gr_3.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_4.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_5.gif] |
|
V tuto chvíli je na místě otázka rozdílu mezi příkazy __FindRoot__ a __NSolve__. Pokud je problém polynomiální, příkaz NSolve najde všechna komplexní řešení, navíc nemusím omezit obor hodnot proměnné, kterou hledám. |
|
Pokud se v rovnici argumentu příkazu FindRoot nevyskytuje formálně komplexní číslo /Mathematica považuje číslo 1 za reálné a číslo 1+0*I za číslo komplexní/, obdržím 1 reálný kořen. |
|
[{nbsp count='5'}][Math6/index_gr_6.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_7.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_8.gif] |
|
Příkaz __LinearSolve__[[matice,vektor pravých stran] řeší maticovou rovnici matice*x=vektor pravých stran |
|
[{nbsp count='5'}][Math6/index_gr_9.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_10.gif] |
|
Úloha pro zvídavého čtenáře: Čím je tato soustava zvláštní? Má takto konstruovaná soustava vždy celočíselné řešení? |
|
Zároveň jsme se naučili syntaxi jednoho způsobu zadávání matic. |
|
[{nbsp count='5'}][Math6/index_gr_11.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_12.gif] |
|
Vidíme, že řešení je v symbolickém tvaru. |
|
Příkaz __MainSolve[[...]__ slouží k sofistikovanějším operacím se soustavami lineárních rovnic /eliminace vybraných proměnných, transformace do jiných proměnných a podobně. |
|
[{nbsp count='5'}][Math6/index_gr_13.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_14.gif] |
|
Čili ze soustavy rovnic chceme vyjádřit vztah mezi proměnnými x,y,a, proměnná z se ve výsledku nemá vyskytovat. Takto kladený požadavek není vždy splnitelný, v tom případě se stává příkaz __MainSolve[[..]__ funkcí typu boolean s hodnotou False. |
|
Podívejme se dále na příkaz __DSolve__. Jsme již zkušenější a nepotřebujeme příklad. Umíme používat nápovědu...čili: |
|
[{nbsp count='5'}][Math6/index_gr_15.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_16.gif] |
|
Tak to zkusíme, ne? Ale jak zapsat derivaci...jasně, derivace je anglicky derivative. Jestli tenhle přikaz v M. existuje, bude začínat velkým písmenem; to už víme. |
|
[{nbsp count='5'}][Math6/index_gr_17.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_18.gif] |
|
Takže vidíme, že pro začátek vystačíme s čárkou. Což takhle elektrický obvod: |
|
[{nbsp count='5'}][Math6/index_gr_19.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_20.gif] |
|
A vida! Máme obecné řešení. Kdybychom chtěli, aby i[[0]==i0 ...už umíme, aby M. pracovala s více objekty, jako s jedním: použijeme složené závorky! |
|
[{nbsp count='5'}][Math6/index_gr_21.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_22.gif] |
|
A vidíme, nebolelo to. |
|
O poslední při příkazy zůstanete ochuzeni; poslední je systémový a podle mého názoru neužitečný... koneckonců umíte používat help, ne? |
|
Zastavme se ještě u příkazu NDSolve. Už víme, nebo tušíme, že to bude příkaz k řešení /Solve/ diferenciálních /D/ rovnic a toto řešení bude numerické /N/. |
|
/Analyticky řešitelných diferenciálních rovnic je nejvýše alef jedna, celkem je diferenciálních -rozuměj obyčejných diferenciálních rovnic konečného řádu- alef dva. Tedy téměř žádné diferenciální rovnice nejsou analyticky řešitelné; příkaz NDSolve nám pomůže se řešení přiblížit./ |
|
__WARNING:__ Jde o __numeriku__; řešení samo existovat nemusí /podaří-li se vám zadat pravou stranu jako nespojitou funkci ve více než konečném počtu bodů/, nemusí být jediné /nesplníte-li Lipschitzovu podmínku/; přesto vám numerické metody nějaké řešení obvykle nabídnou. S řešením dané rovnice toto řešení nemusí mít nic společného. Mathematica je inteligentní systém; potřebu inteligence uživatele však eliminovat neumí. |
|
Takže pro začátek zkusíme rovnici u níž řešení známe. A zároveň si napíšeme "prográmek" v Mathematice. |
|
[{nbsp count='5'}][Math6/index_gr_23.gif] |
|
__rovnice__ je samotná diferenciální rovnice, __podminka__ je její okrajová podmínka. |
|
Protože budeme chtít výsledek vytisknout přes celý obor řešení, tento obor si zadefinujeme. |
|
[{nbsp count='5'}][Math6/index_gr_24.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_25.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_26.gif] |
|
Příkaz NDSolve vytvoří interpolační funkci; ta má strukturu datovou a nelze s ní jednoduše pracovat. Proto příkazem |
|
[{nbsp count='5'}][Math6/index_gr_27.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_28.gif] |
|
vytvoříme "tisknutelnou" funkci. Příkaz __Evaluate[[oborreseni]__ |
|
způsobí, že příkaz __Plot__ dosadí za objekt __oborreseni__ hodnotu {x,0,5}. |
|
Pokud je vám tento prográmek jasný, je vše v pořádku. Pokud ne, zkuste si projít a provést jednotlivé příkazy postupně, bez středníků, abyste viděli výsledky. pokud chcete "vidět" proměnnou definovanou pomocí __SetDelayed__, jednoduše si ji necháte zobrazit vypsáním jejího označení na další řádek a vyhodnocením onoho řádku: |
|
[{nbsp count='5'}][Math6/index_gr_29.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_30.gif]\\ |
[{nbsp count='5'}][Math6/index_gr_31.gif] |
|
Takto později budete tvořit programy: nejprve řádek po řádku s vypisováním výsledků, poté rušení jinak zbytečných výpisů a sdružování příkazů do větších celků. |
|
[6.notebook|Math6/zacmath6.nb] |