Závěrečná všehochuť

Antonín Slavík
Matematicko-fyzikální fakulta UK

Pravděpodobnost, statistika

Diskrétní rozdělení pravděpodobnosti – příklady:

Rovnoměrné rozdělení DiscreteUniformDistribution[{(Subscript[i, min]),(Subscript[i, max])}]

Binomické rozdělení BinomialDistribution[n,p]

Geometrické rozdělení GeometricDistribution[p]

Poissonovo rozdělení PoissonDistribution[μ]

Spojitá rozdělení – příklady:

Rovnoměrné rozdělení UniformDistribution[{min,max}]

Normální rozdělení NormalDistribution[μ,σ]

(χ^2) rozdělení ChiSquareDistribution[ν]

Studentovo rozdělení StudentTDistribution[ν]

Střední hodnota, rozptyl:

Mean[BinomialDistribution[n,p]]

Variance[BinomialDistribution[n,p]]

Hustota:

?PDF

PDF[BinomialDistribution[n,p],x]

DiscretePlot[PDF[BinomialDistribution[30,1/2],x],{x,0,30}]

PDF[NormalDistribution[μ,σ],x]

Plot[PDF[NormalDistribution[2,3],x],{x,-5,10}]

Distribuční funkce, kvantily, inverzní distribuční funkce:

?CDF

Plot[CDF[NormalDistribution[0,1],x],{x,-3,3}]

Quantile[NormalDistribution[0,1],.95]

Quantile[rozdělení,q]je totéž jako InverseCDF[rozdělení,q].

Plot[InverseCDF[NormalDistribution[0,1],x],{x,0,1}]

Výpočet pravděpodobnosti:

?Probability

Symbol \[Distributed] se vkládá jako EscdistEsc.

Jaká je pravděpodobnost, že při 100 hodech mincí bude počet líců mezi 60 a 80?

Probability[60≤x≤80,x\[Distributed]BinomialDistribution[100,1/2]]

N[%]

Jaká je pravděpodobnost, že při pěti hodech kostkou dostaneme součet 20?

pocetKostek=5;
Probability[Sum[x[i],{i,1,pocetKostek}]==20,Table[x[i]\[Distributed]DiscreteUniformDistribution[{1,6}],{i,1,pocetKostek}]]

Pro větší počty kostek (a obecněji větší počty náhodných proměnných) trvá výpočet dlouho, případně skončí vyčerpáním paměti. Vysvětlení:

For a discrete distribution dist, the probability of pred is given by ∑Boole[pred]f[x] where f[x] is the probability density function of dist and the summation is taken over the domain of dist.

For a continuous distribution dist, the probability of pred is given by ∫Boole[pred]f[x]dx where f[x] is the probability density function of dist and the integral is taken over the domain of dist.

Jaká je pravděpodobnost, že kvadratický polynom bude mít reálné kořeny, jestliže koeficienty vybereme náhodně z intervalu [0,1]?

Probability[Discriminant[a x^2+b x+c,x]≥0,{a,b,c}\[Distributed]UniformDistribution[{{0,1},{0,1},{0,1}}]]

N[%]

Podmíněná pravděpodobnost (symbol \[Conditioned] se zapisuje pomocí EsccondEsc):

Probability[x==2\[Conditioned]x+y==5,{x\[Distributed]DiscreteUniformDistribution[{1,6}],y\[Distributed]DiscreteUniformDistribution[{1,6}]}]
(* Pravděpodobnost, že při hodu dvěma kostkami padne na první hodnota 2, a to za předpokladu, že součet je 5. *)

Generování náhodných čísel ze zadaného rozdělení:

data=RandomVariate[NormalDistribution[2,1],10000];

Mean[data]

Variance[data]

hist=Histogram[data,Automatic,"ProbabilityDensity"]

Show[hist,Plot[PDF[NormalDistribution[2,1],x],{x,-10,10},PlotRange->All]]

Zpětné určení parametrů rozdělení metodou maximální věrohodnosti:

FindDistributionParameters[data,NormalDistribution[μ,σ]]

EstimatedDistribution[data,NormalDistribution[μ,σ]]

Vizualizace dat pomocí krabicového diagramu:

data1=RandomInteger[{80,120},10]

data2=RandomInteger[{80,120},10]

