Seznámení se systémem Mathematica 7

Základní funkce systému I.

© Jaroslav Reichl, SPŠST Panská, Praha
reichl@panska.cz

Obsah

Prezentace obsahuje tato témata:

Manipulate, podmínka a další funkce
12. úkol
Práce s textem
Cykly a funkce, jimiž lze cykly realizovat
13. úkol
Zvukové výstupy
14. úkol

Jaroslav Reichl, SPŠST Panská, Praha, © 2010

Manipulate, podmínka a další funkce

Manipulate[vyraz, {u, (Subscript[u, min]), (Subscript[u, max])}] - nástroj na interaktivní zobrazení výrazu vyraz, jehož parametry lze měnit v zadaném intervalu.

Manipulate[Expand[(((x+y))^n)],{n,1,10,1}]

Manipulate[Plot[Sin[a x],{x,-π,(3/2)π}],{a,1,5,1}]

If[test, postup_pravda,postup_nepravda] - na základě provedeného testu test se provede postup_pravda nebo postup_nepravda.

a=-5;
If[a≥0,
Print["Zadané číslo je nezáporné."],
Print["Zadané číslo je záporné."]]

Interval[{(Subscript[x, min]), (Subscript[x, max])}] - definuje interval v daných mezích.

Max[(Subscript[x, 1]), (Subscript[x, 2]),...] - vrací maximální prvek ze zadaných prvků.
Min[(Subscript[x, 1]), (Subscript[x, 2]),...] - vrací minimální prvek ze zadaných prvků.

Max[1,-2,0,3,-10,11,5,7]
Min[1,-2,0,3,-10,11,5,7]

interval=Interval[{-15,10}]
Print["Nejmenší číslo zadaného intervalu je ",Min[interval],", největší číslo téhož intervalu je číslo ",Max[interval],"."]

Length[seznam] - vrací délku seznamu nebo pole.

Length[{1,2,3,7}]

dny={"pondelí","úterý","středa","čtvrtek","pátek","sobota","neděle"}
Length[dny]

Union[seznam1,seznam2,...] - vrací sjednocení zadaných seznamů (ve formátu List). Ačkoliv je tato funkce známá spíše z matematiky, je definována i pro jiné než číselné formáty.

Union[{a,b, c, d, e,f},{e,f,g,h},{i,j,k,a}]

mnozina1={1,2,4,8,16,32,64,128};
mnozina2={1,3,5,7,9,11,13,15,17,19};
Union[mnozina1,mnozina2]
mnozina1⋃mnozina2

Intersection[seznam1,seznam2,...] - vrací průnik zadaných seznamů (ve formátu List). Ačkoliv je tato funkce známá spíše z matematiky, je definována i pro jiné než číselné formáty.

Intersection[{a,b,c,d},{e,f},{f,g,h}]

mnozina1={1,2,4,8,16,32,64,128};
mnozina2={2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32};
Intersection[mnozina1,mnozina2]
mnozina1⋂mnozina2

Complement[seznam1,seznam2,...] - vrací ty prvky z množiny seznam1, které nejsou v žádné další množině uvedené v parametrech této funkce. Ačkoliv je tato funkce známá spíše z matematiky, je definována i pro jiné než číselné formáty.

Complement[{a,b,c,d,e},{a,d}]

Part[seznam,i] - vrací i-tý prvek seznamu seznam. Ekvivalentní zápis této funkce je seznam[[i]] nebo seznam[[i]].
Zápisem seznam[[i;;j]] (pro i<j) rozumíme prvky seznam[[i]] až seznam[[j]].
Zápisem seznam[[-i]] rozumíme i-tý prvek seznamu seznam od konce.
Poznámka: Dvojitou závorku [[ resp. ]] získáme zápisem Esc [[ Esc resp. Esc ]] Esc.

dny={pondělí,úterý, středa,čtvrtek,pátek,sobota,neděle};
Print["Druhým dnem v týdnu je ",dny[[2]],"."]
Print["Posledním dnem v týdnu je ",dny[[-1]],"."]
Print["Pracovní dny jsou ",dny[[1;;5]],"."]

seznam={{Karel,Jarda,Martin,Emil,Pavel,Aleš},{Irena,Marie,Věra,Kamila}};
seznam[[-1]]
seznam[[1,2]]
seznam[[2,2;;Length[seznam[[2]]]]]

First[vyraz] - vrací první prvek ve výrazu vyraz.

barvy={červená,oranžová,žlutá,zelená,modrá,fialová};
First[barvy]

