Mathematica

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Wolfram Mathematica (dříve Mathematica, vyslovuj [matematika], dále též „editor“) je počítačový program původně určený pro provádění matematických, vědeckých a technických výpočtů. V současnosti se jedná o vývojové prostředí programovacího jazyka Wolfram Language, jenž nabízí funkcionalitu z mnoha oblastí jako jsou matematické výpočty, numerické simulace, zpracování a vizualizace dat, strojové učení, tvorba webových stránek, úprava videa a zvuku, generování dokumentů atd. Tento program je od roku 1988 vyvíjen jako komerční produkt americkou softwarovou společností Wolfram Research, spoluzaloženou a vedenou Stephenem Wolframem.

Samotné jméno „Mathematica“ navrhl Steve Jobs a zpočátku toto jméno označovalo jak program, který slouží pro vyhodnocování uživatelem zadaných příkazů, tak i sadu příkazů samotnou. S verzí 10. +more0 došlo k oddělení těchto dvou konceptů - zatímco editor samotný se stále jmenuje Mathematica, programovací jazyk, který tento program implementuje, se nazývá Wolfram Language. Přesné rozdělení nebylo nicméně společností Wolfram Research jasně vymezeno, což vedlo k jistému zmatení v názvosloví, pro podrobnosti viz oddíl „Pojmenování“ v článku Wolfram Language. Popis programovacího jazyka Wolfram Language lze nalézt na jeho vlastní stránce, tato stránka se věnuje především uživatelskému prostředí editoru Mathematica.

Editor neslouží pouze k vývoji a vyhodnocování kódu. Lze v něm přehrávat zvuk, sledovat video, kreslit dvourozměrnou grafiku a interagovat s grafikou trojrozměrnou. +more Kód lze seskupovat do hierarchicky uspořádaných celků, z nichž některé lze skrýt pro zvýšení čitelnosti ostatního kódu. V Mathematice lze dále psát textové dokumenty, kde lze text dělit do kapitol s různými úrovněmi nadpisů, dodávat číslování stránek a nastavovat prvky známé z textových procesorů. Lze v ní i vytvářet prezentace ve stylu programu PowerPoint. Od verze 13 lze v Mathematice automaticky analyzovat zdrojový kód a vytvářet pro něj dokumentaci.

Mathematica je dostupná pro operační systémy Microsoft Windows, macOS a Linux. Přibližně od roku 2017 se vlajkovým produktem společnosti Wolfram Research pro nové uživatele postupně stává systém Wolfram One, přičemž Mathematica získává roli produktu pro stávající uživatele. +more Pokud má uživatel založený účet u společnosti Wolfram Research, může editor propojit se svým cloudovým účtem a kód vyvíjený lokálně na svém počítači může nahrát přímo z editoru na cloud. V následujícím je popisována verze Mathematicy 13, pokud není vysloveně uvedeno jinak.

...
...
...

Podobný a konkurenční software

Pro práci s jazykem Wolfram Language existuje kromě Mathematicy několik dalších programů, většinou vyvíjených společností Wolfram Research. Alternativou k Mathematice, která je jí nicméně velmi podobná, je program WolframOne. +more Omezenější možnosti nabízí Wolfram Cloud, který je přístupný přímo z webového prohlížeče. V prostředí příkazové řádky lze s Wolfram Language pracovat pomocí programů WolframKernel či wolframscript. Pro profesionální práci slouží pak plugin Wolfram Workbench pro vývojové prostředí Eclipse, který je vyvíjen společností Wolfram Research, a plugin pro Wolfram Language ve vývojovém prostředí IntelliJ IDEA, vyvíjený společností JetBrains.

Silnou stránkou Wolfram Language jsou symbolické výpočty. V tomto ohledu je přímým konkurentem Mathematicy program Maple s podobným zaměřením, jenž je vyvíjen firmou Maplesoft. +more Open-sourceovými alternativami k těmto dvěma komerčním produktům jsou pak Maxima a SageMath. Wolfram Language ale nabízí i numerické výpočty, a v tomto ohledu je Mathematica často srovnávána s programem MATLAB vyvíjeným společností MathWorks, jehož původním zaměřením byla práce s numerickými maticemi. V oblasti numerických výpočtů je MATLAB často zřetelně rychlejší než Mathematica. Oba tyto produkty se také často srovnávají s numerickými a symbolickými knihovnami jazyka Python, jehož výhodou je široká uživatelská základna a to, že se jedná o otevřený software.

Koncept notebooků jako výpočetního prostředí byl z Mathematicy převzat dalšími projekty, přičemž nejvýraznějším představitelem je patrně Jupyter, což je open source projekt umožňující zobrazovat notebook ve webovém prohlížeči a výpočty zasílat do výpočetního jádra v různých programovacích jazycích. V Jupyteru lze pracovat i s jazykem Wolfram Language, ačkoli s omezenou funkcionalitou.

Struktura programu

Uživatelské prostředí

Vývojové prostředí má podobu prázdného okna, označovaného jako notebook (viz níže), na jehož horním okraji je hlavní menu obsahující nabídky s různou funkcionalitou. Rozesazení ovládacích prvků tak má podobné uspořádání jako např. +more v programech balíku Microsoft Office. Takto nabízená funkcionalita je rozebrána v základních obrysech níže v oddíle #Přehled funkcionality|„Přehled funkcionality“. Do prázdného okna se vypisují příkazy psané v jazyce Wolfram Language, čímž se vytvářejí skripty, které jsou při vyhodnocení interpretovány výpočetním jádrem Mathematicy. Velikost písma v okně lze přizpůsobit nastavením odpovídajícího zoomu. Pro vyvolání nápovědy lze kromě odpovídající nabídky využít i klávesy .

V Mathematice existují tři způsoby rozvržení vývojového prostředí, kde každé z nich zobrazí tentýž kód odlišně - výchozím rozvržením je prostředí working (to jest pracovní), které klade důraz na přehlednost kódu. Pro tvorbu prezentací, viz níže, je použito prostředí slideshow, kde je kód rozdělen do jednotlivých snímků, jež se mají zobrazit jeden po druhém. +more Konečně pro tisk je určeno prostředí printout, jež bere v potaz rozměry stránky, na níž se má tisknout, její okraje apod. Kód lze v rámci daného rozvržení dále zobrazovat a zadávat v různých formátech - vstupní kód se obyčejně vkládá ve formátu InputForm, výstup je formátován ve formě StandardForm, apod. Pro podrobnosti viz oddíl #Formátování kódu|„Formátování kódu“.

