Seznámení se systémem Mathematica 7

Základní funkce systému II.

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

Obsah

Prezentace obsahuje tato témata:

Obecné matematické funkce
15. úkol
Vektory
16. úkol
Matice
17. úkol

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

Obecné matematické funkce

NumericQ[vyraz] - vrací hodnotu True, je-li vyraz numerický, nebo hodnotu False, není-li vyraz numerický.

NumericQ[Sin[x]]
NumericQ[Sin[x]/.x->(π/3)]

NumberQ[vyraz] - funkce velmi podobná funkci NumericQ[]. Rozdíl spočívá v tom, že funkce NumberQ[] nabývá hodnoty True pouze tehdy, pokud je vyraz skutečně číslo a ne výraz.

NumberQ[a+7]
NumberQ[a+7/.a->-(Sqrt[3])]
NumberQ[a+7/.a->-1]

IntegerQ[vyraz] - vrací hodnotu True, je-li vyraz typu integer (tj. celočíselný).

IntegerQ[(25/5)]
IntegerQ[(25.0/5)]
IntegerQ[(Sqrt[9])]
IntegerQ[Round[π]]
a=15;
IntegerQ[a]

Mod[cislo1,cislo2] - vrací zbytek po celočíselném dělení, při kterém číslem cislo2 dělíme cislo1.

cislo=250;
If[Mod[cislo,2]==0,
Print["Číslo ",cislo," je sudé."],
Print["Číslo ",cislo," je liché."]]

Round[cislo] nebo Round[cislo,nasobek] - zakrouhlí číslo cislo resp. zaokrouhí číslo cislo na zadané "násobky".

cislo=1000π
Round[cislo]
Round[cislo,0.1]
Round[cislo,0.01]
Round[cislo,1]
Round[cislo,10]
Round[cislo,100]
Round[cislo,1000]

IntegerPart[cislo] - vrací celou část daného čísla cislo.

IntegerPart[π]
IntegerPart[E]

FractionalPart[cislo] - vrací část daného čísla cislo za desetinnou čárkou.

N[FractionalPart[π],100]
N[FractionalPart[E],10]

FractionalPart[cislo] - vrací část daného čísla cislo za desetinnou čárkou.

Random[] - vrací náhodné číslo z intervalu (0;1). Pozor! Funkce je bez argumentu.
RandomInteger[{(Subscript[i, min]), (Subscript[i, max])}] - vrací náhodné číslo z intervalu ((Subscript[i, min]);(Subscript[i, max])).
RandomChoice[{(Subscript[i, 1]), (Subscript[i, 2]), (Subscript[i, 3]), ...}] - vrací náhodný výraz ze zadaného výběru.
a další funkce vracející náhodné výrazy.

Random[]
RandomInteger[{10,50}]
RandomChoice[{"leden","únor","březen","duben","květen","červen","červenec","srpen","září","listopad","prosinec"}]

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

15. úkol: Obecné matematické funkce

Pro čísla z intervalu -5 až 5 vykreslete fialovou čarou tloušťky 0,008 závislost zaokrouhlené hodnoty na číslech ze zadaného intervalu.

Řešení

funkce[x_]:=Round[x];
Plot[funkce[x],{x,-5,5},PlotStyle->{Magenta,Thickness[0.008]},AxesLabel->{"x","y"}]

Pro čísla z intervalu -5 až 10 vykreslete modrou čarou tloušťky 0,007 závislost celé části daných čísel na číslech ze zadaného intervalu. Porovnejte s předchozí úlohou.

Řešení

funkce[x_]:=IntegerPart[x];
Plot[funkce[x],{x,-5,10},PlotStyle->{Blue,Thickness[0.007]},AxesLabel->{"x","y"}]

Pro čísla z intervalu -5 až 5 vykreslete červenou čarou tloušťky 0,008 závislost části čísel za desetinnou čárkou na číslech ze zadaného intervalu. Porovnejte s předchozími úlohami.

Řešení