First[a (x^2)+b x+c](*Systém řadí členy od absolutního po členy s nejvyšší mocninou neznámé.*)
First[a (x^2)+b x+c==0]

Last[vyraz] - vrací poslední prvek ve výrazu vyraz.

Jaroslav Reichl, SPŠST Panská, Praha, © 2010

12. úkol: Manipulate, podmínka a další funkce

Pomocí příkazu Manipulate[] zobrazte interaktivně graf kvadratické funkce.

Řešení

xmin=-10;xmax=10;
ymin=-10;ymax=10;
a0=1;amin=-5;amax=5;delta=0.5;
b0=0;bmin=-6;bmax=6;
c0=0;cmin=-7;cmax=5;
tloustka=0.007;
barva=Black;
barvagrafu=Red;
Manipulate[
funkcekv[x_]:=a (x^2)+b x+c;
If[a≠0,
Plot[funkcekv[x],{x,xmin,xmax},PlotStyle->{barvagrafu,Thickness[tloustka]},PlotRange->{{xmin,xmax},{ymin,ymax}},AxesOrigin->{0,0},AxesLabel->{Style["x",15,barva,FontFamily->Times],Style["y",15,barva,FontFamily->Times]}],
""],
{{a,a0,Style["a",15,barva]},amin,amax,delta,Appearance->"Labeled"},
{{b,b0,Style["b",15,barva]},bmin,bmax,delta,Appearance->"Labeled"},
{{c,c0,Style["c",15,barva]},cmin,cmax,delta,Appearance->"Labeled"}]

Zjistěte, které ze dvou čísel 25, 80 zadaných na vstupu, je větší. Odpověď vypište.

Řešení

cislo1=25;
cislo2=80;
If[cislo1>cislo2,
Print["Číslo ",cislo1," je větší než číslo ",cislo2,"."],
If[cislo1<cislo2,
Print["Číslo ",cislo2," je větší než číslo ",cislo1,"."],
Print["Obě čísla jsou stejná."]]]

Zjistěte, zda zadané množiny a) A={1,a,3,7,b,e,6,d}, B={2,e,6,i,7}, b) A={1,a,3,7,b,e,6,d}, B={8,p,9,r}  jsou disjunktní, tj. zda jejich průnik je prázdná množina. Pokud disjunktní nejsou, vypište jejich společný průnik.

Řešení

mnozinaA={1,a,3,7,b,e,6,d};
mnozinaB={2,e,6,i,7};
(*mnozinaB={8,p,9,r};*)

prunik=mnozinaA⋂mnozinaB;
If[Length[prunik]>0,
Print["Zadané množiny A = ",mnozinaA," a B = ",mnozinaB," nejsou disjukntní. Jejich průnik je A⋂B = ",prunik,"."],
Print["Zadané množiny A = ",mnozinaA," a B = ",mnozinaB," jsou disjukntní."]];

Bez použití funkce Solve[] vyřešte kvadratickou rovnici a (x^2)+b x+c=0 v závislosti na zadaných koeficientech a, b a c. Tj. sestavte algoritmus řešení kvadratické rovnice tak, jako kdybychom tuto rovnici řešili manuálně s tužkou a papírem.

Řešení

a=1;
b=-6;
c=8;

If[b≥0,
znamenko1=" + ",
znamenko1=" - "];
If[c≥0,
znamenko2=" + ",
znamenko2=" - "];
If[a≠0,
{diskriminant=(b^2)-4a c,
If[diskriminant≥0,
If[diskriminant>0,
{koren1=((-b+(Sqrt[diskriminant]))/(2a)),
koren2=((-b-(Sqrt[diskriminant]))/(2a)),
Print["Kvadratická rovnice ",a,"(x^2)",znamenko1,Abs[b],"x",znamenko2,Abs[c]," = 0 má dva reálné kořeny: ",koren1," a ",koren2,"."]},
{koren1=((-b)/(2a)),
Print["Kvadratická rovnice ",a,"(x^2)",znamenko1,Abs[b],"x",znamenko2,Abs[c]," = 0 má jediný reálný kořen: ",koren1,"."]}],
{koren1=((-b+(Sqrt[diskriminant]))/(2a)),
koren2=((-b-(Sqrt[diskriminant]))/(2a)),
Print["Kvadratická rovnice ",a,"(x^2)",znamenko1,Abs[b],"x",znamenko2,Abs[c]," = 0 má dva komplexní kořeny: ",koren1," a ",koren2,"."]}]},
Print["Pro a = 0 nemá kvadratická rovnice řešení."]];

Jaroslav Reichl, SPŠST Panská, Praha, © 2010

