My hledáme v ženách především duši, ale pak si vezmeme tělo. Činíme jako lovci perel: otvírají škebli; naleznou-li perlu, tím lépe, nenaleznou-li ji, snědí měkkýše.
-- Pitigrilli |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
■ Diskuzní fórum
■ Pískoviště ■ Poslední změny ■ Registrace ■ Etický kodex ■ Nápověda ■ Administrace ■ Hlášení chyb © 1999-2008 HEAT JSPWiki v2.4.104
|
This is version 6.
It is not the current version, and thus it cannot be edited.
[Back to current version] [Restore this version]
Solve II.Dále již budeme stručnější: postupně pronikáme do logiky M. a tak si to můžeme dovolit. Příkaz NSolve má syntaxi NSolve[rovnice,proměnná] A je určen k řešení polynomiálních rovnic. Při transcendentních rovnicích řešení nalezeno není: 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. Příkaz LinearSolve[matice,vektor pravých stran] řeší maticovou rovnici matice*x=vektor pravých stran Ú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. 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ě. Č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: 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. Takže vidíme, že pro začátek vystačíme s čárkou. Což takhle elektrický obvod: 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! 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.
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. Příkaz NDSolve vytvoří interpolační funkci; ta má strukturu datovou a nelze s ní jednoduše pracovat. Proto příkazem 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: 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ů. Přílohy
|