funkce[x_]:=FractionalPart[x];
Plot[funkce[x],{x,-5,5},PlotStyle->{Red,Thickness[0.008]},AxesLabel->{"x","y"}]

Zjistěte, zda zadaná linární rovnice má celočíselné řešení, neceločíselné řešení případně, zda řešení vůbec má.

Řešení

linclen=10;
absclen=-50;
(*Právě uvedené proměnné lze libovolně měnit a podle jejich hodnot se vypíše typ řešení dané rovnice.*)

rovnice=linclen x+absclen==0;
reseni=Solve[rovnice,x];
If[absclen≥0,
znamenko=" + ",
znamenko=" - "];
If[Length[reseni]>0,
{koren=x/.reseni[[1]],
If[NumericQ[koren],
If[IntegerQ[koren],
Print["Rovnice ",linclen,"x",znamenko,Abs[absclen]," = 0 má celočíselné řešení - řešením je číslo ",koren,"."],
Print["Rovnice ",linclen,"x",znamenko,Abs[absclen]," = 0 nemá celočíselné řešení - řešením je číslo ",koren,"."]],
Print["Rovnice ",linclen,"x",znamenko,Abs[absclen]," = 0 má nekonečně mnoho řešení."]]},
Print["Rovnice ",linclen,"x",znamenko,Abs[absclen]," = 0 nemá řešení."]];

V závislosti na proměnné vstup vypište:
	celou část čísla, je-li zadáno neceločíselné číslo;
	druhou mocninu čísla, je-li zadáno celočíselné číslo;
	ASCII kód znaku, je-li zadán libovolný jiný znak než číslo
	ASCII kód druhého znaku v textu, je-li zadán delší text než jen jeden znak.

Řešení

ClearAll["Global`*"];
vstup=10;
If[NumericQ[vstup],
If[IntegerQ[vstup],
vystup=(vstup^2),
vystup=IntegerPart[vstup]],
{pomocna=ToString[vstup],
If[StringLength[pomocna]==1,
vystup=ToCharacterCode[pomocna][[1]],
vystup=ToCharacterCode[Characters[pomocna][[2]]][[1]]
]}];
Print["Vstupu >",vstup,"< odpovídá výstup >",vystup,"<."]

Najděte všechna prvočísla, která jsou větší nebo rovna 10 a menší nebo rovna 100.

Řešení

dolnimez=10;
hornimez=100;
pocetprvocisel=0;
prvocisla=Table[Null,{i,1,hornimez-dolnimez+1,1}];
For[i=dolnimez,i<hornimez,i=i+1;
k=2;
While[Mod[i,k]≠0∧k<(Sqrt[i]),
k=k+1];
If[k≥(Sqrt[i]),
{pocetprvocisel=pocetprvocisel+1,
prvocisla[[pocetprvocisel]]=i}]];
Print["V intervalu od ",dolnimez," do ",hornimez," jsou tato prvočísla: ",Table[prvocisla[[i]],{i,1,pocetprvocisel,1}]]

Simulujte náhodnou cestu v kartézské soustavě souřadnic s krokem délky nejvýše 2 jednotky libovolným směrem. Tuto cestu vyznačte modrou lomenou čarou a body, v nichž se čára láme, vyznačte červeně. Vyznačte deset úseků cesty.

Řešení

x1=-10;x2=10;
y1=-10;y2=10;
stredx=((x1+x2)/2);stredy=((y1+y2)/2);
maxdelkakroku=2;
pocetkroku0=0;pocetkrokumin=0;pocetkrokumax=10;deltapocetkroku=1;
tloustka=0.004;
velikostsipky=0.04;
velikostbodu=0.02;

barva=Black;
barvabodu=Red;
barvacary=Blue;
krokyx=Table[Null,{pocetkrokumax+1}];
krokyy=Table[Null,{pocetkrokumax+1}];

osax={
Arrowheads[{0,velikostsipky}],
Arrow[{{x1,stredy},{x2,stredy}}]};
osay={
Arrowheads[{0,velikostsipky}],
Arrow[{{stredx,y1},{stredx,y2}}]};
krokyx[[1]]=0;krokyy[[1]]=0;