Práce s textem

StringLength[text] - vrací délku textové řetězce uložného v proměnné text.

zkusebnitext="Toto je zkušební text!";
delka=StringLength[zkusebnitext];
Print["Text >",zkusebnitext,"< obsahuje ",delka," znaků."]

Characters[text] - vrací seznam jednotlivých znaků z textu v proměnné text.

Characters["Vrať jednotlivé znaky tohoto textu! :-)"]

Characters["Blue"](*Barva a styl změněno v menu systému Format - Font.*)
(*Ve výstupu budou všechny vlastnosti zadaného textu, jak jsou definovány v Mathematice. Proto je nutné na podobné případy dávat pozor.*)
StringJoin[%]

StringJoin[text1,text2, ...] - vrací text, který vznikne spojením textů uvedených v argumentech této funkce.

StringJoin["Text"," ","pro"," ","ukázku"," ","práce"," ","této"," ","funkce","."]

ToCharacterCode[text] - vrací seznam kódů jednotlivých znaků v textu v proměnné text z ASCII tabulky. Funkce funguje i pro znaky z české abecedy, ale může s nimi být obecně problém.

ToCharacterCode["A"]
%[[1]]

ToCharacterCode["Další zkušební text ..."]

FromCharacterCode[cislo] - vrací znak, jehož ASCII kód je dán celočíselným číslem cislo. Je to inverzní funkce k funkci ToCharacterCode[]. Funkce funguje i pro znaky z české abecedy, ale může s nimi být obecně problém.

FromCharacterCode[65]
FromCharacterCode[{65,66,67,68,69,70}]

FromCharacterCode[ToCharacterCode["Toto je zkušební text."]]

ToUpperCase[text] - vrací text, který je vypsán velkými písmeny. Funkce funguje i pro znaky z české či řecké abecedy, ale může s nimi být obecně problém.

ToUpperCase["Testovací textík pro funkci ToUpperCase[]."]
ToUpperCase["Tento text byl napsán v roce 2010."]

ToLowerCase[text] - vrací text, který je vypsán velkými písmeny. Je to inverzní funkce k funkci ToUpperCase[]. Funkce funguje i pro znaky z české či řecké abecedy, ale může s nimi být obecně problém.

ToLowerCase["Testovací TEXT pro funkci ToLowerCase[]."]

textik="Pozor! Pro některé znaky nejsou funkce ToUpperCase[] a ToLowerCase[] inverzní - např. ß, φ a další."
textikvelky=ToUpperCase[textik]
ToLowerCase[textikvelky]

Jaroslav Reichl, SPŠST Panská, Praha, © 2010

Cykly a funkce, jimiž lze cykly realizovat

V systému Mathematica lze použít několik způsobů realizace cyklů:

Table[prikaz, {i, (Subscript[i, min]), (Subscript[i, max]), (Subscript[i, krok])}] - vykoná prikaz tolikrát, kolikrát vyplývá ze zadání hodnot řídící proměnné i. Neuvedeme-li krok (Subscript[i, krok]), automaticky se provádí výpočet s krokem  rovným jedné.

posloupnost[n_]:=(n/(n+1));
Table[
Print[n,". člen posloupnosti je roven ",posloupnost[n]],{n,1,20,2}];

For[pocatek_cyklu,test_pokracovani_cyklu,zvyseni_promenne,telo_cyklu] - deklarace tohoto cyklu je mírně odlišná od programovacích jazyků. Začíná se inicializací řídící proměnné cyklu, následuje testování, zda tato proměnná nabývá takové hodnoty, aby mohl cyklus pokračovat, pak se řídící proměnná zvětší a následuje tělo cyklu.
Cyklus lze přerušit pomocí příkazu Break[].

For[i=10,i≤20,i=i+1,Print[i]]

koneccyklu=15;
For[i=10,i≤20,i=i+1;(*Středník se místo čárky píše tehdy, následuje-li v těle cyklu více než jeden příkaz.*)
Print[i],
If[i≥koneccyklu,Break[]]]
Print["For cyklus byl přerušen po dosažení čísla ",koneccyklu,"."]

Do[prikaz, {i, (Subscript[i, min]), (Subscript[i, max]), (Subscript[i, krok])}] - vykoná prikaz tolikrát, kolikrát vyplývá ze zadání hodnot řídící proměnné i. Může mít i jiné deklarace. Je velmi podobný příkazu Table[].

Do[Print["***"],{5}]

n=6;
fakt=1;
Do[fakt=fakt i,{i,1,n,1}];
Print["Faktoriál čísla ",n," je ",fakt,"."]