data3=RandomInteger[{80,120},10]

BoxWhiskerChart[{data1,data2,data3}]

BoxWhiskerChart[{data1,data2,data3},ChartStyle->10,BarOrigin->Left,BaseStyle->12]

Benfordův zákon

Citace z Wikipedie:

Benfordův zákon je matematický zákon, který říká, že v mnoha souborech přirozených dat (ale ne ve všech) čísla mnohem častěji začínají cifrou 1 než jinými ciframi. Zhruba 30 % čísel začíná jedničkou. Čím vyšší je počáteční číslice, tím méně pravděpodobněji se na začátku čísel objevuje.

Benfordův zákon platí pro data z přírodního světa nebo i pro sociálně významné údaje. ... Protože lidé mají tendenci při vymýšlení falešných výsledků používat na začátku čísel všechny číslice stejně pravděpodobně, Benfordův zákon se může využívat při hledání možných zpronevěr nebo k jednoduchému testu, zda volby byly regulérní.

Pro dostatečnou platnost zákona stačí mít výsledky v rozsahu alespoň tří řádů.

Poprvé o tomto zákonu publikoval v roce 1881 americký astronom Simon Newcomb, který si prý všiml, že logaritmické tabulky jsou mnohem ohmatanější na stránkách, kde se vyskytují čísla začínající jedničkou. Zákon byl znovuobjeven roku 1938 fyzikem Frankem Benfordem, podle kterého se dnes nazývá.

BenfordDistribution[b] je Benfordovo rozdělení pro soustavu o základu b.

Pravděpodobnost počáteční číslice n∈{1,...,b-1} je (Subscript[log, b])(n+1)-(Subscript[log, b])n=((log(1+1/n))/(log b)).

Table[PDF[BenfordDistribution[10],x],{x,1,9}]

N[%]

benford=DiscretePlot[PDF[BenfordDistribution[10],x],{x,1,9},PlotStyle->PointSize[Medium]]

FirstDigit[x_]:=First[First[RealDigits[QuantityMagnitude[x],10,1]]];

sample=Table[FirstDigit[CityData[city,"Population"]],{city,CityData[{All,"UnitedStates"}]}];

Show[Histogram[sample,{0.5,9.5,1},"PDF"],benford]

sample2=Table[FirstDigit[CityData[city,"Population"]],{city,CityData[{All,"CzechRepublic"}]}];

Show[Histogram[sample2,{0.5,9.5,1},"PDF"],benford]

sample3=Table[FirstDigit[CountryData[country,"Area"]],{country,CountryData[All]}];

Show[Histogram[sample3,{0.5,9.5,1},"PDF"],benford]

sample4=DeleteCases[Table[FirstDigit[CountryData[country,"GDP"]],{country,CountryData[All]}],"NotAvailable"];

Show[Histogram[sample4,{0.5,9.5,1},"PDF"],benford]

Benfordův zákon se nevztahuje na seznamy čísel, která jsou zhruba stejného řádu:

sample5=Table[CityData[city,"Population"],{city,Take[CityData[{All,"UnitedStates"}],100]}];

Min[sample5]

Max[sample5]

Show[Histogram[Map[FirstDigit,sample5],{0.5,9.5,1},"PDF"],benford]

Volby (options)

Chování většiny funkcí v Mathematice lze ovlivňovat pomocí voleb. Options[identifikátor] zobrazí seznam všech voleb a jejich výchozí hodnoty.

Options[Plot]

Také uživatelem definované funkce mohou mít své volby.

Příklad: Která přirozená čísla n lze psát ve tvaru n=(a^2)+(b^2), kde a, b jsou celá čísla?

n=2009;

Solve[n==a^2+b^2,{a,b},Integers]

Solve[n==a^2+b^2&&a>=0&&b>=0,{a,b},Integers]

Clear[n]

Funkce pro hledání rozkladu celého čísla s volbou Nonnegative (jen nezáporná řešení?).

Options[SumOfSquares]={Nonnegative->False};

SumOfSquares[n_,opts___]:=Module[{nonnegative,system,solution},
nonnegative=Nonnegative/.{opts}/.Options[SumOfSquares];
system=If[nonnegative,n==a^2+b^2&&a>=0&&b>=0,n==a^2+b^2];
solution=Solve[system,{a,b},Integers];
If[solution≠{},{a,b}/.solution,{}]
]