Manipulate[
krokyx=PadRight[krokyx,n+1,krokyx[[n]]+RandomReal[{-maxdelkakroku,maxdelkakroku}]];
krokyy=PadRight[krokyy,n+1,krokyy[[n]]+RandomReal[{-maxdelkakroku,maxdelkakroku}]];
body=Table[Point[{krokyx[[i]],krokyy[[i]]}],{i,1,n+1,1}];
lomenacara=Table[Line[{{krokyx[[i]],krokyy[[i]]},{krokyx[[i+1]],krokyy[[i+1]]}}],{i,1,n}];

Graphics[{
{barva,Thickness[tloustka],osax},
{barva,Thickness[tloustka],osay},
Text[Style["x",17,barva,FontFamily->Times],{x2,stredy},{Right,Top}],
Text[Style["y",17,barva,FontFamily->Times],{0.02x1,y2},{Right,Top}],
{barvacary,Thickness[1.3tloustka],lomenacara},
{barvabodu,PointSize[velikostbodu],body}},
PlotRange->{{x1,x2},{y1,y2}}],
{{n,pocetkroku0,Style["počet kroků",15,barva]},pocetkrokumin,pocetkrokumax,deltapocetkroku}]

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

Vektory

{vyraz1,vyraz2,...} - tzv. List (seznam), pomocí kterého lze reprezentovat i vektory.

Arrow[{{(Subscript[x, 1]),(Subscript[y, 1])},{(Subscript[x, 2]),(Subscript[y, 2])}}] - v grafickém režimu vykreslí vektor, který má počáteční bod o souřadnicích [(Subscript[x, 1]); (Subscript[y, 1])] a koncový bod o souřadnicích [(Subscript[x, 2]); (Subscript[y, 2])].

vektor={1,2};
Graphics[Arrow[{{0,0},vektor}]]

vektor={1,2,3};
Graphics3D[Arrow[{{0,0,0},vektor}]]

S vektory lze dále pracovat jako s vektory v matematice a lze definovat:
	násobek vektoru skalárem;
	velikost vektoru - Norm[vektor];
	součet (resp. rozdíl) vektorů;
	skalární součin - Dot[vektor1,vektor2] nebo vektor1.vektor2, výsledkem je číslo;
			   Pozor!!! Mezi vektory je opravdu tečka!!! (Běžně se součin značí * nebo mezerou - zde je tečka!!!)
	vektorový součin - Cross[vektor1,vektor2] nebo vektor1×vektor2, výsledkem je vektor;
			Poznámka: Znak × pro vektorový součin dvou vektorů lze zapsat takto: EsccrossEsc.
		úhel vektorů - VectorAngle[vektor1,vektor2], výsledkem je úhel v radiánech.

vektor1={1,2,3};
vektor2={-2,4,0};
cislo=10;

nasobek=cislo vektor1;
velikost=Norm[vektor1];
soucet=vektor1+vektor2;
rozdil=vektor1-vektor2;
skalarnisoucin=vektor1.vektor2;
vektorovysoucin=vektor1\[Cross]vektor2;
uhelvektoru=Round[(180./π)VectorAngle[vektor1,vektor2],0.1];
Print["Násobek čísla ",cislo," a vektoru ",vektor1," je vektor ",nasobek,"."]
Print["Velikost vektoru ",vektor1," je číslo ",velikost,"."]
Print["Součet vektorů ",vektor1," a ",vektor2," je vektor ",soucet,"."]
Print["Rozdíl vektorů ",vektor1," a ",vektor2," je vektor ",rozdil,"."]
Print["Skalární součin vektorů ",vektor1," a ",vektor2," je číslo ",skalarnisoucin,"."]
Print["Vektorový součin vektorů ",vektor1," a ",vektor2," je vektor ",vektorovysoucin,"."]
Print["Úhel mezi vektory ",vektor1," a ",vektor2," je ",uhelvektoru," stupňů."]