V minulosti se pojmem Mathematica označoval i programovací jazyk implementovaný programem Mathematica. Od verze 10. +more0 se jazyk nazývá Wolfram Language a pro jeho popis proto čtenáře odkážeme na odpovídající článek. K většině funkcionality popsané v tomto článku lze přistupovat jednak přes uživatelské rozhraní, jak rozebráno níže, jednak i programově pomocí nejrůznějších příkazů. Například nový notebook lze vytvořit z již existujícího notebooku příkazem CreateNotebook či CreateDocument, globální volby lze nastavit příkazem SetSystemOptions. Příkazy uživatele lze zabalit do výrazů s hlavičkou FrontEndToken a ty poté provést voláním funke FrontEndExecute. Popřípadě lze rovnou použít příkaz FrontEndTokenExecute. Styl textu jako barvu, řez, font apod. lze programově upravit pomocí výrazu Style atd.

Koncept notebooků

Výchozím pracovním prostředím pro psaní kódu v Mathematice je tak zvaný notebook, kde je kód strukturován do hierarchie elementárních částí zvaných buňky (angl. cells). +more Příkazy jsou psány do vstupních buněk a po vyhodnocení vstupní buňky je výsledek výpočtu vrácen do výstupní buňky, která se automaticky pod tou vstupní vytvoří. Buňky lze dále seskupovat do větších celků a utvářet tak strukturu kódu podobnou kapitolám a podkapitolám známým z psaných knih. Buňky plní různé role, lze vkládat i čistě textové buňky či nadpisy. Tyto buňky nejsou při běhu chodu vyhodnoceny a mohou tak zastupovat funkci komentářů. Viz též oddíl #Struktura notebooků|„Struktura notebooků“ níže.

Koncept notebooku jako druhu pracovního prostředí rozděleného do buněk vynalezl Theodore Gray, spoluzakladatel společnosti Wolfram Research. Toto pracovní prostředí umožňuje flexibilní interakci uživatele s kódem a jeho výstupem. +more Notebook je při uložení zapsán do textového souboru s příponou . nb, kterému se také může říkat notebook. Tento textový soubor obsahuje kromě metadat především výraz s hlavičkou Notebook, v jehož těle je uložen samotný kód, výstup a doprovodné informace. Konečně, na otevřený notebook se dá odkazovat přímo v kódu pomocí výrazu NotebookObject. Notebook jako pracovní prostředí je implementován front endem. Bližší podrobnosti k notebookům jsou podány dále v článku.

Notebooků existuje několik druhů. Kromě základní verze lze uzpůsobovat vzhled i chování prvků daného notebooku a vytvářet tak knihy, seznam poznámek, vědecké články apod. +more Speciální notebook je určen pro tvorbu prezentací. Mathematica dále nabízí notebooky pro tvorbu dotazníků, notebooky pro jednotkové testy, či notebooky pro tvorbu šablon, kde je do předpřipravených polí programově dodán obsah. Dále lze využít notebooků s více vývojářsky orientovanou podobou pro tvorbu balíků a nízkoúrovňových skriptů. Dokumentace pro funkce a symboly v Mathematice má také formu notebooků, kde lze přímo v dokumentaci interagovat s kódem či ho rovnou přepisovat. V neposlední řadě se k tomu určené notebooky používají pro tvorbu zdrojů a funkcí určených do online repozitářů.

Jádro a front end

Výpočetní systém je rozdělen do dvou částí - jádra a front endu. Jádro (angl. +more kernel) se stará o samotné vyhodnocování kódu a provádění výpočtů, zatímco front end slouží k interakci s uživatelem a poskytuje grafické uživatelské rozhraní. Interakcí se přitom nemyslí jen vypisování číselných a jiných výsledků, ale i podpora náročných interaktivních widgetů, přehrávání videa a zvuku, apod. Například vykreslovaná 3D grafika reaguje rotací na tažení kurzoru uživatelem, v případě 2D grafiky lze tuto kreslit myší přímo do uživatelského rozhraní atd. Změny ve front endu se neprojeví ve výpočtech dokud nejsou tyto odeslány do jádra. Příkazy se přitom vyhodnocují v pořadí ve kterém byly do jádra zaslány, ne tedy nutně ve stejném pořadí, ve kterém jsou vypsány ve front endu. S tím souvisí i fakt, že při úpravě kódu, např. při změně definice nějaké funkce, nemusí aktuální verze kódu odpovídat definicím, které jsou v jádře uloženy z předchozího provedení kódu. To může z pohledu uživatele občas vést k neočekávaným výsledkům.

Vypíše-li uživatel do front endu kód, je tento kód předzpracován a v upravené formě zaslán front endem do jádra pomocí protokolu WSTP (Wolfram Symbolic Transfer Protocol, dříve známý pod jménem MathLink). Po skončení výpočtu zašle stejným protokolem poté jádro výsledek zpět do front endu, který tento výsledek vhodně naformátuje a vykreslí uživateli. +more Tento model tak připomíná klient-server síťovou architekturu, ačkoli se od ní odlišuje, viz níže. Protokol WSTP slouží i pro předávání vstupů a výstupů mezi výpočetním jádrem a externí aplikací, která může být napsána v jiném jazyce. Součástí Mathematicy jsou například takováto propojení s jazyky Java (knihovna J/Link), R (knihovna RLink) či s . NET frameworkem (knihovna . NET/Link). Z jednoho front endu lze kontrolovat více výpočetních jader a podobně jedno jádro může obsluhovat vícero front endů.