SumOfSquares[2009]

SumOfSquares[2009,Nonnegative->True]

Volby mohou mít své usage messages:

Nonnegative::usage="Nonnegative is an option to SumOfSquares. When set to True, SumOfSquares returns only nonnegative integers.";

?Nonnegative

SumOfSquares[2010,Nonnegative->True]

Věta (Fermat): Prvočíslo lze vyjádřit jako součet čtverců nezáporných celých čísel, právě když jeho zbytek při dělení čtyřmi je různý od tří. Toto vyjádření je až na pořadí sčítanců jednoznačné.

primes=Prime[Range[100]];
Grid[Map[{#,SumOfSquares[#,Nonnegative->True],Mod[#,4]}&,primes],Dividers->All]

Věta: Přirozené číslo n lze vyjádřit jako součet čtverců nezáporných celých čísel, právě když všechna prvočísla, která při dělení čtyřmi dávají zbytek 3, mají v prvočíselném rozkladu n sudý exponent.

SumOfSquares[2^2*7^3]

SumOfSquares[2^2*7^4,Nonnegative->True]

Některá složená čísla lze rozložit na součet čtverců více způsoby:

SumOfSquares[5000,Nonnegative->True]

Označme symbolem r(n) počet všech celočíselných řešení rovnice n=(a^2)+(b^2) (kde n je dáno a a, b jsou neznámé). Tj. uvažujeme i záporná řešení a bereme ohled na pořadí sčítanců:

r[n_]:=Length[SumOfSquares[n]]

r[5000]

Map[r,Range[5000]]

N[Mean[%]]

Věta: Průměrná hodnota r(n) přes všechna n∈ℕ je π, tj. (lim_(N->∞)) (1/N)(∑_(n=1)^N)r(n)=π.

Geometrické vysvětlení:

r(n) je počet bodů s celočíselnými souřadnicemi, které leží na kružnici s poloměrem (Sqrt[n]) a středem v počátku.

(∑_(n=1)^N)r(n) je počet bodů s celočíselnými souřadnicemi, jejichž vzdálenost od počátku je nejvýše (Sqrt[N]).

Nakreslíme-li kolem každého bodu jednotkový čtvereček a sečteme-li jejich obsahy, dostaneme přibližně obsah kruhu o poloměru (Sqrt[N]), tedy (∑_(n=1)^N)r(n)≈π N.

showPointsInside[r_]:=Module[{points={x,y}/.Solve[x^2+y^2≤r^2,{x,y},Integers]},Graphics[{PointSize[Medium],Lighter@Yellow,EdgeForm[Black],Map[Rectangle[#-{1/2,1/2},#+{1/2,1/2}]&,points],Darker@Blue,Thick,Circle[{0,0},r],Darker@Red,Point[points]}]]

Manipulate[showPointsInside[n],{n,5,20,1,Appearance->"Labeled"},SaveDefinitions->True]

SetOptions

Pomocí SetOptions se dají změnit výchozí hodnoty voleb.

Options[SumOfSquares]

SetOptions[SumOfSquares,Nonnegative->True];

SumOfSquares[5000]

SetOptions funguje i pro zabudované funkce:

Plot[ArcTan[x],{x,-10,10}]

SetOptions[Plot,BaseStyle->{FontFamily->"Arial",FontSize->12},PlotStyle->Thick]

Plot[ArcTan[x],{x,-10,10}]

Práce s jednotkami

Reprezentace veličin s jednotkami:

?Quantity

Quantity[12,"Meters"]

g=Quantity[9.81,"Meters"/"Seconds"^2]

QuantityUnit[g]

QuantityMagnitude[g]

Free-form input (interpretace pomocí Wolfram Alpha):

Quantity["80 km/h"]

InputForm[%]

Quantity["20 fahrenheits"]//InputForm

Převody jednotek:

?UnitConvert

UnitConvert[Quantity[8.2,"Miles"],"Kilometers"]

UnitConvert[Quantity[20,"DegreesCelsius"]]

Zjednodušování jednotek:

UnitSimplify[Quantity[2,("Grams"*"Meters"^2)/"Seconds"^3]]

UnitSimplify[Quantity[2,("Kilograms"^2"Meters")/("Amperes"^2"Seconds"^6)]]

Počítání s jednotkami:

Quantity[2,"Inches"]+Quantity[10,"Centimeters"]

v=Quantity[100,"Kilometers"]/Quantity[60,"Minutes"]

Solve[Quantity[m,"Meters"]==Quantity[y,"Yards"],m]

Integrate[Quantity[9.81,"Meters"/"Seconds"^2]*t,{t,Quantity[0,"Seconds"],Quantity[10,"Seconds"]}]

Mnoho funkcí v Mathematice umí pracovat s jednotkami:

s1=Quantity[RandomReal[{0,1},5],"Meters"]

s2=Quantity[RandomReal[{0,100},5],"Centimeters"]

s=Join[s1,s2]

{Min[s],Max[s],Mean[s]}

Sort[s]

units={"Centimeters","Inches","Feet","Yards","Meters"};
values=Map[Quantity,units]

BarChart[values,ChartLegends->units,BarOrigin->Left,ChartStyle->"Rainbow",AxesLabel->Automatic]

Údaje z integrovaných databází jsou doplněny jednotkami:

teploty=WeatherData["Prague","Temperature",{2021,1,1},"Value"]

ListLinePlot[teploty,AxesLabel->Automatic]

ListLinePlot[teploty,AxesLabel->Automatic,TargetUnits->"Fahrenheit"]

Mapy a geografické výpočty

Mapa světa:

GeoGraphics[GeoRange->"World",ImageSize->Large]

Nastavení pozadí (volba GeoBackground):

Table[GeoGraphics[GeoRange->"World",GeoBackground->background, ImageSize->Large,PlotLabel->background],{background,{"ContourMap","ReliefMap","Satellite","SatelliteWithLabels","CountryBorders","StreetMap"}}]

Výběr kartografické projekce (volba GeoProjection):

Table[GeoGraphics[GeoRange->"World",GeoProjection->projection,GeoGridLines->Automatic,ImageSize->Large,PlotLabel->projection,GeoBackground->"StreetMapNoLabels"],{projection,{"Mercator","LambertCylindrical","Orthographic","Albers","LambertAzimuthal","Stereographic"}}]

Zobrazení mapy vybrané oblasti:

GeoGraphics[GeoPosition[{50.08,14.43}],ImageSize->Large]

Table[GeoGraphics[GeoPosition[{50.08,14.43}],GeoZoomLevel->zoom,ImageSize->Large],{zoom,{3,5,8,11,15,18}}]

Zjištění zeměpisných souřadnic z názvu města (vstup v přirozeném jazyce pomocí Ctrl + =):

GeoPosition[LinguisticAssistant]

Entity zadané v přirozeném jazyce mohou být součástí GeoGraphics:

GeoGraphics[LinguisticAssistant]

Do mapy lze doplňovat další grafické objekty:

GeoGraphics[{EdgeForm[{Blue,Thick}],Polygon[LinguisticAssistant],White,PointSize[Large],Point[LinguisticAssistant]},GeoBackground->"Satellite"]

Velká německá města:

cities=CityData[{Large,"Germany"}];
populations=QuantityMagnitude[Map[CityData[#,"Population"]&,cities]];
coordinates=Map[CityData[#,"Coordinates"]&,cities];
large=Cases[Transpose[{cities,populations,coordinates}],{_,u_,_}/;u≥500000]

largeCoordinates=Map[Last,large]

GeoGraphics[{Polygon[LinguisticAssistant],PointSize[Large],Red,Point[Map[GeoPosition,largeCoordinates]]}]

Místo bodů lze použít GeoMarker:

GeoGraphics[{GeoStyling["StreetMapNoLabels",EdgeForm[Black]],Polygon[LinguisticAssistant],GeoMarker[Map[GeoPosition,largeCoordinates],"Alignment"->Bottom]},GeoBackground->None]

Uživatelem definovaný vzhled značky:

marker[color_]:=Graphics[GraphicsGroup[{FaceForm[color],EdgeForm[Black],FilledCurve[{{Line[Join[{{0,0}},({Cos[#1],3+Sin[#1]}&)/@Range[-((2 π)/20),π+((2 π)/20),(π/20)],{{0,0}}]]},{Line[(0.5 {Cos[#1],6+Sin[#1]}&)/@Range[0,2 π,(π/20)]]}}]}]]

marker[Yellow]

GeoGraphics[{GeoStyling["StreetMapNoLabels",EdgeForm[Black]],Polygon[LinguisticAssistant],GeoMarker[Map[GeoPosition,largeCoordinates],marker[Red],"Alignment"->Bottom]},GeoBackground->None]

Geodetika (nejkratší spojnice) a loxodroma mezi zadanými dvěma místy:

stockholm=GeoPosition[LinguisticAssistant]

ottawa=GeoPosition[LinguisticAssistant]

GeoGraphics[{GeoMarker[{stockholm,ottawa},marker[Red],"Alignment"->Bottom],Thick,Red,GeoPath[{stockholm,ottawa}],Blue,GeoPath[{stockholm,ottawa},"Loxodrome"]},GeoRange->{{-60,80},{-180,180}},ImageSize->Large,GeoProjection->"Mercator"]

GeoDistance[{stockholm,ottawa}]

Geodetický kruh se zadaným poloměrem:

GeoGraphics[{EdgeForm[{Black,Dashed}],GeoDisk[LinguisticAssistant,Quantity[20,"km"]]}]

GeoNearest["City",LinguisticAssistant,{All,Quantity[20,"km"]}]

Mercatorova projekce nezachovává obsahy ploch:

GeoGraphics[{Table[GeoDisk[{lat,lon},(Quantity[1000, "km", kilometers, "Kilometers"])],{lat,-60,60,30},{lon,-160,160,40}]},GeoProjection->"Mercator"]

Lambertova válcová projekce zachovává obsahy ploch:

GeoGraphics[{Table[GeoDisk[{lat,lon},(Quantity[1000, "km", kilometers, "Kilometers"])],{lat,-60,60,30},{lon,-160,160,40}]},GeoProjection->"LambertCylindrical"]

Osvětlená a neosvětlená část Země:

GeoGraphics[NightHemisphere[Now],GeoRange->"World",ImageSize->Large]

Funkce Dynamic

Implementace Manipulate je založena na použití funkce Dynamic.

Dynamic[výraz] vrací hodnotu zadaného výrazu. Navíc sleduje všechny proměnné, na nichž hodnota výrazu závisí, a při jejich změně automaticky přepočítává výsledek.

w=3;
Dynamic[w^2]

w=2

f[x_]:=Sin[x];
Dynamic[Plot[f[x],{x,0,2Pi}]]

f[x_]:=Log[x]

?Slider

Slider[Dynamic[z]]

Dynamic[z]

{Slider[Dynamic[k],{1,4},Appearance->"Labeled"],Dynamic[Plot[Sin[k x],{x,0,2Pi}]]}

Podrobnější dokumentace:

Introduction to Dynamic

Advanced Dynamic Functionality

DateString[]

ClockGauge[DateString[]]

?Clock

Dynamic[Clock[];{DateString[],ClockGauge[DateString[]]}]

Cvičení

Předpokládejme, že chceme vybudovat železniční rychlodráhu spojující velká americká města s aspoň 500 000 obyvateli. Železniční síť musí být souvislá (existuje cesta mezi libovolnými dvěma městy) a koleje povedou mezi dvojicemi měst po nejkratších spojnicích (geodetikách). S ohledem na úsporu nákladů požadujeme, aby celková délka kolejí byla co nejmenší. Které dvojice měst máme spojit, abychom splnili tyto požadavky? Znázorněte mapu USA s vyznačenými městy a železniční sítí. Jaká bude celková délka kolejí?

Návod:

Použijte databázi CityData k nalezení všech měst v USA, které mají aspoň 500 000 obyvatel.

Zkonstruujte neorientovaný graf, jehož vrcholy jsou města. Mezi každými dvěma městy povede hrana, jejíž délku stanovíte pomocí GeoDistance. (Ke konstrukci grafu s ohodnocenými hranami použijte volbu EdgeWeight.)

Pomocí FindSpanningTree najděte minimální kostru grafu, hrany této kostry můžete získat pomocí EdgeList.

Pomocí GeoGraphics vykreslete mapu USA společně s hranami grafu tvořícími minimální kostru (použijte GeoPath).

Vypočítejte celkovou délku kolejí jako součet délek příslušných hran.