Další operace, které lze aplikovat na vektory:
	Normalize[vektor] - vrací jednotkový vektor k vektoru vektor;
	Projection[vektor1,vektor2] - vrací projekci vektoru vektor1 do směru vektoru vektor2;

vektor1={-1,2,-3};
jednotkovy=Normalize[vektor1];
Print["Jednotkový vektor k vektoru ",vektor1," je vektor ",jednotkovy,"."]

vektor1={5,-3,4};
vektorosax={1,0,0};
vektor1x=Projection[vektor1,vektorosax];
Print["Průmět vektoru ",vektor1," do směru osy x je vektor ",vektor1x,"."]

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

16. úkol: Vektory

Vykreslete červenou čárou tloušťky 0,006 do kartézského systému souřadnic 0xy vektor (Overscript[v, ->])=(-2,1), jehož koncová šipka bude mít velikost 0,05. Osy systému i vektor popište.

Řešení

vektor={-2,1};
tloustka=0.006;
sipka=0.05;
xmin=-4;
ymin=-4;

osax={
Arrowheads[{0,sipka}],
Arrow[{{xmin,0},{-xmin,0}}]};
osay={
Arrowheads[{0,sipka}],
Arrow[{{0,ymin},{0,-ymin}}]};
kreslivektor={
Arrowheads[{0,sipka}],
Arrow[{{0,0},vektor}]};
Graphics[{
{Black,Thickness[tloustka],osax},
{Black,Thickness[tloustka],osay},
Text[Style["x",17,Black,FontFamily->Times],{-xmin,0},{Center,Top}],
Text[Style["y",17,Black,FontFamily->Times],{-0.1,-ymin},{Right,Center}],
{Red,Thickness[tloustka],kreslivektor},
Text[Style["(Overscript[v, ->])",17,Red,FontFamily->Times],vektor,{Right,Bottom}]
}]

Jsou dány vektory (Overscript[u, ->])=(-1;1;2) a (Overscript[v, ->])=(2;1;-1). Určete vektor (Overscript[w, ->]), který je vektorovým součinem vektorů (Overscript[u, ->]) a (Overscript[v, ->]) (v tomto pořadí). Všechny vektory vykreslete do kartézského systému souřadnic (vektor (Overscript[u, ->]) modře, vektor (Overscript[v, ->]) fialově a vektor (Overscript[w, ->]) červeně) a vypočtěte vzájemné ochylky všech tří vektorů.

Řešení

vektoru={-1,1,2};
vektorv={2,1,-1};
tloustka=0.006;
sipka=0.04;
xmin=-5;
ymin=-5;
zmin=-5;

vektorw=vektoru\[Cross]vektorv;
osax={
Arrowheads[{0,sipka}],
Arrow[{{xmin,0,0},{-xmin,0,0}}]};
osay={
Arrowheads[{0,sipka}],
Arrow[{{0,ymin,0},{0,-ymin,0}}]};
osaz={
Arrowheads[{0,sipka}],
Arrow[{{0,0,zmin},{0,0,-zmin}}]};
kreslivektoru={
Arrowheads[{0,sipka}],
Arrow[{{0,0,0},vektoru}]};
kreslivektorv={
Arrowheads[{0,sipka}],
Arrow[{{0,0,0},vektorv}]};
kreslivektorw={
Arrowheads[{0,sipka}],
Arrow[{{0,0,0},vektorw}]};
Graphics3D[{
{Black,Thickness[tloustka],osax},
{Black,Thickness[tloustka],osay},
{Black,Thickness[tloustka],osaz},
Text[Style["x",17,Black,FontFamily->Times],{-1.1xmin,0,0}],
Text[Style["y",17,Black,FontFamily->Times],{-0.1,-1.1ymin,0}],
Text[Style["z",17,Black,FontFamily->Times],{-0.1,0,-1.1zmin}],
{Blue,Thickness[tloustka],kreslivektoru},
{Magenta,Thickness[tloustka],kreslivektorv},
{Red,Thickness[tloustka],kreslivektorw},
Text[Style["(Overscript[u, ->])",17,Blue,FontFamily->Times],1.2vektoru],
Text[Style["(Overscript[v, ->])",17,Magenta,FontFamily->Times],1.2vektorv],
Text[Style["(Overscript[w, ->])",17,Red,FontFamily->Times],1.2vektorw]
},Boxed->False]
Print["Úhel mezi vektory (Overscript[u, ->]) =\!\(\*
StyleBox[" ",
FontSlant->"Italic"]\)",vektoru," a (Overscript[v, ->]) = ",vektorv," je ",Round[(180/π)VectorAngle[vektoru,vektorv],0.1]," stupňů."]
Print["Úhel mezi vektory (Overscript[u, ->]) =\!\(\*
StyleBox[" ",
FontSlant->"Italic"]\)",vektoru," a (Overscript[w, ->]) = ",vektorw," je ",Round[(180/π)VectorAngle[vektoru,vektorw],0.1]," stupňů."]
Print["Úhel mezi vektory (Overscript[v, ->]) =",vektorv," a (Overscript[w, ->]) = ",vektorw," je ",Round[(180/π)VectorAngle[vektorv,vektorw],0.1]," stupňů."]

