Math40-3.nb POČÍTAČOVÉ ALGEBRAICKÉ SYSTÉMY: -MATHEMATICA 4.0- Vojtěch Bartík Část 3 Transformační pravidla neboli substituce Algebraické úpravy výrazů Funkce:definování a iterování Elementy programování: testy, podmínky, cykly, lokalizace proměnných a konstant Transformační pravidla neboli substituce à Obecná charakteristika Transformační pravidla jsou výrazy tvaru lhs -> rhs, lhs :> rhs s vnitřní reprezentací Rule[lhs, rhs], RuleDelayed[lhs, rhs]. Levá strana lhs může obsahovat podmínky pro aplikování transformačního pravidla. Pomocí transformačních pravidel a příkazů Replace[expr,rule], Replace[expr,{rule,...}, expr/.rule, expr/.{rule,rule2,...}, expr//.rule, expr//.{rule,rule2,...}, z nichž poslední čtyři mají vnitřní reprezentaci ReplaceAll[expr,rule], ReplaceAll[expr,List[rule,...]], ReplaceRepeated[expr,rule], ReplaceRepeated[expr,List[rule,...]], můžeme počítat hodnoty výrazů pro konkrétní hodnoty proměnných nebo i jejich částí a také je transformovat na jiné výrazy. Možné jsou i příkazy Replace[expr,{rules,...}], expr/.{rules,rules2,...}, expr//.{rules,rules2,...} které vytvoří seznamy Replace[expr,rules],...}, {expr/.rules,expr/.rules2,...}, {expr//.rules,expr//.rules2,...}
2 Math40-3.nb à Replace Replace[expr,rules]... prochází seznam rules a aplikuje na expr první použitelné pravidlo, které najde. Další pravidla už nezkouší a tedy neaplikuje. 8Replace@x + y, x 2D, Replace@x + y, 8x + y 2, x + y 3<D, Replace@x + y, 8x + y 3, x + y 2<D< 8x + y, 2, 3< à ReplaceAll expr/.rules... prochází seznam částí výrazu expr a pro každou část hledá v seznamu rules pravidla, která by bylo možné na tuto část aplikovat. Pokud taková pravidla v seznamu rules existují, aplikuje první, které najde, a další už neaplikuje ani na danou část, ani na její podčásti. Příklady: 8x + x 2 ê. 8x + x 2 a, x b, x 2 c<, x + x 2 ê. 8x b, x 2 c<, x + x 2 ê. x b, x + x 2 ê. x 2 c< 8a, b + c, b + b 2, c + x< 8x + x 2 ê. x b ê. x 2 c, x + x 2 ê. x 2 c ê. x b< 8b + b 2, b + c< à ReplaceRepeated expr//.rules... iteruje příkaz expr/.rules, dokud se výsledek nepřestane měnit nebo dokud počet iterací nepřesáhne maximální hodnotu danou volitelným parametrem MaxIterations. Tento parametr je implicitně nastaven na 65536 Příklady: list = 80, 50, 00<; list êê. n_ ê; n > 0 n General::spell : Possible spelling error: new symbol name "list" is similar to existing symbol "List". 80, 0, 0< ReplaceRepeated@list, n_ ê; n > 0 n, MaxIterations 0D ReplaceRepeated::rrlim : Exiting after 80, 50, 00< scanned 0 times.
Math40-3.nb 3 80, 40, 90< ReplaceRepeated@list, n_ ê; n > 0 n, MaxIterations 50D ReplaceRepeated::rrlim : Exiting after 80, 50, 00< scanned 50 times. 80, 0, 50< ReplaceRepeated@list, n_ ê; n > 0 n, MaxIterations 00D ReplaceRepeated::rrlim : Exiting after 80, 50, 00< scanned 00 times. 80, 0, 0< Clear@trigRulesD; trigrules = 8Sin@n_ x_d ê; n > Sin@Hn L xd Cos@xD + Cos@Hn L xd Sin@xD, Cos@n_ x_d ê; n > Cos@Hn L xd Cos@xD Sin@Hn L xd Sin@xD<; ColumnForm@Table@Expand@Sin@n xd êê. trigrulesd, 8n, 2, 6<DD 2 Cos@xD Sin@xD 3 Cos@xD 2 Sin@xD Sin@xD 3 4 Cos@xD 3 Sin@xD 4 Cos@xD Sin@xD 3 5 Cos@xD 4 Sin@xD 0 Cos@xD 2 Sin@xD 3 + Sin@xD 5 6 Cos@xD 5 Sin@xD 20 Cos@xD 3 Sin@xD 3 + 6 Cos@xD Sin@xD 5 ColumnForm@Expand@Table@Sin@n xd, 8n, 2, 6<D êê. trigrulesdd 2 Cos@xD Sin@xD 3 Cos@xD 2 Sin@xD Sin@xD 3 4 Cos@xD 3 Sin@xD 4 Cos@xD Sin@xD 3 5 Cos@xD 4 Sin@xD 0 Cos@xD 2 Sin@xD 3 + Sin@xD 5 6 Cos@xD 5 Sin@xD 20 Cos@xD 3 Sin@xD 3 + 6 Cos@xD Sin@xD 5 Použijeme-li místo odložených transformačních pravidel RuleDelayed pravidla Rule, mohou nastat potíže: Clear@trigRulesD; trigrules = 8Sin@Hn_ ê; n > L x_d Sin@Hn L xd Cos@xD + Cos@Hn L xd Sin@xD, Cos@Hn_ ê; n > L x_d Cos@Hn L xd Cos@xD Sin@Hn L xd Sin@xD<; Pokud je proměnná v příkazu Table označena symbolem různým od symbolu n použitého v definici pravidel trigrules, potíže nejsou: ColumnForm@Table@Expand@Sin@k xd êê. trigrulesd, 8k, 2, 3<D, CenterD 2 Cos@xD Sin@xD 3 Cos@xD 2 Sin@xD Sin@xD 3 Je-li označena stejným symbolem, dostaneme chybný výsledek:
4 Math40-3.nb SetOptions@ReplaceRepeated, MaxIterations 3D; tt = Table@Expand@Sin@n xd êê. trigrulesd, 8n, 2, 3<D; ReplaceRepeated::rrlim : Exiting after Sin@3 xd scanned 3 times. tt@@dd 2 Cos@xD Sin@xD tt@@2dd 3 Cos@xD 2 Cos@2 xd Sin@xD Cos@2 xd Sin@xD 3 + Cos@xD 3 Sin@2 xd 3 Cos@xD Sin@xD 2 Sin@2 xd SetOptions@ReplaceRepeated, MaxIterations 6D; tt = Table@Expand@Sin@n xd êê. trigrulesd, 8n, 2, 3<D; ReplaceRepeated::rrlim : Exiting after Sin@3 xd scanned 6 times. tt@@dd 2 Cos@xD Sin@xD tt@@2dd 6 Cos@xD 5 Cos@2 xd Sin@xD 20 Cos@xD 3 Cos@2 xd Sin@xD 3 + 6 Cos@xD Cos@2 xd Sin@xD 5 + Cos@xD 6 Sin@2 xd 5 Cos@xD 4 Sin@xD 2 Sin@2 xd + 5 Cos@xD 2 Sin@xD 4 Sin@2 xd Sin@xD 6 Sin@2 xd Potíže ale zmizí, vytvoříme-li napřed celý seznam a potom aplikujeme transformační pravidla: SetOptions@ReplaceRepeated, MaxIterations 3D; ColumnForm@Expand@Table@Sin@n xd, 8n, 2, 3<D êê. trigrulesd, CenterD 2 Cos@xD Sin@xD 3 Cos@xD 2 Sin@xD Sin@xD 3 SetOptions@ReplaceRepeated, MaxIterations 65536D; TableForm@Expand@Table@Sin@n xd, 8n, 2, 3<D êê. trigrulesdd 2 Cos@xD Sin@xD 3 Cos@xD 2 Sin@xD Sin@xD 3
Math40-3.nb 5 Algebraické úpravy výrazů à Obecné výrazy: Expand, ExpandAll, PowerExpand, FunctionExpand, Simplify, FullSimplify Expand Expand[expr]... expanduje mocniny, jejichž exponenty jsou přirozená čísla, a součiny. Operuje pouze na nejvyšší úrovni výrazu. p = x 2 + x + ; p2 = x 2 3 x + 2; p3 = Hy + L 2 ; 8p p2, Expand@p p2d< 8H2 3 x + x 2 L H + x + x 2 L, 2 x 2 x 3 + x 4 < 8p 2, Expand@p 2 D< 9H + x + x 2 L 2, + 2 x + 3 x 2 + 2 x 3 + x 4 = p p2 : p3, Expand p p2 É p3 ÖÑ > : H2 3 x + x2 L H + x + x 2 L H + yl 2, 2 H + yl 2 x H + yl 2 2 x 3 H + yl 2 + x 4 H + yl 2 > x lo x+ + y x y+ x+ + y É y+ o m, Expand } o z + n z + o ÖÑ ~ x lo +x m + y +y o, n + z x H + xl H + zl + y o } H + yl H + zl o ~ Zkusme za x dosadit: ColumnForm@8p p2 ê. x Sin@xD, Expand@p p2 ê. x Sin@xDD<, CenterD H2 3 Sin@xD + Sin@xD 2 L H + Sin@xD + Sin@xD 2 L 2 Sin@xD 2 Sin@xD 3 + Sin@xD 4 ColumnForm@8p Hp2 ê. x yl, Expand@p Hp2 ê. x yld<, CenterD H + x + x 2 L H2 3 y + y 2 L 2 + 2 x + 2 x 2 3 y 3 x y 3 x 2 y + y 2 + x y 2 + x 2 y 2
6 Math40-3.nb Expand[expr, patt]... expanduje mocniny, jejichž exponenty jsou přirozená čísla, a součiny, ale nechá beze změny ty části výrazu expr, které neobsahují žádnou část mající tvar šablony (vzoru) patt. Operuje pouze na nejvyšší úrovni výrazu. ColumnForm@8p p2, Expand@p p2d, Expand@p p2, D<, CenterD H2 3 x + x 2 L H + x + x 2 L 2 x 2 x 3 + x 4 2 3 x + x 2 + x H2 3 x + x 2 L + x 2 H2 3 x + x 2 L ColumnForm@8#, Expand@#D, Expand@#, xd< &@p Hp2 ê. x yld, CenterD H + x + x 2 L H2 3 y + y 2 L 2 + 2 x + 2 x 2 3 y 3 x y 3 x 2 y + y 2 + x y 2 + x 2 y 2 2 3 y + y 2 + x H2 3 y + y 2 L + x 2 H2 3 y + y 2 L Expand má skryté (nepovinné) argumenty: Options@ExpandD 8Modulus 0, Trig False< Při nastavení Modulus -> p, p π 0, redukuje výsledek modulo p, takže např. pro p = 2 každý sudý koeficient bude nahrazen nulou. Při nastavení Trig -> True provede s trigonometrickými funkcemi totéž co TrigExpand. 8Expand@HCos@2 xd + L 2 D, Expand@HCos@2 xd + L 2, Trig TrueD< êê ColumnForm@#, CenterD & + 2 Cos@2 xd + Cos@2 xd 2 3 2 + 2 Cos@xD2 + Cos@xD4 2 2 Sin@xD 2 3 Cos@xD 2 Sin@xD 2 + Sin@xD4 2 8Expand@H3 x + 2L 3 D, Expand@H3 x + 2L 3, Modulus 2D, Expand@H3 x + 2L 3, Modulus 3D< 88 + 36 x + 54 x 2 + 27 x 3, x 3, 2< ExpandAll ExpandAll[expr]... provede Expand na každou část výrazu expr p p2 : p3, ExpandAll p p2 É p3 ÖÑ > : H2 3 x + x2 L H + x + x 2 L H + yl 2, 2 + 2 y + y 2 x + 2 y + y 2 2 x 3 + 2 y + y 2 + x 4 + 2 y + y 2 >
Math40-3.nb 7 ExpandAll[expr,patt]... provede Expand[#,patt]& na každou část výrazu expr p p2 : p3, HExpandAll@#, yd &L p p2 É p3 ÖÑ > : H2 3 x + x2 L H + x + x 2 L H + yl 2, H2 3 x + x2 L H + x + x 2 L + 2 y + y 2 > p p2 : p3, HExpandAll@#, xd &L p p2 É p3 ÖÑ > : H2 3 x + x2 L H + x + x 2 L H + yl 2, 2 H + yl 2 x H + yl 2 2 x 3 H + yl 2 + x 4 H + yl 2 > ExpandAll má stejné skryté argumenty jako Expand. PowerExpand PowerExpand[expr]... expanduje mocniny součinu, mocniny mocnin, logaritmy mocnin a logaritmy součinů. Nutno použivat opatrně vzhledem k mnohoznačnosti všech těchto funkcí v komplexním oboru. Mathematica nehlídá korektnost těchto úprav!!! 8Log@Hx yl n D, PowerExpand@Log@Hx yl n DD< 8Log@Hx yl n D, n HLog@xD + Log@yDL< 8Log@HCos@xD Exp@yDL n D, PowerExpand@Log@HCos@xD Exp@yDL n DD< 8Log@H y Cos@xDL n D, n Hy + Log@Cos@xDDL< 8Log@HCos@xD Exp@yD z L n D, PowerExpand@Log@HCos@xD Exp@yD z L n DD< 8Log@HH y L z Cos@xDL n D, n Hy z + Log@Cos@xDDL< 8HHCos@xD Sin@xDL n L m, PowerExpand@HHCos@xD Sin@xDL n L m D< 8HHCos@xD Sin@xDL n L m, Cos@xD m n Sin@xD m n < FunctionExpand FunctionExpand[expr]... snaží se expandovat speciální a některé další funkce v expr a zjednodušit argumenty FunctionExpand[expr,assum]... totéž s použitím předpokladů assum 8Expand@Abs@x ydd, FunctionExpand@Abs@x ydd, FunctionExpand@Abs@x yd, x > 0D<
8 Math40-3.nb 8Abs@x yd, Abs@xD Abs@yD, x Abs@yD< 8FunctionExpand@Log@x ydd, FunctionExpand@Log@x yd, x > 0D< 8Log@x yd, Log@xD + Log@yD< 9FunctionExpandA è!!!!!! x 2 E, FunctionExpandA è!!!!!! x 2, x > 0E= 9 è!!!!!!!!!! x è!!!!!!! x, è!!!!!!!!!! x è!!!!!!! x= Simplify Simplify[expr]... aplikuje blíže nespecifikovaná transformační pravidla a uvede expr na tvar, který podle jistého kritéria považuje za nejjednodušší Simplify i j k x + y z ì i j x y { k y + y É y z ê. 8x Sin@xD, y Cos@xD< x { ÖÑ Cos@xD + Sin@xD Simplify@Sin@xD 4 + 2 Sin@xD 2 Cos@xD 2 + Cos@xD 4 D Simplify@Exp@xD 2 + 2 Exp@xD Exp@yD + Exp@yD 2 D H x + y L 2 Simplify[expr,assum]... totéž jako Simplify s použitím předpokladů assum 8Simplify@Sin@n πd, n IntegersD, Simplify@Cos@n πd, n IntegersD< 80, H L n < 8Simplify@Sin@x + 2 n πd, n IntegersD, Simplify@Cos@x + 2 n πd, n IntegersD< 8Sin@xD, Cos@xD< 8Simplify@Sin@x + n πd, n IntegersD, Simplify@Cos@x + n πd, n IntegersD< 8Sin@n π + xd, Cos@n π + xd< 8Simplify@Sin@x + 7 πdd, Simplify@Cos@x + 8 πdd<
Math40-3.nb 9 8 Sin@xD, Cos@xD< 9SimplifyA è!!!!!! x 2 E, SimplifyA è!!!!!! x 2, x RealsE, SimplifyA è!!!!!! x 2, x 0E= 9 è!!!!!! x 2, Abs@xD, x= Simplify $%%%%%% x + É è!!!! ê. 88x 2<, 8x <, 8x <, 8x 2<< x ÖÑ 8 è!!! 2, 2, 0, 0< lo m o Simplify $%%%%%% x + É è!!!!, Simplify $%%%%%%% n x x + É o è!!!!, x > 0 } ÖÑ x o ÖÑ ~ lo m o $%%%%%% x + o} è!!! n x, 0 ~ o 8Simplify@ArcSin@Sin@xDDD, Simplify@ArcSin@Sin@xDD, Piê2 x Piê2D< 8ArcSin@Sin@xDD, x< SimplifyAHx + ylê2 è!!!!!!!! x y, x 0fly 0E True Simplify má skryté (nepovinné) argumenty: Options@SimplifyD 8ComplexityFunction Automatic, TimeConstraint 300, TransformationFunctions Automatic, Trig True< 8Simplify@4 Log@0DD, Simplify@4 Log@0D, ComplexityFunction LeafCountD< 84 Log@0D, Log@0000D< HSimplify@#, ComplexityFunction LeafCountD &L ê@ 84 Log@4D, 2 Log@42D, 4 Log@0D, 3 Log@42D, 5 Log@2000D + 7 Log@3000D< 8Log@256D, Log@764D, Log@0000D, Log@74088D, Log@7007833065954769326580933808760537550439003000D< Údajně lze nastavení změnit na TransformationFunctions Automatic
0 Math40-3.nb nebo na TransformationFunctions {Automatic,f,f2,...} TransformationFunctions {f,f2,...}. Neznám, bohužel, ani jeden příklad, jak to udělat, a sám jsem na to nepřišel. FullSimplify FullSimplify[expr]... zjednoduší expr podobně jako Simplify, ale používá širší paletu transformačních pravidel É FullSimplify $%%%%%%%%%%%%%% 2 x 3 + x ì è!!!!!!!!!!! 2 x ÖÑ $%%%%%%%%%%%%%% 3 + x 9FullSimplifyALogAz + è!!!!!!!!!!! z + è!!!!!!!!!!! z EE, FullSimplifyAArcCosA è!!!!!!!!!!! xee= 8ArcCosh@zD, ArcSinA è!!! xe< H Sin@xD 2 L $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ExpandBI + è!!!! 2M 20 F êê 8#, FullSimplify@#D< & : "########################################################## 2269537 + 5994428 è!!! 2 H Sin@xD 2 L, I3363 + 2378 è!!! 2M Cos@xD 2 > FullSimplify[expr,assum]... totéž jako FullSimplify s použitím předpokladů assum a FullSimplify b + b c + c É a 3, a > 0 && b > 0 && c > 0 ÖÑ True Options@FullSimplifyD 8ComplexityFunction Automatic, ExcludedForms 8<, TimeConstraint, TransformationFunctions Automatic, Trig True< Fibonacciova čísla jsou definována rekurentně takto: první dvě čísla jsou, každé další je součtem dvou 2 předcházejících. GoldenRatio je číslo -+ è!!!! U.68033. 5 Fibonacci ê@ Range@, 8D 8,, 2, 3, 5, 8, 3, 2, 34, 55, 89, 44, 233, 377, 60, 987, 597, 2584<
Math40-3.nb 8FullSimplify@Fibonacci@2 nd, n IntegersD, FullSimplify@Fibonacci@2 nd, n Integers, ComplexityFunction HLeafCount@#D + 00 Count@#, _Fibonacci, 80, <D &LD< :Fibonacci@2 nd, GoldenRatio 2 n H + GoldenRatio 4 n L è!!! > 5 H Sin@xD 2 L $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ExpandBI + è!!!! 2M 20 F êê :FullSimplify@#D, FullSimplifyB#, ExcludedForms > "#### _ F> & :I3363 + 2378 è!!! 2M Cos@xD 2, "########################################################## 2269537 + 5994428 è!!! 2 Cos@xD 2 > à Polynomiální výrazy: PolynomialQ, Factor, FactorTerms, Collect, Variables, Length, Exponent, Coefficient, CoefficientList, PolynomialQuotient, PolynomialRemainder, PolynomialGCD, PolynomialLCM Polynom v proměnné x je výraz typu a 0 + a x + a 2 x 2 +... + a n x n Výraz x přitom nemusí být symbol. Podobně je definován polynom v proměnných x, x2,... PolynomialQ PolynomialQ[expr,x]... testuje, zda Mathematica považuje expr za polynom v proměnné x PolynomialQ[expr,{x,x2,...}]... testuje, zda Mathematica považuje expr za polynom v proměnných x,x2,... 8p, p ê. x Cos@xD< 8 + x + x 2, + Cos@xD + Cos@xD 2 < Map@PolynomialQ@p ê. x Cos@xD, #D &, 8x, Cos@xD<D 8False, True< 8p, p ê. x Exp@xD< 8 + x + x 2, + x + 2 x < Map@PolynomialQ@p ê. x Exp@xD, #D &, 8x, Exp@xD<D 8False, True< 8p Exp@yD, Map@PolynomialQ@p Exp@yD, #D &, 8x, y<d< êê Flatten
2 Math40-3.nb 8 y H + x + x 2 L, True, False< Factor Factor[poly]... rozloží polynom s koeficienty typu Integer nebo Rational na součin polynomu stejného typu, které se v tomto smyslu dále rozložit nedají 8p p2, Factor@p p2d< 8H2 3 x + x 2 L H + x + x 2 L, H 2 + xl H + xl H + x + x 2 L< :ExpandBIx è!!!! 2M 2 F, FactorBExpandBIx è!!!! 2M 2 FF> 82 2 è!!! 2 x + x 2, 2 2 è!!! 2 x + x 2 < 8#, Factor@#D< &@p p2 ê. x Cos@xDD êê ColumnForm@#, CenterD & H2 3 Cos@xD + Cos@xD 2 L H + Cos@xD + Cos@xD 2 L H 2 + Cos@xDL H + Cos@xDL H + Cos@xD + Cos@xD 2 L 8#, Factor@#D< &@p p2 ê. x Exp@xDD 8H2 3 x + 2 x L H + x + 2 x L, H 2 + x L H + x L H + x + 2 x L< Options@FactorD 8Extension None, GaussianIntegers False, Modulus 0, Trig False< GaussianIntegers jsou komplexní čísla tvaru a + b, kde a, b jsou celá čísla. 8Factor@x 2 + D, Factor@x 2 +, GaussianIntegers TrueD< 8 + x 2, H + xl H + xl< 9Factor@x 2 + 2D, FactorAx 2 + 2, Extension è!!!! 2 E= 82 + x 2, I è!!! 2 xm I è!!! 2 + xm< 9Factor@Hx 2 2L Hx 2 + 6LD, FactorAHx 2 2L Hx 2 + 6L, Extension 9 è!!!! 2, è!!!! 3 =E= 8H 2 + x 2 L H6 + x 2 L, I è!!! 2 xm I è!!! 6 xm I è!!! 6 + xm I è!!! 2 + xm<
Math40-3.nb 3 FactorTerms FactorTerms[poly]... vytkne společný numerický faktor 8FactorTerms@H2 x 2 2L H3 x 3LD, FactorTerms@ x 3 x 2 x D< 86 H x x 2 + x 3 L, x x 2 x 3 < Jak je vidět, - se za společný faktor nepovažuje! Options@FactorTermsD 8Modulus 0, Trig False< Collect Collect[poly,x]... vyjádří poly jako polynom v jedné proměnné x Collect[poly,{x,y,...}]... vyjádří poly jako polynom v jedné proměnné x, koeficienty jako polynomy v proměnné y atd. p4 = H + x + y + zl 2 ; 8Expand@p4D, Collect@p4, xd, Collect@p4, yd, Collect@p4, 8x, y<d< êê ColumnForm@#, CenterD & + 2 x + x 2 + 2 y + 2 x y + y 2 + 2 z + 2 x z + 2 y z + z 2 + x 2 + 2 y + y 2 + 2 z + 2 y z + z 2 + x H2 + 2 y + 2 zl + 2 x + x 2 + y 2 + 2 z + 2 x z + z 2 + y H2 + 2 x + 2 zl + x 2 + y 2 + 2 z + z 2 + y H2 + 2 zl + x H2 + 2 y + 2 zl Options@CollectD 8Modulus 0, Trig False< Variables, Length, Exponent, Coefficient, CoefficientList Variables[poly]... seznam proměnných polynomu Length[poly]... počet členů polynomu Exponent[poly,x]... stupeň polynomu vzhledem k x Coefficient[poly,expr]... koeficient výrazu expr v poly Coefficient[poly,expr,n]... koeficient výrazu expr v poly Coefficient[poly,expr,0]... člen poly nezávislý na expr CoefficientList[poly, x]... seznam koeficientů u mocnin proměnné x CoefficientList[poly,{x,y,..]}]...??? ColumnForm@8p, p2 ê. x x y, p p2, p4, Expand@p4D<D
4 Math40-3.nb + x + x 2 2 3 x y + x 2 y 2 H2 3 x + x 2 L H + x + x 2 L H + x + y + zl 2 + 2 x + x 2 + 2 y + 2 x y + y 2 + 2 z + 2 x z + 2 y z + z 2 Variablesê@8p, p2 ê. x x y, p p2, p4, Expand@p4D< 88x<, 8x, y<, 8x<, 8x, y, z<, 8x, y, z<< Lengthê@8p, p2 ê. x x y, p p2, p4, Expand@p4D< 83, 3, 2, 2, 0< HExponent@#, xd &Lê@8p, p2 ê. x x y, p p2, p4, Expand@p4D< 82, 2, 4, 2, 2< HExponent@#, yd &Lê@8p, p2 ê. x x y, p p2, p4, Expand@p4D< 80, 2, 0, 2, 2< HCoefficient@#, x, 2D &Lê@8p, p2 ê. x x y, p p2, p4, Expand@p4D< 8, y 2, 0,, < HCoefficient@#, x yd &Lê@8p, p2 ê. x x y, p p2, p4, Expand@p4D< 80, 3, 0, 2, 2< HCoefficient@#, x 2 D &Lê@8p, p2 ê. x x y, p p2, p4, Expand@p4D< 8, y 2, 0,, < 8p, p2 ê. x > x y, p p2, p4, Expand@p4D< êê CoefficientList@#, xd & êê ColumnForm@#, CenterD & 8,, < 82, 3 y, y 2 < 82,, 0, 2, < 8 + 2 y + y 2 + 2 z + 2 y z + z 2, 2 + 2 y + 2 z, < 8 + 2 y + y 2 + 2 z + 2 y z + z 2, 2 + 2 y + 2 z, < H8p, p2 ê. x > x y, p p2, p4, Expand@p4D< ê. x > Exp@xDL êê CoefficientList@#, xd & êê ColumnForm@#, CenterD &
Math40-3.nb 5 8 + x + 2 x < 82 3 x y + 2 x y 2 < 82 x 2 3 x + 4 x < 8 + 2 x + 2 x + 2 y + 2 x y + y 2 + 2 z + 2 x z + 2 y z + z 2 < 8 + 2 x + 2 x + 2 y + 2 x y + y 2 + 2 z + 2 x z + 2 y z + z 2 < PolynomialQuotient, PolynomialRemainder, PolynomialGCD, PolynomialLCM PolynomialQuotient[poly,poly2,x]... částečný podíl polynomů PolynomialRemainder[poly,poly2,x]... zbytek při dělení PolynomialGCD[poly,poly2,...]... největší společný dělitel PolynomialLCM[poly,poly2,...]... nejmenší společný násobek 8PolynomialQuotient@x 5 + 4 x 2 4 x, x 2 +, xd, PolynomialRemainder@x 5 + 4 x 2 4 x, x 2 +, xd< 84 x + x 3, 5 3 x< PolynomialGCD@x 4 + 4 x 2 4 x, x 2 D + x PolynomialLCM@x 4 + 4 x 2 4 x, x 2 D H + x 2 L H + 5 x + x 2 + x 3 L à Racionální výrazy: Numerator, Denominator, ExpandNumerator, ExpandDenominator, Cancel, Factor, Together, Apart Rationální výrazy jsou výrazy typu poly/poly2. Numerator[expr]... čitatel racionálního výrazu Denominator[expr]... jmenovatel racionálního výrazu ExpandNumerator[expr]... aplikuje Expand na čitatele ExpandDenominator[expr]... aplikuje Expand na jmenovatele Cancel[expr]... vykrátí společné činitele čitatele a jmenovatele Factor[expr]... uvede na společného jmenovatele a na čitalele i jmenovatele aplikuje Factor Together[expr]... uvede na společného jmenovatele Apart[expr]... rozloží na součet polynomu a jednoduchých zlomků Apart[expr,x]... rozloží na součet polynomu a jednoduchých zlomků, proměnné různé od x přitom považuje za konstanty expr = Hx L Hx2 4 x + 4L Hx 2 + L Hx 2L Hx 2 L Hx 2 + 2L
6 Math40-3.nb H + xl H + x 2 L H4 4 x + x 2 L H 2 + xl H + x 2 L H2 + x 2 L 8Numerator@exprD, Denominator@exprD< 8H + xl H + x 2 L H4 4 x + x 2 L, H 2 + xl H + x 2 L H2 + x 2 L< expr2 = ExpandNumerator@exprD 4 + 8 x 9 x 2 + 9 x 3 5 x 4 + x 5 H 2 + xl H + x 2 L H2 + x 2 L expr3 = ExpandDenominator@exprD H + xl H + x 2 L H4 4 x + x 2 L 4 2 x 2 x 2 + x 3 2 x 4 + x 5 expr4 = Cancel@exprD H 2 + xl H + x 2 L H + xl H2 + x 2 L Expand@expr4D 2 H + xl H2 + x 2 L + x H + xl H2 + x 2 L 2 x 2 H + xl H2 + x 2 L + x 3 H + xl H2 + x 2 L ExpandAll@expr4D 2 2 + 2 x + x 2 + x 3 + x 2 + 2 x + x 2 + x 3 2 x 2 2 + 2 x + x 2 + x 3 + x 3 2 + 2 x + x 2 + x 3 expr5 = Apart@exprD 2 + x x 2 + x 2 8Together@expr5D, Factor@expr5D< : 2 + x 2 x2 + x 3 H + xl H2 + x 2 L, H 2 + xl H + x2 L H + xl H2 + x 2 L > expr6 = expr4 ê. x 2 y 2 H 2 + xl H + y 2 L H + xl H2 + y 2 L 8Apart@expr6D, Apart@expr6, yd, Apart@expr6, xd<
Math40-3.nb 7 : 2 + x + x + 2 x H + xl H2 + y 2 L, 2 + x + x + 2 x H + xl H2 + y 2 L, + y2 2 + y 2 3 H + y 2 L H + xl H2 + y 2 L > expr7 = expr6 ê. 8x Exp@xD, y Sin@xD< H 2 + x L H + Sin@xD 2 L H + x L H2 + Sin@xD 2 L 8Numerator@expr7D, Denominator@expr7D< 8H 2 + x L H + Sin@xD 2 L, H + x L H2 + Sin@xD 2 L< 8ExpandNumerator@expr7D, ExpandDenominator@expr7D< : 2 + x 2 Sin@xD 2 + x Sin@xD 2 H + x L H2 + Sin@xD 2, L H 2 + x L H + Sin@xD 2 L 2 + 2 x + Sin@xD 2 + x Sin@xD 2 > Apart@expr7D + Sin@xD 2 2 + Sin@xD 2 3 H + Sin@xD 2 L H + x L H2 + Sin@xD 2 L Apart@expr7, Exp@xDD + Sin@xD 2 2 + Sin@xD 2 3 H + Sin@xD 2 L H + x L H2 + Sin@xD 2 L Apart@expr7, Sin@xDD 2 + x + x 2 + x H + x L H2 + Sin@xD 2 L à Trigonometrické výrazy: TrigExpand, TrigFactor, TrigReduce, ExpToTrig, TrigToExp TrigExpand[expr]... trigonometrický polynom vyjádří jako trigonometrický polynom minimálního počtu různých argumentů TrigFactor[expr]... trigonometrický polynom rozloží na součin jednodušších trigonometrických polynomů TrigReduce[expr]... trigonometrický polynom vyjádří jako trigonometrický polynom prvního stupně ExpToTrig[expr]... vyjádří exponenciální funkce pomocí trigonometrických TrigToExp[expr]... vyjádří trigonometrické funkce pomocí exponenciálních K trigonometrickým funkcím se zde počítajít také hyperbolické funkce!! TrigExpand@Cos@2 Pi xd Sin@3 xd + Cos@4 xdd
8 Math40-3.nb Cos@xD 4 + 3 Cos@xD 2 Cos@π xd 2 Sin@xD 6 Cos@xD 2 Sin@xD 2 Cos@π xd 2 Sin@xD 3 + Sin@xD 4 3 Cos@xD 2 Sin@xD Sin@π xd 2 + Sin@xD 3 Sin@π xd 2 TrigFactor@%D H2 Cos@4 xd + Sin@3 x 2 π xd + Sin@3 x + 2 π xdl 2 TrigToExp@%%D 2 4 x + 2 4 x + 4 3 x 2 π x 4 3 x 2 π x + 4 3 x+2 π x 4 Cos@2 Pi xd Sin@3 xd + Cos@4 xd É TrigExpand Sin@Pi x + 3 xd ÖÑ 3 x+2 π x HCos@xD 4 + 3 Cos@xD 2 Cos@π xd 2 Sin@xD 6 Cos@xD 2 Sin@xD 2 Cos@π xd 2 Sin@xD 3 + Sin@xD 4 3 Cos@xD 2 Sin@xD Sin@π xd 2 + Sin@xD 3 Sin@π xd 2 Lê H3 Cos@xD 2 Cos@π xd Sin@xD Cos@π xd Sin@xD 3 + Cos@xD 3 Sin@π xd 3 Cos@xD Sin@xD 2 Sin@π xdl TrigFactor@%D Csc@3 x + π xd H2 Cos@4 xd + Sin@3 x 2 π xd + Sin@3 x + 2 π xdl 2 Cos@2 Pi xd Sin@3 xd + Cos@4 xd É TrigExpand Sin@Pi x + 3 xd + Cos@2 xd ÖÑ HCos@xD 4 + 3 Cos@xD 2 Cos@π xd 2 Sin@xD 6 Cos@xD 2 Sin@xD 2 Cos@π xd 2 Sin@xD 3 + Sin@xD 4 3 Cos@xD 2 Sin@xD Sin@π xd 2 + Sin@xD 3 Sin@π xd 2 Lê HCos@xD 2 + 3 Cos@xD 2 Cos@π xd Sin@xD Sin@xD 2 Cos@π xd Sin@xD 3 + Cos@xD 3 Sin@π xd 3 Cos@xD Sin@xD 2 Sin@π xdl TrigFactor@%D 2 Cos@4 xd + Sin@3 x 2 π xd + Sin@3 x + 2 π xd 2 HCos@ x 2 + π 2 x D + Sin@ x 2 + π 2 x 5 x DL HCos@ 2 + π 2 x D + Sin@ 5 2 x + π 2 x DL TrigReduce@Cos@2 Pi xd 3 Sin@3 xd 2 + Cos@4 xd Sin@xDD H6 Cos@2 π xd + 2 Cos@6 π xd Cos@6 x 6 π xd 3 Cos@6 x 2 π xd 6 3 Cos@6 x + 2 π xd Cos@6 x + 6 π xd 8 Sin@3 xd + 8 Sin@5 xdl Cos@2 Pi xd 2 Sin@3 xd 2 + Cos@4 xd 3 É TrigReduce Sin@Pi x + 3 xd 3 ÖÑ
Math40-3.nb 9 H2 + 6 Cos@4 xd 2 Cos@6 xd + 2 Cos@2 xd + 2 Cos@4 π xd Cos@6 x 4 π xd Cos@6 x + 4 π xdlêh2 H3 Sin@3 x + π xd Sin@9 x + 3 π xdll Cos@2 Pi xd 2 Sin@3 xd 2 + Cos@4 xd 3 É TrigReduce Sin@Pi x + 3 xd 3 Cos@xD 2 ÖÑ H 2 6 Cos@4 xd + 2 Cos@6 xd 2 Cos@2 xd 2 Cos@4 π xd + Cos@6 x 4 π xd + Cos@6 x + 4 π xdlêh8 HCos@xD 2 Sin@3 x + π xd 3 LL Funkce: definování a iterování à Named functions - funkce s vlatním jménem Funkce na množině M je podle matematické definice předpis f, který každému jejímu prvku x přiřazuje jednoznačně nějaký prvek f[x]. Je-li M množina uspořádaných n-tic, říkáme, že f je funkce n proměnných. Z hlediska systému Mathematica je funkce v podstatě transformační pravidlo, které se na některé výrazy aplikuje automaticky. Nejjednodušší definice funkce může mít tvar f[arg_,arg2_,...]:= expr[arg,arg2,...], kde expr[arg,arg2,...] je libovolný výraz nebo i procedura, která může ale nemusí obsahovat argumenty arg, arg2,... Nejsou-li na pravé straně žádné podmínky, je možná i definice tvaru Obecně má definice funkce tvar f[arg_,arg2_,...]= expr[arg,arg2,...]. f[arg_,arg2_,...]:= expr[arg,arg2,...]/;condition, f[arg_,arg2_,...]:= expr2[arg,arg2,...]/;condition2,... Záhlaví f nemusí být symbol a počet argumentů nemusí být ve všech řádcích definice stejný. Příklady: Clear@f0D; f0@x_d := Sin@xD x; Plot@f0@xD, 8x, 4 π, 4 π<d 7.5 5 2.5-0 -5 5 0-2.5-5 -7.5-0
20 Math40-3.nb Graphics Clear@fD; f@x_d := ê; x < NB π 2 F; f@x_d := Sin@xD ê; NB π 2 F x NB π 2 F; f@x_d := ê; x > NB π 2 F; Plot@f@xD, 8x, π, π<, Frame > TrueD; 0.5 0-0.5 - -3-2 - 0 2 3 Binomická formule Clear@f2D; f2@x_, y_, n_d := Expand@Hx + yl n D; TableForm@Table@f2@a, b, nd, 8n, 2, 5<DD a 2 + 2 a b + b 2 a 3 + 3 a 2 b + 3 a b 2 + b 3 a 4 + 4 a 3 b + 6 a 2 b 2 + 4 a b 3 + b 4 a 5 + 5 a 4 b + 0 a 3 b 2 + 0 a 2 b 3 + 5 a b 4 + b 5 Faktoriál Clear@f3D; f3@x_d := x ê; x ; f3@x_d := x f3@x D ê; x > ; Table@f3@xD, 8x,, 0<D 8, 2, 6, 24, 20, 720, 5040, 40320, 362880, 3628800< É Table f3@xd, :x, 2, 9, > ÖÑ : 2, 3 4, 5 8, 05 6, 945 32, 0395, 3535, 2027025, 34459425 > 64 28 256 52 Polynom s danou posloupností koeficientů
Math40-3.nb 2 Clear@f4D; f4@l_list, x_d := Table@x i, 8i, Length@lD<D.l; f4@8, 2, 3, 4<, xd + 2 x + 3 x 2 + 4 x 3 Náhodný výběr prvku seznamu Clear@f5D; f5@l_listd := Part@l, Random@Integer, 8, Length@lD<DD; Table@f5@Range@0DD, 80<D 85, 7, 8, 9, 4, 0, 3, 5, 7, 6< Náhodné matice s prvky 0, Clear@f6D; f6@n_d := Table@Random@IntegerD, 8n<, 8n<D; f6@4d êê MatrixForm Náhodné matice s prvky patřícími do daného seznamu Clear@f7D; f7@n_, l_d := Table@f5@lD, 8n<, 8n<D; f7@3, 8 2,,, 2<D êê MatrixForm k-členné části seznamu i 0 0 0y 0 0 0 0 0 0 0 j k 0 z 0{ i 2 y 2 j z k 2 2{ Clear@f8D; f8@x_list, k_integerd := 8< ê; k < 0fik > Length@xD; f8@x_list, k_integerd := 88<< ê; k == 0; f8@x_list, k_integerd := Partition@x, kd ê; k == ; f8@x_list, k_integerd := Join@Map@Join@Take@x, D, #D &, f8@drop@x, D, k DD, f8@drop@x, D, kdd ê; < k < Length@xD; f8@x_list, k_integerd := 8x< ê; k == Length@xD; f8@x_listd := Join@Table@f8@x, nd, 8n, 0, Length@xD<DD; ColumnForm@Table@f8@8, 2, 3, 4<, nd, 8n, 0, 4<DD
22 Math40-3.nb 88<< 88<, 82<, 83<, 84<< 88, 2<, 8, 3<, 8, 4<, 82, 3<, 82, 4<, 83, 4<< 88, 2, 3<, 8, 2, 4<, 8, 3, 4<, 82, 3, 4<< 88, 2, 3, 4<< f8@8, 2, 3, 4<D 888<<, 88<, 82<, 83<, 84<<, 88, 2<, 8, 3<, 8, 4<, 82, 3<, 82, 4<, 83, 4<<, 88, 2, 3<, 8, 2, 4<, 8, 3, 4<, 82, 3, 4<<, 88, 2, 3, 4<<< à Pure functions - bezejmenné funkce Jsou to výrazy, které se chovají jako funkce, ale nemají jméno. Dalo by se snad také říci, že to jsou konstrukce, kterými můžeme přimět výraz, aby se choval jako funkce. Bezejmenné funkce mají obecně tento tvar: )Function[x,expr]; 2)expr& s agumentem # místo x; 3)Function[{x,x2,...},expr]; 4)expr& s argumenty #, #2,... místo x,x2,... Konstrukce ) a 2) jsou ekvivalentní a totéž platí o konstrukcích 3) a 4). Příklady - bezejmenné funkce jedné proměnné: ff = Function@x, + x + x 2 + x 3 D; 8ff@D, ff@2d, ff@3d, %@4D, %@5D, %@ad, %@bd< 84, 5, 40, 85, 56, + a + a 2 + a 3, + b + b 2 + b 3 < I + # + # 2 + # 3 &Mê@8, 2, 3, 4, 5, a, b< 84, 5, 40, 85, 56, + a + a 2 + a 3, + b + b 2 + b 3 < Select@Range@50, 00D, PrimeQ@#D &D 853, 59, 6, 67, 7, 73, 79, 83, 89, 97< Select@I# + 3 2 + # 3 &Mê@ Range@50D, PrimeQ@#D &D 8, 9, 39, 359, 09, 2767, 5499, 79559, 85237< Příklady - bezejmenné funkce více proměnných: ff2 = Function@8x, y, n<, Expand@Hx + yl n DD; %@a,, 8D + 8 a + 28 a 2 + 56 a 3 + 70 a 4 + 56 a 5 + 28 a 6 + 8 a 7 + a 8
Math40-3.nb 23 ff2@a,, 8D + 8 a + 28 a 2 + 56 a 3 + 70 a 4 + 56 a 5 + 28 a 6 + 8 a 7 + a 8 IExpandAH# + #2L #3 E &M@a,, 8D + 8 a + 28 a 2 + 56 a 3 + 70 a 4 + 56 a 5 + 28 a 6 + 8 a 7 + a 8 à Iterování funkcí: Nest, NestList, FixedPoint, FixedPointList, ComposeList Nest[f,x,n]... dá f[x] pro n=, f[f[x]] pro n=2, f[f[f[x]]] pro n=3, atd. NestList[f,x,n]... vytvoří seznam {x,f[x]} pro n=, seznam {x,f[x],f[f[x]]} pro n=2, atd. Clear@fD; Nest@f, x, 4D f@f@f@f@xdddd NestList@f, x, 4D 8x, f@xd, f@f@xdd, f@f@f@xddd, f@f@f@f@xdddd< Clear@f9D; f9@x_d := Nest@f9, x, 3D + x + + +x 8Nest@f9,, 00D, N@Nest@f9,, 00D, 20D< : 5734784403870840 9273726929307899976, 0.6803398874989484820> NestList@f9,, 3D :, 2, 2 3, 3 5, 5 8, 8 3, 3 2, 2 34, 34 55, 55 89, 89 44, 44 233, 233 377, 377 60 > FixedPoint[f,x]... aplikuje opakovaně funkci f, dokud se výsledek mění a počet iterací nepřekročí hodnotu MaxIterations FixedPoint[f,x,SameTest->comp]... totéž, skončí ale v okamžiku, kdy porovnání dvou po sobě jdoucích výsledků funkcí comp dá True
24 Math40-3.nb FixedPoint@N@f9@#D, 20D &, D 0.680339887498948482 FixedPoint f9,, SameTest i jabs@# #2D < k Clear@f0D; f0@x_, y_d := 2 Jx + y x N 2586269025 203650074 É z ÖÑ 0 &y 20 { 9NA è!!!! 3, 20E, FixedPoint@N@f0@#, 3D, 20D &, D= 8.7320508075688772935,.7320508075688772935< FixedPoint f0@#, 3D &,, SameTest i jabs@# #2D < k É z ÖÑ 0 &y 20 { 20930833870580428782805050497 65888085260580757076628582646656 N@%, 20D.7320508075688772935 FixedPointList[f,x]... vytváří seznam {x,f[x],f[f[x]],...} a skončí, když se prvky tohoto seznamu přestanou měnit FixedPointList[f,x,SameTest->comp].. totéž, skončí ale v okamžiku, kdy porovnání dvou po sobě jdoucích výsledků funkcí comp dá True FixedPointList@N@f9@#D, 20D &, D êê Length 49 FixedPointList@N@f9@#D, 20D &, D êê Drop@#, 84, 4<D & 8, 0.50000000000000000000, 0.66666666666666666667, 0.6803398874989484822, 0.6803398874989484820, 0.680339887498948482< FixedPointList f9,, SameTest i jabs@# #2D < k 50 É z ÖÑ 0 &y 20 { êê Length
Math40-3.nb 25 FixedPointList f9,, SameTest i jabs@# #2D < k É z ÖÑ 0 &y 20 { :, 2, 2 3, 4807526976 7778742049, 7778742049 2586269025, 2586269025 203650074 > êê Drop@#, 84, 4<D & FixedPointList@N@f0@#, 3D, 20D &, D 8, 2.0000000000000000000,.7500000000000000000,.7324285742857429,.73205080047275405,.7320508075688772953,.7320508075688772935,.7320508075688772935< FixedPointList f0@#, 3D &,, SameTest i jabs@# #2D < k FixedPointList f0@#, 3D &,, SameTest i jabs@# #2D < k 8 É z ÖÑ 0 &y 20 { É z ÖÑ 0 &y 20 { êê Length :, 2, 7 4, 97 56, 887 0864, 70858977 408855776, 0029782734373057 57906977645402304, 20930833870580428782805050497 65888085260580757076628582646656 > ComposeList[{f,f2,...},x]... vytvoří seznam prvků x,f[x], f2[f[x]],f3[f2[f[x]]],... H Unprotect@FunctionD; SetAttributes@Function,HoldAllD; L functions = Map Function@u, Together@uD &D, Table ÉÉ # + i, 8i,, 0< ÖÑ ÖÑ :TogetherB + # F &, TogetherB 2 + # F &, TogetherB 3 + # F &, TogetherB 4 + # F &, TogetherB 5 + # F &, TogetherB 6 + # F &, TogetherB 7 + # F &, TogetherB 8 + # F &, TogetherB 9 + # F &, TogetherB 0 + # F &> ComposeList@functions, xd :x, + x, + x 3 + 2 x, 3 + 2 x 0 + 7 x, 0 + 7 x 43 + 30 x, 43 + 30 x 225 + 57 x, 225 + 57 x 393 + 972 x, 393 + 972 x 9976 + 696 x, 9976 + 696 x 820 + 56660 x, 820 + 56660 x 740785 + 5690 x, 740785 + 5690 x 748905 + 5225670 x >
26 Math40-3.nb Elementy programování: testy, podmínky, cykly, lokalizace proměnných a konstant à Některé testy nabývající pouze hodnot True a False: IntegerQ, EvenQ, OddQ, PrimeQ, NumberQ, NumericQ, PolynomialQ, VectorQ, MatrixQ, SameQ, UnsameQ, TrueQ, MatchQ IntegerQ, EvenQ, OddQ, PrimeQ, NumberQ, NumericQ IntegerQ[expr]... True, je-li expr celé číslo, jinak False EvenQ[expr]... True, je-li expr sudé číslo, jinak False OddQ[expr]... True, je-li expr liché číslo, jinak False PrimeQ[expr]... True, je-li expr prvočíslo, jinak False NumberQ[expr]... True, je-li expr číslo, jinak False NumericQ[expr]... True, je-li expr číslo nebo matematická konstanta jako např. π nebo hodnota funkce s atributem NumericFunction na jejíchž argumentech nabývá NumericQ hodnoty True Clear@xD; 8IntegerQ@xD, EvenQ@xD, OddQ@xD, PrimeQ@xD< 8False, False, False, False< 8IntegerQ@πD, EvenQ@πD, OddQ@πD, PrimeQ@πD< 8False, False, False, False< 8IntegerQ@2.2D, EvenQ@2.2D, OddQ@2.2D, PrimeQ@2.2D< 8False, False, False, False< 8EvenQ@2D, OddQ@2D, PrimeQ@2D, EvenQ@9D, OddQ@9D, PrimeQ@9D< 8True, False, True, False, True, False< Clear@x, yd; NumberQê@ 82, 2.3, 3ê4, π, x, Sin@ D< 8True, True, True, False, False, False< NumericQê@82, 2.3, 3ê4, π, x, Sin@ D<
Math40-3.nb 27 8True, True, True, True, False, True< PolynomialQ, VectorQ, MatrixQ PolynomialQ[expr,{x,x2,...}]... True, je-li expr polynom v x,x2,..., jinak False VectorQ[expr]... True, je-li expr vektor, jinak False MatrixQ[expr]... True, je-li expr matice, jinak False 8PolynomialQ@x + x 4 D, PolynomialQ@x + Sin@xD, xd, PolynomialQ@ + Sin@xD 2, Sin@xDD, PolynomialQ@ + 2 x, x D, PolynomialQ@ + 2 x, x D, PolynomialQ@ + 2 x, x D< 8True, False, True, True, False, False< 8VectorQ@8a, b, c<d, VectorQ@88a<, b, c<d< 8True, False< 8MatrixQ@88a, b, c<, 8a, b, c<<d, MatrixQ@88a, b, c<, 8a, b<<d, MatrixQ@888a<, b, c<, 8a, b, c<<d< 8True, False, False< SameQ, UnsameQ, TrueQ, MatchQ SameQ[lhs,rhs], lhs===rhs... výsledek je True, jestliže výrazy lhs, rhs jsou identické (trochu jinak je to u čísel typu Real), jinak je výsledek False UnsameQ[lhs,rhs], lhs=!=rhs... Not[lhs===rhs] TrueQ[expr]... True, jestliže výraz expr je pravdivý, jinak False MatchQ[expr,form]... True, jestliže expr má tvar form, jinak False Clear@x, yd; 8SameQ@x, yd, TrueQ@x === yd, TrueQ@x yd, x y, TrueQ@x yd, x y< 8False, False, False, x == y, False, x y< 82 === 2., TrueQ@2 === 2.D, TrueQ@2 == 2.D, 2 2., TrueQ@2 2.D, 2 2.< 8False, False, True, True, False, False< 8MatchQ@2, _IntegerD, MatchQ@2, _RationalD, MatchQ@2, _RealD< 8True, False, False<
28 Math40-3.nb 8MatchQ@a 3, u_ v_ D, MatchQ@a, u_ v_ D, MatchQ@a, u_ v_. D< 8True, False, True< 8MatchQ@a 3, u_ v_ D, MatchQ@2 a, u_ v_?numberq D< 8True, False< AtomQ, MemberQ, FreeQ Atom[expr]... True, nemá-li expr žádné podvýrazy MemberQ[expr,form]... True, jestliže expr obsahuje část tvaru form, jinak False MemberQ[expr,form,level]... True, jestliže expr obsahuje část tvaru form na úrovních level, jinak False FreeQ[expr,form]... True, jestliže expr neobsahuje žádnou část tvaru form, jinak False FreeQ[expr,form,level]... True, jestliže expr neobsahuje žádnou část tvaru form na úrovních level, jinak False AtomQê@82, π, 2 π, x y, x 2, f@d@d< 8True, True, False, False, False, False< 8MemberQ@f@x, x yd, xd, MemberQ@f@x, x yd, x yd< 8True, True< 8MemberQ@f@x, x yd, x y, 8<D, MemberQ@f@x, x yd, x y, 82<D< 8True, False< 8FreeQ@f@x, x yd, yd, FreeQ@f@x, x yd, y, 8<D< 8False, True< à Podmínky: If, Which, Switch If[test,then,else]... je-li test pravdivý, výstupem je then; je-li test nepravdivý, výstupem je else; nelze-li rozhodnout, výstupem je If[test,then,else]. If[test,then,else,unknown]... je-li test pravdivý, výstupem je then; je-li test nepravdivý, výstupem je else; nelze-li rozhodnout, výstupem je unknown
Math40-3.nb 29 If Clear@a, condd; cond := If@a 2, x = True, x = FalseD; 8a = 2; cond, a = ; cond, a = True; cond< 8True, False, If@True == 2, x = True, x = FalseD< Clear@a, condd; cond := If@a 2, x = True, x = False, x = IndeterminateD; 8a = 2; cond, a = ; cond, a = True; cond< 8True, False, Indeterminate< Which Which[test,f,test2,f2,...]... výstupem je výraz fi příslušný k prvnímu pravdivému testu testi Clear@a, condd; cond := Which@a <,, a, 0, a >,, True, IndeterminateD; 8a = 0; cond, a = ; cond, a = 2; cond, a = Indeterminate; cond< 8, 0,, Which@Indeterminate <,, a ==, 0, a >,, True, IndeterminateD< Clear@a, condd; cond := Which@a < === True,, a === True, 0, a > === True,, True, IndeterminateD; 8a = 0; cond, a = ; cond, a = 2; cond, a = Indeterminate; cond< 8, 0,, Indeterminate< Clear@a, condd; cond := Which@TrueQ@a < D,, TrueQ@a D, 0, TrueQ@a > D,, True, IndeterminateD; 8a = 0; cond, a = ; cond, a = 2; cond, a = Indeterminate; cond< 8, 0,, Indeterminate< Clear@a, condd; cond := Which@ NumericQ@aD, Indeterminate, a <,, a, 0, a >,, True, IndeterminateD; 8a = 0; cond, a = ; cond, a = 2; cond, a = Indeterminate; cond< 8, 0,, Indeterminate<
30 Math40-3.nb Switch Switch[expr,v,f,v2,f2,...]... porovnává hodnotu výrazu expr s v,v2,..., dokud nenajde shodu. Výstupem je výraz fi příslušný k první shodě Clear@a, condd; cond := Switch@a,, x, 2, x 2, 3, x 3, _, IndeterminateD; 8a = ; cond, a = 2; cond, a = 3; cond, a = Indeterminate; cond< 8Indeterminate, Indeterminate, Indeterminate, Indeterminate< à Cykly: Do, While, For Do Do[expr,{n}]... vyhodnotí expr n-krát Do[expr,{i,imax}]... vyhodnotí expr pro i probíhající od do imax s krokem Do[expr,{i,imin,imax}]... vyhodnotí expr pro i probíhající od imin do imax s krokem Do[expr,{i,imin,imax,di}]... vyhodnotí expr pro i probíhající od imin do imax s krokem di Vytvoření náhodného seznamu celých čísel: Do@Random@Integer, 80, 00<D, 820<D Vidíme, že Do nedává žádný výstup. Musíme proto postupovat složitěji: list = 8<; Do@AppendTo@list, Random@Integer, 80, 00<DD, 820<D; list 863, 8, 62,, 58, 95, 39, 63, 74, 9, 34, 29, 3, 56, 24, 0, 6, 59, 57, 0< Iterace konvergující k è!!!! 3 : Clear@xD; Do If i ==, x@id = 2, x@id = N i 3 ÉÉ É jx@i D + y z, 20 2 k x@i D { ÖÑ ÖÑ, 8i, 0< ÖÑ ; Array@x, 0D 82,.7500000000000000000,.7324285742857429,.73205080047275405,.7320508075688772953,.7320508075688772935,.7320508075688772935,.7320508075688772935,.7320508075688772935,.7320508075688772935< Zastavení výpočtu po dosažení požadované přesnosti (Mathematica považuje dvě přibližná čísla za sobě rovná, liší-li se nejvýše na posledních dvou desetinných místech):
Math40-3.nb 3 Do If i ==, x@id = 2, x@id = N i 3 ÉÉ jx@i D + y z, 20 2 k x@i D { ÖÑ ÖÑ ; É If@x@i D == x@id, Break@8i, x@id<d D, 8i, 0< ÖÑ 86,.7320508075688772935< Jiný požadavek na přesnost dává jiný výsledek: Do If i ==, x@id = 2, x@id = N i 3 ÉÉ y jx@i D + z, 20 2 k x@i D { ÖÑ ÖÑ ; É If@Abs@x@i D x@idd < 0 20, Break@8i, x@id<d D, 8i, 0< ÖÑ 87,.7320508075688772935< While While[test,body]... opakovaně vyhodnocuje body dokud test = True Opět iterace konvergující k è!!!! 3 : x0 = ; While x = N i jx0 + 3 É É y z, 20 2 k x0 { ÖÑ ; x x0, x0 = x ÖÑ ; x.7320508075688772935 Náhodné matice s prvky patřícími do daného seznamu a determinantem rovným : Clear@fD; f@n_, l_d := Hmatrix = 0 IdentityMatrix@nD; While@Det@matrixD =!=, matrix = Table@f5@lD, 8n<, 8n<DD; matrixl; f@4, 8 3,, 2, 4<D êê MatrixForm i j k 2 4 y 4 2 2 3 4 2 2 2 z { Det@%D Odstranění opakujících se prvků ze seznamu při zachování pořadí:
32 Math40-3.nb Clear@f2D; f2@x_listd := Module@8x = 8<, x2 = x, x3<, While@x2 =!= 8<, x3 = First@x2D; 8x, x2< = 8Append@x, x3d, DeleteCases@x2, x3d<d; xd; list = Table@Random@Integer, 80, 3<D, 850<D 83, 0, 3, 3, 3, 2, 0,,, 2, 3,,, 0,,, 2, 0,, 3, 0, 3, 0,,, 2, 2,, 0, 3, 0, 0, 3, 0, 2, 0, 2, 2,, 0, 0, 2, 0, 3, 3,, 0, 0,, 3< f2@listd 83, 0, 2, < list = Table@f5@8a, b, c, d, e, f, g, h<d, 850<D 8d, g, e, b, h, c, Indeterminate, d, h, f, c, d, Indeterminate, f, b, g, Indeterminate, Indeterminate, Indeterminate, Indeterminate, e, c, c, g, Indeterminate, g, c, f, b, c, h, c, h, c, g, g, f, d, g, d, e, d, c, Indeterminate, e, c, c, g, Indeterminate, d< f2@listd 8d, g, e, b, h, c, Indeterminate, f< For[start,test,incr,body]... vyhodnotí start, potom opakovaně vyhodnocuje body a incr, dokud neselže test For Faktoriál: Clear@f3D; f3@n_d := Hn0 = n; For@i = n0, i >, i =, n0 = n0 id; n0l Map@f3, Range@0DD 8, 2, 6, 24, 20, 720, 5040, 40320, 362880, 3628800< n0 3628800
Math40-3.nb 33 à Lokalizace proměnných a konstant: Block, Module, With Block Module[{x,y,...},body]... provede body s použitím lokálních hodnot proměnných x,y,... Module[{x=x0,y=y0,...},body]... totéž, ale proměnným x,y,... nejprve přiřadí počáteční hodnoty x0,y0,... Clear@aD; expr = x 2 + 3 3 + x 2 8expr, Block@8x<, x = a + ; exprd, Block@8x = a + <, exprd, expr< 83 + x 2, 3 +H + al 2, 3 +H + al 2, 3 + x 2 < 8expr, Block@8expr = a 2 + a + <, exprd, expr< 83 + x 2, + a + a 2, 3 + x 2 < Opět faktoriál: Clear@n, f3d; f3@n_d := Block@8n = n<, For@i = n, i >, i =, n = n Hi LD; nd f3 ê@ Range@0D 8, 2, 6, 24, 20, 720, 5040, 40320, 362880, 3628800< n n Module Module[{x,y,...},body]... modul s lokálními proměnnými x,y,... Module[{x=x0,y=y0,...},body]... modul s počátečními hodnotami pro proměnné x,y,... x,y,... A znovu faktoriál: Clear@f4D; f4@n_d := Module@8nn = n<, For@i = nn, i >, i =, nn = nn Hi LD; nnd Map@f4, Range@, 5, ê2dd
34 Math40-3.nb :, 3 5 05 945, 2,, 6,, 24, 4 8 6 32, 20> With With[{x=x0, y=y0,...},body]... definuje lokální konstanty x,y,... Clear@f5D; f5@x_d := With@8t = x + <, t + t 3 D f5@xd + x +H + xl 3 Clear@f6D; f6@n_d := With@8n = n<, For@i = n, i >, i =, n = n Hi LD; nd 8f6@D, f6@2d< Set::setraw : Cannot assign to raw object 2. 8, 2<