Přesněji vzato, mezi front endem a jádrem existují tři propojení - hlavní (angl. main link), preemptivní (angl. +more preemptive link) a servisní (angl. service link). Hlavní spojení se stará o zasílání příkazů zadaných uživatelem do jádra a následné navrácení výsledků zpět do front endu. Front end udržuje frontu čekajících žádostí o vyhodnocení, které mají být poslány do jádra. Mezitím přitom zůstává front end plně funkční a lze s ním pracovat - uživatel do něj může psát, může otevírat a ukládat soubory apod. Výpočet zaslaný do jádra hlavním propojením může trvat libovolně dlouho, není zde nastaven žádný limit na dobu vyhodnocování. Preemtivní spojení funguje odlišně - na straně front endu není žádná fronta čekajících příkazů. Místo toho zasílá toto spojení příkazy do jádra rovnou a po zaslání jednoho příkazu vždy čeká, dokud neobdrží výsledek. Mezitím je front end uzamčen a žádná interakce s uživatelem není možná. Na straně jádra pak je příkazům přicházejícím z preemtivního spojení dána přednost před příkazy ze spojení hlavního. Pokud požadavek na vyhodnocení přijde do jádra v době, kdy zrovna zpracovává úlohu z hlavního spojení, je tato úloha na potřebnou dobu přerušena. Preemtivního spojení je užíváno pro implementaci interaktivních prvků jazyka Wolfram Language, především pak výrazu Dynamic a jeho nadstaveb jako Manipulate. Konečně servisní spojení slouží pro zasílání požadavků z jádra do front endu.

Struktura notebooků

Příklad notebooku otevřeného v okně Mathematicy. Notebook se skládá z buněk obsahující kód ve Wolfram Language.

Buňky

Při vyhodnocování zdrojového kódu jsou příkazy ze vstupních buněk zasílány do výpočetního jádra, jednu buňku po druhé. Při vyhodnocení dostane daná buňka pořadové číslo, které si ponechává až do konce běhu výpočetního jádra. +more Daná vstupní buňka je pak uvozena řetězcem "In[n]:=", kde n je její pořadové číslo. Výstup kódu obsaženého v takové buňce je vypsán pod tuto buňku do nové výstupní buňky, jež je uvozena řetězcem "Out[n]=". Tyto řetězce připomínají prompt z příkazové řádky a je-li místo Mathematicy pro vývoj kódu použita právě příkazová řádka, tak promptem tyto řetězce skutečně jsou.

V těle funkce a podobných konstruktů se musí každý příkaz zakončit středníkem. Toto však není nutností, jsou-li příkazy psány jednotlivě po řádcích rovnou do editoru. +more V takovém případě se za vstupní buňku vypíše ve stejném pořadí výsledek každého řádku. Konkrétní kód v editoru pak může vypadat následovně:.

In[1]:= promenna = 0.2 Out[1]= 0.2

In[2]:= obsahKruhu = Pi*polomer^2;

In[3]:= 1 + 2*3 Out[3]= 7

Všimněme si, že napsáním středníku za příkaz se zamezí vypsání jeho výsledku. Tento výsledek je ale i přesto uložen do Out výrazu, v případě výše tedy Out[2] = 0. +more125664. Každá buňka je uvozena takovýmito značkami. Ve zbytku článku jsou tyto nicméně pro přehlednost vynechávány.

Interně je každá buňka představována konstruktem Cell[obsah, styl, volby], kde obsah může být buď čistý text, anebo strukturovanější data zabalená do výrazu s hlavičkou BoxData; styl označuje styl buňky, jako například vstupní ("Input"), výstupní ("Output"), textová ("Text"), titul ("Title") apod. ; a volby jsou dodatečná nastavení buňky, jakým může být například barva pozadí, čas poslední změny dané buňky či identifikační číslo buňky. +more Buňka tedy obsahuje více informací, než které jsou uživateli v editoru přímo přístupné a z tohoto pohledu nelze kód notebooku označit jako WYSIWYG. Buňkám lze dále nastavovat různé vlastnosti. Lze nastavit, zda je buňka upravovatelná, čímž se uzamkne pro dodatečné úpravy, či zda je vyhodnotitelná, čímž není zasílána do výpočetního jádra, či zda je určená pro koncové použití uživatelem bez možnosti některých druhů interakce. Pořadí vyhodnocení buněk lze změnit jednoduše tak, že uživatel vybere a pošle k vyhodnocení jednotlivé buňky ručně. Jiným, systematičtějším, způsobem je označit některé buňky jako inicializační buňky (angl. initialization cells). Tyto buňky jsou vyhodnoceny jako první při spuštění výpočetního jádra a až po nich je vyhodnocen zbytek buněk jedna po druhé.

Strukturování kódu

Buňky lze sdružovat do větších celků, kterým lze dávat nadpisy, a vytvořit tak hierarchickou strukturu buněk, která může sloužit k přehlednějšímu rozdělení kódu. Nadpisy v hierarchii lze navíc formátovat různým způsobem. +more Editor dále umožňuje jednotlivé sekce kódu zavřít tak, že se kód v této sekci skryje aniž by došlo k jeho smazání. Lze tak skrýt buňky v různých úrovních hierarchie a vždy ponechat jen právě používanou sekci. Tímto způsobem lze do jednoho souboru vložit velké množství zdrojového kódu bez toho, aniž by se neúměrně zvýšila těžkopádnost práce s kódem. Související informace lze nalézt v oddíle #Tvorba psaných dokumentů|„Tvorba psaných dokumentů“ níže.

Dvě a více buněk lze v případě potřeby sloučit od jedné anebo lze část kódu z již existující buňky vydělit a udělat z něj buňku novou. Namísto slučování lze buňky pouze seskupit. +more Příslušnost dané buňky do skupiny se pozná podle tzv. buňkové závorky (angl. cell bracket), což je dekorovaná svislá čára na pravé straně okna, která se táhne přes výšku celé buňky, celé podskupiny, skupiny atd. jak je ukázáno na obrázku vpravo výše. Danou skupinu lze přitom zavřít poklepáním na její závorku tak, že je viditelný pouze nadpis dané skupiny anebo jen jedna konkrétní buňka. Zavřenou skupinu lze opětovným poklepáním na její závorku znovu otevřít.

Pro ilustraci použijme následující příklad, kde podbarvený text níže připomíná formátovaný text a zdrojový kód v Mathematice:

Toto je titul První sekce

Spočti výsledek následujícího výrazu:
\frac{12}{3} Další sekce a = 2

Text a kód jsou sdruženy pod titulem, jenž zní „Toto je titul“ a jenž je dále rozdělen do dvou sekcí, z nichž první má nadpis „První sekce“ a druhá zní „Další sekce“. V první sekci je použit prostý text „Spočti výsledek následujícího výrazu:“, jenž je ohraničen rámečkem. +more Pod tímto textem je jako vstupní kód vložen zlomek 12/3, který je formátován tak, že čitatel je vykreslen nad vodorovnou zlomkovou čárou a jmenovatelem přesně tak, jaká je zvyklost v matematice. Dále je tento kód nastaven tak, aby se vyhodnotil před ostatním kódem jako inicializační buňka. Konečně ve druhé sekci se nachází kód a = 2, který jako inicializační buňka nastavený není.

Přehled funkcionality

Následující rozdělení do tematických okruhů je jen orientační, mnoho funkcí z jednoho okruhu lze použít i v okruzích ostatních. Dále není v následujícím příliš rozlišováno mezi Mathematicou a jazykem Wolfram Language - v mnoha případech je tatáž funkčnost dostupná jednak z nabídky editoru, jednak jako příkaz programovacího jazyka.

Vývoj kódu

Editor umožňuje komentovat kód, dynamicky doplňovat rozepsaný výraz, zobrazit nízkoúrovňovou variantu vypsaného kódu či výsledku atd. Tlačítko „zpět“ vrací pouze změny provedené ve front endu a změny, které byly již odeslány do jádra, tak nejsou tímto tlačítkem ovlivněny. +more Dále lze zobrazit historii úprav notebooku či okno, do nějž se vypisují chybová hlášení, která nejsou běžně vypisována přímo do notebooku. Vybrané buňce lze přiřadit dodatečný popisek (angl. cell tag), který může sloužit k vytváření skupin stejně označených buněk, což může dále usnadňovat jejich manipulaci. Mathematica nabízí debugger a od verze 13 analýzu kódu, jež sleduje například, zda jsou využity všechny deklarované lokální proměnné, zda nelze kód zjednodušit apod. Od verze 13 lze dále uzpůsobit formátování kódu a je možno vytvářet dokumentaci způsobem typickým pro vestavěné funkce. Je k dispozici též speciální druh notebooků určený pro tvorbu jednotkových testů. Nastavení nejrůznějších voleb prostředí lze provádět buď pomocí příkazů vepsaných do notebooku nebo ručně výběrem v nástroji option inspector.

Historicky byla Mathematica, jak ostatně její název napovídá, určena především pro práci s matematickými výrazy a funkcemi. Z tohoto důvodu obsahuje tento editor dodatečnou funkcionalitu vztahující se právě k matematice. +more Vyvolat lze palety nástrojů pro zadávání speciálních symbolů, operátorů nebo písmen alfabety. Dále lze pomocí klávesových zkratek vkládat matice, horní a dolní indexy, či matematické vzorce ve značkovacím jazyce TeX. Podporována je široká škála speciálních znaků, jež lze vkládat pomocí aliasů či jejich jmen.

Pokud má sloužit za vstup obrázek, lze tento buď načíst z externího souboru, anebo ho přímo uložit do notebooku a přiřadit ho nějaké proměnné. Mathematica umožňuje „drag and drop“ a obrázek tak lze do notebooku vložit čistě tak, že ho uživatel myší přetáhne z daného souboru přímo do okna editoru.

Dodatečnou funkcionalitu lze do Mathematicy doplnit různými způsoby. Lze nahrát do aktuálního běhu jádra balík s kódem, lze k samotnému jádru připojit dynamické knihovny pomocí sady funkcí LibraryLink, lze ale též instalovat externí aplikace, které s jádrem komunikují protokolem WSTP. +more Dále je podporováno vkládání kódu v jiných jazycích přímo do notebooku. Takto lze například do speciální buňky vložit kód v Pythonu. Při vyhodnocení buňky je tento kód zpracován externím programem, v tomto případě výpočetním jádrem Pythonu, a výsledek je navrácen do notebooku už jako výraz interpretovaný v jazyce Wolfram Language.

Vyhodnocování kódu

Kód lze vyhodnocovat po jednotlivých buňkách. Stisknutím kláves + je kód z dané buňky zaslán do výpočetního jádra. +more Výsledek je pak vepsán pod danou buňku. Alternativně lze kód nahradit jeho výsledkem v dané buňce, což je označováno jako evaluate in place a provede se klávesami + + . Trvá-li výpočet dané buňky dlouhou dobu a uživatel potřebuje v mezičase vyhodnotit nějaký jiný krátký úsek kódu, lze toto provést vybráním daného kódu a stisknutím klávesy , čímž se na chvíli přeruší probíhající výpočet a jádro spočte daný úsek kódu. Po navrácení výsledku se jádro automaticky vrátí k původnímu výpočtu. Tento druh vyhodnocení kódu se nazývá evaluate in subsession. Výpočet lze též předčasně ukončit či přerušit. V případě dlouhých notebooků s mnoha buňkami umožňuje editor najít právě vyhodnocovanou buňku.

Někdy může provádění dynamických výrazů neúnosně zatěžovat jádro, což může vést k zamrzání front endu. V takových případech lze vypnout vyhodnocování dynamických prvků v notebooku. +more Notebook obsahuje nejen vstupní kód, ale vypisují se do něj i odpovídající výsledky výpočtu jako jsou čísla, seznamy či obrázky. Velikost souboru s kódem tak může tímto způsobem značně vzrůst a klást tak větší nároky na pamět. Editor tak umožňuje smazat naráz veškerý výstup všech buněk v notebooku. Pokud je naopak žádoucí, aby byl daný kus kódu či výsledek v notebooku uložen, lze tento zabalit do výrazu Iconize, což lze provést i klávesovou zkratkou.