Bez použití funkce Normalize[] najděte jednotkový vektor k vektoru (Overscript[v, ->])=(4,-2,-4).

Řešení

vektor={4,-2,-4};
jednotkovy=(vektor/(Norm[vektor]));
Print["Jednotkový vektor k vektoru (Overscript[v, ->]) = ",vektor," je vektor (Overscript[r, ->]) = ",jednotkovy,"."]

Pomocí příkazu Manipulate[] vytvořte interaktivní simulátor demonstrující sčítání dvou vektorů v rovině. Volitelně zobrazte i vektorový rovnoběžník, pomocí kterého lze získat výsledný vektor.

Řešení

xmin=-10;xmax=10;
ymin=-10;ymax=10;
deltax=0.5;deltay=0.5;
x10=RandomInteger[{xmin,xmax}];y10=RandomInteger[{ymin,ymax}];
x20=RandomInteger[{xmin,xmax}];y20=RandomInteger[{ymin,ymax}];

barva=Black;
barva1=Blue;
barva2=Magenta;
barvavysl=Red;
barvarovnobezniku=Gray;
tloustka=0.006;
sipka=0.05;

osax={
Arrowheads[{0,sipka}],
Arrow[{{xmin,0},{xmax,0}}]};
osay={
Arrowheads[{0,sipka}],
Arrow[{{0,ymin},{0,ymax}}]};

Manipulate[
kreslivektor1={
Arrowheads[{0,sipka}],
Arrow[{{0,0},{x1,y1}}]};
kreslivektor2={
Arrowheads[{0,sipka}],
Arrow[{{0,0},{x2,y2}}]};
xvysl=x1+x2;
yvysl=y1+y2;
kreslivektorvysl={
Arrowheads[{0,sipka}],
Arrow[{{0,0},{xvysl,yvysl}}]};
rovnobeznik=Line[{{x1,y1},{xvysl,yvysl},{x2,y2}}];
Graphics[{
{barva,Thickness[tloustka],osax},
{barva,Thickness[tloustka],osay},
Text[Style["x",17,Black,FontFamily->Times],{-xmin,0},{Center,Top}],
Text[Style["y",17,Black,FontFamily->Times],{-0.1,-ymin},{Right,Center}],
{barva1,Thickness[tloustka],kreslivektor1},
{barva2,Thickness[tloustka],kreslivektor2},
{barvavysl,Thickness[tloustka],kreslivektorvysl},
Text[Style["(Overscript[u, ->])",17,barva1,FontFamily->Times],{1.2x1,1.2y1},{Center,Center}],
Text[Style["(Overscript[v, ->])",17,barva2,FontFamily->Times],{1.2x2,1.2y2},{Center,Center}],
Text[Style["(Overscript[w, ->])",17,barvavysl,FontFamily->Times],{1.2xvysl,1.2yvysl},{Center,Center}],
If[zobrazitrovnobeznik,
{barvarovnobezniku,Dashed,Thickness[0.5tloustka],rovnobeznik},
Text[""]]
},PlotRange->{{1.25xmin,1.25xmax},{1.25ymin,1.25ymax}}],
{{x1,x10,Style["(Subscript[u, x])",15,barva1]},xmin,xmax,deltax},
{{y1,y10,Style["(Subscript[u, y])",15,barva1]},ymin,ymax,deltay},
Delimiter,
{{x2,x20,Style["(Subscript[v, x])",15,barva2]},xmin,xmax,deltax},
{{y2,y20,Style["(Subscript[v, y])",15,barva2]},ymin,ymax,deltay},
Delimiter,
{{zobrazitrovnobeznik,True,Style["rovnoběžník",15,barvarovnobezniku,FontFamily->Times]},{True,False},ControlType->Checkbox},
ControlPlacement->Left]

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