Clear[a,b];
Do[Print[(vyraz^2)," = ",Expand[(vyraz^2)]],{vyraz,a,a-5b,-b}]

While[test,telo_cyklu] - cyklus probhá dokud je splněna podmínka test. Při prvním nesplnění podmínky test se cyklus ukončí a program pokračuje dalším příkazem.
Cyklus lze přerušit pomocí příkazu Break[].

n=5;
faktorial=1;
i=1;
While[i≤n,
faktorial=faktorial i;
i=i+1]
Print["Faktoriál čísla ",n," je ",faktorial,"."]

Jaroslav Reichl, SPŠST Panská, Praha, © 2010

13. úkol: Cykly a funkce, jimiž lze cykly realizovat

Vypište přehledně do tabulky k přirozeným číslům menším než 10 jejich druhé a třetí mocniny.

Řešení

Grid[
Prepend[
Table[{i,(i^2),(i^3)},{i,1,9,1}],{"i","(i^2)","(i^3)"}],
Spacings->{3,2},Background->{{Yellow,None,Lighter[Red,0.5]},{1->LightYellow}},ItemStyle->{20,Bold},Dividers->{{Directive[Black,Thickness[1]],{1->{Black,Thickness[3]},-1->{Black,Thickness[3]}}},{Directive[Black,Thickness[1]],{1->{Black,Thickness[3]},2->{Black,Thickness[3]},-1->{Black,Thickness[3]}}}}]

Je dána řada čísel 5, -10, 9, 0, 5, 1, 6, 7, -2, 4. Setřiďte tato čísla vzestupně.

Řešení

cisla={5,-10,9,0,5,1,6,7,-2,4};
Print["Zadaná řada čísel: ",cisla]
pocetcisel=Length[cisla];
For[i=1,i<pocetcisel,i=i+1,
For[j=1,j<pocetcisel-i+1,j=j+1,
If[cisla[[j]]>cisla[[j+1]],
{pom=cisla[[j]],
cisla[[j]]=cisla[[j+1]],
cisla[[j+1]]=pom}]]]
Print["Vzestupně setříděná řada čísel: ",cisla]

Napište tzv. řetězový zlomek tvaru (1/(1-(1/(...)))) a) desáté, b) dvacáté, c) třicáté úrovně. Zlomek zjednodušte a určete jeho hodnotu pro x = 2.

Řešení

uroven=10;
vyraz=x;
Do[vyraz=(1/(1-vyraz)),{uroven}];
Print[vyraz]
vysledek=Simplify[vyraz]
vysledek/.x->2

Jaroslav Reichl, SPŠST Panská, Praha, © 2010

Zvukové výstupy

Pro správné pochopení a vyzkoušení si dále uvedených funkcí je nutné mít k počítači připojené zapnuté reproduktory.

Beep[] - generuje pípnutí.

Beep[]

Sound[funkce] - reprezentuje zvuk. Generuje zvuk nebo zvuky popsané ve funkcích, které jsou parametry této funkce.

SoundNote[funkce] - reprezentuje hudební zvuk, u nějž lze nastavit výšku tónu, nástroj, dobu trvání, ...

Sound[SoundNote[0]]

Sound[SoundNote["G",2,"Accordion"]]

Play[funkce[t], {t, (Subscript[t, min]), (Subscript[t, max])}] - zobrazí okno, ve kterém lze přehrát zadanou funkci funkce[t] závislou na čase t v zadaném intervalu. Časy jsou udané v sekundách.

Play[ Sin[2π 800t],{t,0,2}]

Jaroslav Reichl, SPŠST Panská, Praha, © 2010

14. úkol: Zvukové výstupy

Nagenerujte zvukový výstup trvající 2 sekundy, který bude odpovídat tónu G zahranému na housle.

Řešení

Sound[SoundNote["G",2,"Violin"]]

Nagenerujte zvukový výstup trvající celkem 5 sekund, který se bude skládat ze dvou stejně dlouho trvajících tónů D. První bude zahrán na klarinetu, druhý na houslích.

Řešení

Sound[{SoundNote["D",2.5,"Clarinet"],SoundNote["D",2.5,"Violin"]}]

Nagenerujte zvukový výstup trvající 3 sekundy, při kterém budou hrát po celou dobu současně klarinet a čelo. Klarinet bude hrát tón G a čelo tón C.

Řešení

Sound[{SoundNote["G",{0,3},"Clarinet"],SoundNote["C",{0,3},"Cello"]}]

Jaroslav Reichl, SPŠST Panská, Praha, © 2010