Z nabídek editoru lze konfigurovat výpočetní jádro a v případě potřeby ho vypnout či zapnout bez nutnosti zavření okna notebooku. Lze nastavit, jaké jádro se má pro daný notebook použít, protože jedno jádro může například obsluhovat několik různých notebooků a definice provedené v jednom notebooku se tak projeví v notebooku druhém. +more Pro oddělení funkčnosti obou notebooků lze buď každému nastavit jiné jádro, anebo lze místo toho každému notebooku přiřadit unikátní jmenný prostor (v Mathematice označovaný jako kontext, angl. context) tak, že symbol definovaný v daném notebooku je automaticky kvalifikován odpovídajícím kontextem. V případě paralelizovaných výpočtů pak lze nastavit způsob, jakým mají být paralelní jádra použita, a lze sledovat jejich aktuální činnost a zátěž.

Formátování kódu

Ve výchozím nastavení umožňuje Mathematica uživateli nastavit vzhled různých částí uživatelského prostředí tak, že informace o tomto vzhledu je uložena přímo do souboru obsahujícího zdrojový kód. Hranice mezi specifikací vzhledu a zdrojovým kódem je navíc tenká, protože zdrojový kód samotný může tyto nízkoúrovňové specifikace měnit. +more Vzhled lze buď měnit globálně pro všechny buňky daného typu pomocí stylopisů uvedených ve volbě StyleDefinitions, anebo lokálně na úrovni buněk či jednotlivých částí kódu. Takto lze měnit například barvu, velikost či řez písma, barvu pozadí buňky či její ohraničení, atd.

Dále umožňuje Mathematica zobrazovat buď zdrojový kód nebo jeho výstup různým způsobem pomocí příkazů jako TraditionalForm, StandardForm, OutputForm, a další. Tak například InputForm odpovídá klasickému formátování zdrojového kódu známého z dalších jazyků, StandardForm je běžně určen pro vykreslování výstupů způsobem připomínající matematickou notaci. +more Pro zobrazení výrazu způsobem totožným matematické notaci lze použít TraditionalForm. Výsledek připomíná výstup systémů pro sazbu matematiky jako LaTeX, není již ale nutně jednoznačně interpretovatelný nazpět do zdrojového kódu. Pro zobrazení výsledků způsobem známým z příkazové řádky lze použít OutputForm. Formátování daných symbolů lze navíc definovat či změnit uživatelem pomocí funkcí Format či MakeBoxes.

Grafika se vykresluje ve výchozím nastavením ve formátu StandardForm, čímž se v pracovním okně skutečně zobrazí odpovídající obrázek či grafická scéna. Zavoláme-li ovšem na tutéž grafiku funkci InputForm, obdržíme zdrojový kód, který tuto grafiku generuje. +more Podobně, máme-li kód odpovídající matematické operaci, řekněme třeba integrál funkce f od meze a do meze b, je jeho formát InputForm tvaru Integrate[f[x], {x,a,b}]. Pokud tento výraz ale pošleme do funkce TraditionalForm, obdržíme výraz vysázený v matematické notaci podobný tvaru {\textstyle \int_{a}^{b}} f(x) \mathrm{d}x.

Interakce

Příklad uživatelského interaktivního prvku s posuvníky, jenž byl vygenerován z kódu vepsaného nad ním.

Mathematica nabízí velkou míru interaktivity s uživatelem. Kromě práce s grafikou, jež je rozvedena v oddíle níže, lze přehrávat zvuk a video přímo z notebooku. +more Je podporováno i nahrávání zvuku pomocí mikrofonu, nahrávání videa z webkamery či snímání obrazovky - screenshoty a screencasty. Uživatel sám může programově vytvářet interaktivní objekty podobné widgetům či Java appletům, kde je při stisknutí tlačítka či tažení kontrolky dynamicky aktualizován obsah daného objektu. Na obrázku vpravo je příklad jednoho takového objektu vytvořeného pomocí kódu zabaleného do výrazu Manipulate. Například pro vykreslení grafu sinusoidy o „frekvenci“ f lze zadat příkaz Plot[Sin[f x], {x, 0, 2 Pi}]. Výsledný graf je zcela statický, kde je nejprve nutno zadat hodnotu proměnné f. Pro jeho přetvoření do dynamicky se měnícího grafu reagujícího na vstup uživatele stačí zapsat Manipulate[Plot[Sin[f x], {x, 0, 2 Pi}], {f, 0, 10}]. Mathematica na základě tohoto kódu sama vybere odpovídající ovládací prvek (v tomto případě posuvník určující hodnotu proměnné f) a v notebooku vytvoří interaktivní applet. Ovládání kontrolek prostředí Manipulate se přitom neomezuje jen na myš či klávesnici. Toto prostředí podporuje i napojení dalších periferií jako třeba gamepadů.

Větší kontrolu nad dynamickými prvky umožňuje výraz Dynamic a bloková struktura DynamicModule. Dynamické výrazy jsou v Mathematice obecně aktualizovány pouze tehdy, jsou-li viditelné na obrazovce počítače. +more Pokud je tedy notebook dostatečně dlouhý a uživatel sjede až na místo, kde už není daný prvek viditelný, jeho aktualizace se přeruší. Aktualizován je přitom veškerý kód, který je zabalen do výrazu Dynamic. Výpočetní systém si interně udržuje tabulku závislostí, aby věděl, jaká proměnná závisí dynamicky na jaké další proměnné. Aby se předešlo kolizím při aktualizaci stejně pojmenovaných proměnných, lze použít lokalizaci blokovou strukturou DynamicModule. Tento přístup je ale určen spíše pro pokročilé uživatele a začátečník si vystačí s příkazem Manipulate.

Další způsob interakce představuje přístup do systému zpracovávajícího přirozený jazyk, čehož lze dosáhnout tak, že se kurzor nastaví na začátek řádku a poté je stisknuta klávesa pro rovnítko. Tím se aktivuje zadávací pole, do nějž lze psát dotazy v přirozené angličtině. +more Výsledkem je pak v optimálním případě odpovídající kód v jazyce Wolfram Language. Pokud je rovnítko stisknuto na začátku řádky ne jednou, ale dvakrát, tak je výstupem na zadaný dotaz sada dat získaná ze systému Wolfram Alpha. Zpracování jednoduchých požadavků lze i uvnitř kódu a to stisknutím klávesové zkratky + , po jejímž zadání se na místo kurzoru vloží malé zadávací pole, do nějž lze opět vepisovat požadavky. Takto lze například elegantně vkládat fyzikální jednotky pomocí jejich zkratek, kdy Mathematica automaticky vygeneruje odpovídající výraz Quantity se správnou jednotkou.