Matice

{{vyraz1,vyraz2,...},{vyraz3,vyraz4,...},...} - tzv. List (seznam), pomocí kterého lze reprezentovat matice.

MatrixForm[list] - zobrazí matici definovanou pomocí seznamu list v běžném tvaru, jak se běžně matice zapisuje (v učebnicích, ...).
Pozor!!! S maticí zobrazenou v běžném tvaru není možné provádět některé další operace! Mějte proto uloženou původní matici (napsanou v Mathematické notaci) pro provádění běžných operací s maticemi.

maticeA={{a,b,c},{1,2,3}}
MatrixForm[maticeA]

S maticemi lze dále pracovat jako s maticemi v matematice a lze definovat:
	typ matice - Dimensions[matice];
	násobek matice skalárem;
	součet (resp. rozdíl) matic TÉHOŽ TYPU;
	součin matic - Dot[matice1,matice2] nebo matice1.matice2, přičemž počet sloupců matice1 musí být roven počtu řádků matice2, výsledná matice je typu (pocet_radku_matice1,pocet_sloupcu_matice2);
			   Pozor!!! Mezi maticemi je opravdu tečka!!! (Běžně se součin značí * nebo mezerou - zde je tečka (analogicky jako u vektorů)!!!)
	jednotková matice řádu rad - IdentityMatrix[rad];
	inverzní matice - Inverse[matice], lze aplikovat pouze na ČTVERCOVÉ matice;
	transponovaná matice - Transpose[matice];
	hodnost matice - MatrixRank[matice];
	determinant matice - Det[matice], lze aplikovat pouze na ČTVERCOVÉ matice;
	součet prvků na hlavní diagonále - Tr[matice];
	výpis prvků na hlavní diagonále - Diagonal[matice];
	diagonální matice ze zadaných prvků - DiagonalMatrix[vektor].

matice1={{1,2,3},{-1,2,0}};
matice2={{-1,2,0},{-2,1,3}};
matice3={{1,3},{5,4}};
matice4={{1,3,-2},{2,-1,3},{4,1,1}};
cislo=-5;
matice1nasobek=MatrixForm[cislo matice1];
typmatice1=Dimensions[matice1];
soucet=MatrixForm[matice1+matice2];
soucin24=MatrixForm[matice2.matice4];
jednotkova4radu=MatrixForm[IdentityMatrix[4]];
inverznimatice3=MatrixForm[Inverse[matice3]];
transponovanamatice2=MatrixForm[Transpose[matice2]];
hodnostmatice1=MatrixRank[matice1];
detmatice3=Det[matice3];
soucetdiagonala=Tr[matice1];
prvkydiagonaly=Diagonal[matice1];
prvkynadiagonalu=matice1[[1]];
maticediagonalni=MatrixForm[DiagonalMatrix[prvkynadiagonalu]];

Print["Matice ",MatrixForm[matice1]," je typu ",typmatice1,"."]
Print["Násobek čísla ",cislo," a matice ",MatrixForm[matice1]," je matice ",matice1nasobek,"."]
Print["Součet matic ",MatrixForm[matice1]," a ",MatrixForm[matice2]," je matice ",soucet,"."]
Print["Součin matic ",MatrixForm[matice2]," a ",MatrixForm[matice4]," je matice ",soucin24,"."]
Print["Jednotková matice 4. řádu je matice ",jednotkova4radu,"."]
Print["Inverzní matice k matici ",MatrixForm[matice3]," je matice ",inverznimatice3,"."]
Print["Transponovaná matice k matici ",MatrixForm[matice2]," je matice ",transponovanamatice2,"."]
Print["Hodnost matice ",MatrixForm[matice1]," je ",hodnostmatice1,"."]
Print["Determinant matice ",MatrixForm[matice3]," je číslo ",detmatice3,"."]
Print["Součet prvků na hlavní diagonále matice ",MatrixForm[matice1]," je ",soucetdiagonala,"."]
Print["Prvky hlavní diagonály téže matice jsou ",prvkydiagonaly,"."]
Print["Diagonální matice sestavená z prvků ",prvkynadiagonalu," má tvar ",maticediagonalni,"."]

CoefficientArrays[polynom,promenna] - vrací pole (seznam) koeficientů v polynomu polynom vzhledem k neznámé promenna.

rovnice=a (x^2)+b x+c==0;
CoefficientArrays[rovnice,x];
Normal[%]

rovnice1=a x+b y+c==0;
rovnice2=d x+e y+f==0;
{pravastrana,levastrana}=CoefficientArrays[{rovnice1,rovnice2},{x,y}];
levastrana//MatrixForm
pravastrana//MatrixForm

RowReduce[matice] - vrací matici, která je ekvivalentní matici matice a je vhodná pro řešení soustav rovnic Gaussovou eliminační metodou.

LowerTriangularize[matice] - vrací matici, která vznikne z matice matice tak, že prvky nad hlavní diagonálou budou nahrazeny nulami (ostatní prvky budou ponechány beze změny);
UpperTriangularize[matice] - vrací matici, která vznikne z matice matice tak, že prvky pod hlavní diagonálou budou nahrazeny nulami (ostatní prvky budou ponechány beze změny).

matice={{2,1,-3},{1,4,2},{3,1,-1}};
%//MatrixForm
LowerTriangularize[matice]//MatrixForm
UpperTriangularize[matice]//MatrixForm

RotationMatrix[φ] - vrací matici, reprezentující otočení o zadaný úhel φ ve směru chodu hodinových ručiček.

RotationMatrix[fi]//MatrixForm

souradnice={{0,0},{1,1},{1,2},{3,1},{4,2}};
Graphics[{
{Red,Thickness[0.007],Line[{souradnice}]},
{Blue,Thickness[0.007],Line[{souradnice.RotationMatrix[30Degree]}]}
}]

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

17. úkol: Matice

Demonstrujte pomocí příkazu Manipulate[] výpočet determinantů čtvercových matic různých stupňů. Prvky matice jsou náhodná celá čísla z intervalu -5 až 7.

Řešení

stupen0=2;stupenmin=1;stupenmax=10;deltastupen=1;
dolnimez=-5;hornimez=7;
barva=Black;