Tvorba grafiky

Příklad 3D animace vytvořené v Mathematice.

Editor umožňuje pokročilou práci s 2D i 3D grafikou, a to jak vektorovou, tak rastrovou. Trojrozměrná grafika, a to jak vektorová představovaná výrazem Graphics3D, tak rastrová představovaná výrazem Image3D, podporuje základní interakci s uživatelem. +more Lze jí tak pomocí kurzoru s případným stiskem dodatečné klávesy otáčet, přibližovat, oddalovat, případně jí posouvat střed scény. Podobně lze 2D grafiku interaktivně zvětšovat, zmenšovat či měnit její okraje. Dvourozměrná grafika nabízí dodatečnou funkčnost. Do rasterové verze, představované výrazem Image, lze vykreslovat grafická primitiva, které mohou posléze sloužit jako maska, jíž se vybere jen část obrázku, na níž lze následně uplatnit některou z grafických funkcí ve Wolfram Language. Vektorová verze, představovaná výrazem Graphics, pak umožňuje plnohodnotné kreslení s jednoduchým rozhraním známým z grafických programů.

2D vektorovou grafiku lze vytvářet dvěma způsoby a to buď skriptováním, kde daný kód ve Wolfram Language vygeneruje odpovídající grafiku, anebo přímo kreslením kurzorem pomocí různých kreslicích nástrojů. Při manuálním kreslení je nejprve nutné vyvolat plátno, a to buď klávesovou zkratkou, zapsáním odpovídajícího výrazu či vyvoláním z nabídky programu. +more Do plátna se posléze kreslí kurzorem. Do verze 12. 1 se nejprve otevřela prázdná grafika představovaná výrazem Graphics a dané kreslicí nástroje se vybíraly s palety kreslicích nástrojů. Od verze 12. 2 se nejprve otevře prázdné plátno představované výrazem Canvas a dané nástroje jsou přístupné z nabídek pod plátnem. Dané grafické primitivy jako kružnice, mnohoúhelníky, obdélníky, text apod. lze následně přesouvat, otáčet, seskupovat či pozměňovat. Skupinu objektů lze kromě zarovnávání i rovnoměrně rozesadit a to jak ve vodorovném tak i svislém směru. Daný grafický objekt lze dále přesouvat více do pozadí či naopak do popředí. Pro grafické primitivy existují klávesové zkratky, což zjednodušuje samotné kreslení.

Primárním účelem mnoha příkazů je vykreslování grafů matematických funkcí a dat. Barevnou škálu použitou pro vykreslení grafů lze mimo jiné vybrat pomocí odpovídající palety. +more Odlišnou paletu lze použít v případě sloupcových a podobných grafů. Wolfram Language prostřednictvím Mathematicy ale podporuje i mnoho grafických primitivů a dodatečných funkcí, které přímo s vykreslováním matematických funkcí nesouvisejí. Lze tak vytvářet 2D obrázky či 3D animace. Ve verzi 13 byly možnosti 3D vektorové grafiky dále rozšířeny o pokročilejší a realističtější renderování v čele s výrazem MaterialShading. Pro ilustraci je na obrázku napravo příklad 3D grafiky a níže jemu odpovídající kód ve Wolfram Language, který tento obrázek vygeneroval:.

Zátiší vytvořené v Mathematice pomocí kódu vypsaného nalevo v hlavním textu.

svetla = {DirectionalLight[Yellow, {{0,-1,0}, {0,0,0}}], PointLight[Yellow, {-1.2,.2,.2}, {0,0,5}]};

drevo = ImageMultiply[ExampleData[{"Texture", "Bark"}], Brown]; deska = {MaterialShading[Texture[drevo]|>], Cuboid[-1/2{1,1,. 1}, 1/2{1,1,. +more1}]}; noha = Translate[Scale[deska, {. 2,. 2,10}], {. 2,-. 2,-. 5}];.

ubrus = {MaterialShading[{"Satin",Red}], Polygon[1/2{{. 8,1,. +more11}, {-1,1,. 11}, {-1,-1,. 11}, {. 3,-1,. 11}}]}; zraseni = Plot3D[. 01 Sin[6\[Pi] x] Log[1+5 y], {x,0,1}, {y,0,1}, PlotStyle->MaterialShading[{"Satin",Red}], Mesh->None, Lighting->svetla]; zraseni = First@Cases[InputForm[zraseni], _GraphicsComplex, Infinity, 1]; zraseni = Rotate[Translate[zraseni, {-. 5,-. 5,0}], -\[Pi]/2, {1,0,0}, {-. 5,-. 5,0}]; zraseni = Translate[Scale[zraseni, {. 65,1,1}, {-. 5,-. 5,0}], {0,-. 01,. 06}];.

vazafun = Interpolation[BSplineFunction[{{0,. 5}, {1,1. +more5}, {2,. 1}, {2. 3,. 1}, {3,. 7}}] /@ Range[0, 1, . 1]]; vaza = RevolutionPlot3D[vazafun[x], {x,0,3}, RevolutionAxis->{1,0,0}, PlotStyle->{Thickness[. 2], MaterialShading["Gold"]}, Mesh->False, Lighting->svetla]; vaza = First@Cases[InputForm[vaza], _GraphicsComplex, Infinity, 1]; vaza = Translate[Rotate[Scale[vaza, . 2, {0,0,0}], -\[Pi]/2, {0,1,0}], {. 1,. 1,. 06}];.

zatisi = Graphics3D[{EdgeForm[], deska, noha, zraseni, ubrus, vaza}, Lighting->svetla, Boxed->False]; zatisi = Graphics[{RadialGradientFilling[{Darker@Orange, Black}, ImageScaled[{. 5,. +more7}]], Rectangle[-{1,1}, {1,1}], Inset[zatisi, {0,0}, ImageScaled[{. 5,. 5}], 2. 1]}, PlotRange->{{-. 8,. 8}, {-. 7,1}}].