Manipulate[
matice=RandomInteger[{dolnimez,hornimez},{n,n}];
matice//MatrixForm;
determinant=Det[matice];
Graphics[{
Text[Style[StringJoin["A = ",ToString[matice//MatrixForm,StandardForm]],15,barva,FontFamily->Times],{0,0},{Center,Center}],
Text[Style[StringJoin["|A| = ",ToString[determinant,StandardForm]],15,barva,FontFamily->Times],{0,-0.8n},{Center,Center}]
},
PlotRange->{{-stupenmax,stupenmax},{-stupenmax,stupenmax}}],
{{n,stupen0,Style["stupeň determinantu",15,barva]},stupenmin,stupenmax,deltastupen}]

Pomocí Gaussovy eliminační metody vyřešte soustavu rovnic 2x+y+z=1, x+2y-z=2 a x+y+2z=3.

Řešení

(*maticesoustavy={{2,1,1},{1,2,-1},{1,1,2}};
pravestrany={1,2,3};
matice=Transpose[Join[Transpose[maticesoustavy], {pravestrany}]];*)
rovnice1=2x+y+z==1;
rovnice2=x+2y-z==2;
rovnice3=x+y+2z==3;
{pravestrany,maticesoustavy}=CoefficientArrays[{rovnice1,rovnice2,rovnice3},{x,y,z}];
pravestrany=-pravestrany;
pocetneznamych=Length[pravestrany];
matice=Transpose[Join[Transpose[maticesoustavy], {pravestrany}]];

maticeupravena=RowReduce[matice];
maticesoustavyupravena=RowReduce[maticesoustavy];
Print["Matice soustavy rovnic je matice ",MatrixForm[maticesoustavy],", matice pravých stran je matice ",MatrixForm[pravestrany]," a rozšířená matice soustavy má tvar ",MatrixForm[matice],"."]
Print["Upravená matice soustavy rovnic má tvar ",MatrixForm[maticeupravena],"."]
Print[""];

hodnost1=MatrixRank[maticesoustavyupravena];
hodnost2=MatrixRank[maticeupravena];
If[hodnost1==hodnost2,
If[hodnost1==pocetneznamych,
{reseni=maticeupravena[[All,-1]],
Print["Soustava rovnic má jediné řešení: P = ",reseni,"."]},
Print["Soustava má nekonečně mnoho řešení."]],
Print["Soustava rovnic nemá žádné řešení."]];

Pomocí příkazu Manipulate[] zobrazte pravidelný n-úhelník (n maximálně rovno 10) a jeho rotaci v kartézském systému souřadnic v kladném smyslu.

Řešení

n0=4;nmin=3;nmax=10;deltan=1;
x00=0;x0min=-10;x0max=10;deltax0=0.1;
y00=0;y0min=-10;y0max=10;deltay0=0.1;
polomer0=4;polomermin=1;polomermax=6;deltapolomer=0.1;
fi0=0;fimin=-2π;fimax=2π;deltafi=(π/20);

barva=Black;
barvautvaru=Lighter[Blue];
barvautvaru2=Red;
velikostsipky=0.05;
tloustka=0.005;

osax={
Arrowheads[{0,velikostsipky}],
Arrow[{{x0min,0},{x0max,0}}]};
osay={
Arrowheads[{0,velikostsipky}],
Arrow[{{0,y0min},{0,y0max}}]};

Manipulate[
vrcholynuhelniku=Table[{x0+polomer Cos[((2π)/n)i],y0+polomer Sin[((2π)/n)i]},{i,0,n-1,1}];
nuhelnik=Polygon[{vrcholynuhelniku}];
novevrcholy=vrcholynuhelniku.RotationMatrix[-fi];
novynuhelnik=Polygon[{novevrcholy}];
Graphics[{
{barva,Thickness[tloustka],osax},
{barva,Thickness[tloustka],osay},
Text[Style["x",15,barva,FontFamily->Times],{x0max,0.05y0min},{Right,Top}],
Text[Style["y",15,barva,FontFamily->Times],{0.1x0min,y0max},{Left,Top}],
{barvautvaru,nuhelnik},
{barvautvaru2,Opacity[0.5],novynuhelnik}
},
PlotRange->{{x0min,x0max},{y0min,y0max}}],

{{n,n0,Style["počet stran",15,barva]},nmin,nmax,deltan},
{{polomer,polomer0,Style["r",15,barva]},polomermin,polomermax,deltapolomer},
Delimiter,
{{x0,x00,Style["(Subscript[x, 0])",15,barva]},x0min,x0max,deltax0},
{{y0,y00,Style["(Subscript[y, 0])",15,barva]},y0min,y0max,deltay0},
Delimiter,
{{fi,fi0,Style["φ",15,barva]},fimin,fimax,deltafi},
ControlPlacement->Left]

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