Tvorba psaných dokumentů

Prostředí notebooků lze využít nejen pro vývoj kódu, ale i pro tvorbu psaných dokumentů. Editor umožňuje členit text do kapitol, sekcí apod. +more s odpovídajícími nadpisy, viz též oddíl #Strukturování kódu|„Strukturování kódu“. Do textu lze vkládat obrázky, úryvky kódu, odrážky, číslované seznamy, vodorovné čáry jako předěly, citace, číslované rovnice atd. Je podporována kontrola pravopisu v angličtině a pro potřeby psaní textu je k dispozici několik dodatečných nástrojových lišt, které např. mohou zobrazit pravítka na okraj okna editoru či měnit formát textu. Uživatel má mnoho možností, jak uzpůsobit vzhled a chování různých částí textu. Lze nastavit font písma, stejně jako jeho řez, velikost či barvu. Podobně jako v textových procesorech typu Microsoft Word lze nastavit zarovnání textu, barvu pozadí, šířku stránky či styl odrážek. Sady stylů pro různé úrovně textu lze sdružovat do stylopisů (angl. stylesheets). Místo nastavování jednotlivých stylů tak lze jednoduše například propojit daný notebook se souborem, který obsahuje celou sadu k sobě ladících stylů. Stylopis pro daný notebook lze vyvolat a upravovat z okna editoru. Formátování konkrétní části textu lze i manuálně smazat.

Tvorba prezentací

V Mathematice lze vytvářet i prezentace připomínající ty z programu PowerPoint, kde je obsah daného notebooku rozdělen do stránek, mezi kterými lze přecházet pomocí tlačítek na dodatečné nástrojové liště. Výhodou těchto prezentací je to, že mohou obsahovat kód, který se naživo vyhodnocuje. +more Prezentace tak může obsahovat interaktivní prvky. Pro usnadnění tvorby prezentací je v Mathematice dostupná odpovídající paleta nástrojů. Příklady prezentací vytvořených v Mathematice lze nalézt například na oficiálních stránkách vývojáře.

Komunikace

Daný notebook lze uložit do mnoha dalších formátů jako např. PDF pro snazší komunikaci výpočtů, textu a kódu i s lidmi, kteří Mathematicou nedisponují. +more Notebook lze i přímo vytisknout, či zaslat celý či jen jeho část přímo z editoru na zadaný email. Při práci více uživatelů na jednom projektu lze využít chatu, který je součástí Mathematicy. Některá funkčnost je přístupná jen tehdy, je-li uživatel registrován u společnosti Wolram Research. Důležitým příkladem jsou v tomto ohledu cloudové služby. Lokální objekty lze přímo z notebooku poslat na cloud a zpřístupnit dalším uživatelům. Lze též v samostatném okně sledovat aktivitu přístupu Mathematicy ke cloudu. Mnoho funkcí v Mathematice využívá dat, která je nejprve nutno stáhnout z internetu, příkladem budiž např. mapové podklady pro funkci GeoGraphics. Připojení k internetu je tedy v těchto případech nutností, lze ho však vypnout.

Nízkoúrovňová reprezentace výrazů v buňkách může být velmi komplikovaná a při kopírování části kódu do externí aplikace jako třeba textového editoru tak překopírovaný výraz nemusí být totožný s tím, o kterém se uživatel domnívá, že z notebooku zkopíroval. Z tohoto důvodu umožňuje Mathematica kopírovat daný kód či prvek z notebooku různými způsoby. +more Lze kopírovat výraz jako čistý text, jako vzorec v jazyce TeX či reprezentaci MathML. Lze též daný výraz přetvořit na bitmapový obrázek a tento uložit či vložit do jiné aplikace.

Struktura souborů

Ve výchozím nastavení je zdrojový kód jazyka Wolfram Language ukládán v textovém souboru s příponou . nb. +more Tento typ souboru podporuje vykreslování grafiky, interaktivní prvky či pokročilé uzpůsobení vzhledu pomocí stylopisů. Tato funkcionalita umožňuje uživateli flexibilní práci s daty a kódem, na druhou stranu si však vynucuje mnoho dodatečného kódu, který sice není uživateli přímo přístupný, je ale obsažen ve výsledném souboru. Pokud je cílem uživatele čistě práce s kódem způsobem známým z ostatních programovacích jazyků, je vhodnější ukládat kód do balíčkových souborů s příponou . wl (v dřívějších verzích . m). Tyto textové soubory ukládají jen samotný zdrojový kód a nezbytné formátovací údaje. Další možností je ukládat zdrojový kód do souborů s příponou . wls, jejímž účelem je působit jako skripty prováděné bez zásahu uživatele programem wolframscript.

Notebook jako výraz

Podobně jako jiné konstrukty ve Wolfram Language lze i samotný notebook vyjádřit jako výraz. A sice jako výraz s hlavičkou Notebook, který ve svém těle sdružuje veškerý kód. +more Pro ilustraci vezměme formátovaný podbarvený kód ve stylu notebooku ze sekce #Strukturování kódu|„Strukturování kódu“. Tento notebook lze ve Wolfram Language programově zapsat jako výraz ve tvaru:.

Notebook[{

Cell["Toto je titul", "Title"],

Cell["První sekce", "Section"], Cell["Spočti výsledek následujícího výrazu:", "Text", CellFrame->True], Cell[BoxData[FractionBox["12", "3"]], "Input", InitializationCell->True],

Cell["Další sekce", "Section"], Cell["a = 2", "Input"]

}]

Kód je rozdělen do buněk, kde každá buňka může mít různé vlastnosti a vzhled v závislosti na svém typu. První buňka má jako druhý parametr "Title", což označuje titul. +more Buňka druhá má namísto toho "Section", což označuje sekci. Následující, textová, buňka má jednak druhý parametr "Text", jednak má dodatečnou volbu CellFrame->True, čímž se dává na srozuměnou, že daná buňka má mít kolem sebe vykreslený rámeček. Buňka se zlomkem je typu "Input", tedy vstupní kód, s dodatečnou volbou InitializationCell->True, což jí nastavuje jako inicializační buňku. Samotný obsah této buňky je navíc obalen do výrazu BoxData, který umožňuje pokročilejší formátování. Výraz FractionBox umožňuje vykreslení zlomku způsobem známým z matematické notace.

Interní struktura notebooku

Pokud je výše uvedený výraz s hlavičkou Notebook vložen do nově otevřeného . nb souboru, je tento výraz vyhodnocen a editor do souboru vloží dodatečné údaje, které se uživateli nezobrazí. +more Jejich podobu lze však zjistit, otevřeme-li takový soubor v běžném textovém editoru jako Notepad či Gedit. Výsledný soubor obsahuje mnoho metadat vložených jako komentáře a samotný kód je dále rozšířen o další podrobnosti tak, že výše uvedený kód je po vyhodnocení přetvořen zhruba do následujícího tvaru:.

Notebook[{

Cell[CellGroupData[{ Cell["Toto je titul", "Title"],

Cell[CellGroupData[{ Cell["Prvn\[IAcute] sekce", "Section"],

Cell["Spo\[CHacek]ti v\[YAcute]sledek n\[AAcute]sleduj\[IAcute]c\[IAcute]ho v\[YAcute]razu:", "Text", CellFrame->True], Cell[CellGroupData[{ Cell[BoxData[FractionBox["12", "3"]], "Input", InitializationCell->True, CellLabel->"In[1]:="], Cell[BoxData["4"], "Output", CellLabel->"Out[1]="] }, Open ]]

}, Open ]],

Cell[CellGroupData[{ Cell["Dal\[SHacek]\[IAcute] sekce", "Section"],

Cell[CellGroupData[{ Cell[BoxData[RowBox[{"a", "=", "2"}]], "Input", CellLabel->"In[2]:="], Cell[BoxData["2"], "Output", CellLabel->"Out[2]="] }, Open ]]

}, Open ]] }, Open ]] }, StyleDefinitions->"Default.nb" ]

kde v každé buňce byly pro zvýšení přehlednosti vynechány volby CellChangeTimes a ExpressionUUID, a podobně na konci výrazu Notebook byly vynechány dodatečné volby jako WindowSize. Mathematica do kódu dodala informace o hierarchickém seskupení buněk pomocí výrazu CellGroupData, kde parametr Open značí, že je daná buňka otevřená. +more Vstupní data jsou nyní uvozena volbou CellLabel->"In[1]:=" atd. a dále přibyly výsledky vyhodnocení vstupního kódu v buňkách typu "Output", které navíc obsahují volbu CellLabel->"Out[1]=" atd. Všechny znaky s diakritikou jsou nahrazeny svými názvy ve Wolfram Language - např. "í" je změněno na \[IAcute] - a vstupní kód ve druhé kapitole "a = 2" je rozparseován do nízkoúrovňového výrazu BoxData[RowBox[{"a", "=", "2"}]]. V neposlední řadě byla na konec výrazu Notebook dodána volba StyleDefinitions->"Default. nb", která specikuje daný stylopis, podle něhož se mají vykreslovat jednotlivé typy buněk.

Interní struktura balíku

Jak vidno, takto upravený kód uchovávaný v souborech typu . nb obsahuje značné množství údajů, které nejsou nezbytné pro chod samotného zdrojového kódu. +more Pro přimou práci s kódem je tak vhodnější používat soubory typu . wl, které uchovávají jen nezbytné informace. Výše uvedený výraz Notebook s veškerým obsahem je při uložení jako . wl soubor přetvořen do následujícího tvaru:.

(* ::Package:: *)

(* ::Title:: *) (*Toto je titul*)

(* ::Section:: *) (*Prvn\[IAcute] sekce*)

(* ::Text:: *) (*Spo\[CHacek]ti v\[YAcute]sledek n\[AAcute]sleduj\[IAcute]c\[IAcute]ho v\[YAcute]razu:*)

(* ::Input::Initialization:: *) 12/3

(* ::Section:: *) (*Dal\[SHacek]\[IAcute] sekce*)

(* ::Input:: *) (*a=2*)

Téměř veškerý kód, až na původně inicializační buňky, je vložen do komentáře. Typ každé buňky je vypsán před její obsah a obložen dvojitými dvojtečkami ::, přičemž pro inicializační buňky je dodán text ::Initialization::. +more Dále jsou vymazány výstupní buňky a veškeré formátování, jako např. to pro zlomek v první sekci, který je nyní vypsán na jednom řádku doslova jako 12/3.

Na závěr uveďme, že pokud místo . wl použijeme příponu . +morewls určenou pro wolframscript, je výsledný soubor shodný s tím výše až na to, že na první řádek je přidána shebang formule #. /usr/bin/env wolframscript, která je využívána UNIXovými operačními systémy.

Odkazy

Poznámky

Reference

Literatura

Související články

Externí odkazy

[url=http://www. wolfram. +morecom/mathematica]Oficiální stránky[/url] * [url=https://community. wolfram. com/groups/-/m/t/1429739]WolframBookTools[/url] - Šablona pro psaní knih * [url=https://dydmat. mimuw. edu. pl/sites/default/files/wyklady/mathematica. pdf]Introduction to Mathematica[/url] - Příklad knihy napsané v Mathematice * [url=https://mathvis. academic. wlu. edu/category/mathematica/]Modely pro 3D tisk vytvořené v Mathematice[/url] * [url=https://intothecontinuum. tumblr. com/tagged/Mathematica]Příklady jednoduchých 2D animací vytvořených v Mathematice[/url] * [url=https://github. com/xslittlegrass/POVRayRender-For-Mathematica]POVRayRender For Mathematica[/url] - Renderování 3D grafiky vytvořené v Mathematice pomocí POVRay * [url=https://mathematica. stackexchange. com/questions/19669/mathematica-minecraft]Mathematica Minecraft[/url] - Odlehčená verze hry Minecraft vytvořená v Mathematice (odkaz na kód v odpovědích).

Kategorie:Matematický software Kategorie:Počítačová algebra Kategorie:Funkcionální jazyky

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top