Bevezetés a Mathematicába

1. előadás

Tóth János, jtoth@math.bme.hu, www.math.bme.hu/~jtoth
Nagy Ilona, nagyi@math.bme.hu, www.math.bme.hu/~nagyi
Gyebrószki Gergely, gyebroszkigergely@gmail.com

Bevezetés

Háttér

Stephen Wolfram -> Wolfram Research, Inc. (NKS, wolframalpha)
Linux/Windows/Mac változat

$Version

Mire jó a Mathematica?

- Aritmetikai, szimbolikus és algebrai számítások
- Programnyelv (valójában interpreter) függvények írására, matematikai összefüggések vizsgálatára, azok módosítására és kiértékelésére
- Interaktív környezet numerikus, szimbolikus és grafikus manipulációra
- ,,Közbülső eszköz'' bizonyos adatok előfeldolgozására más programok számára, illetve más programok által szolgáltatott adatok kiértékelésére
- (Interaktív) Prezentáció készítésére, házifeladatok megoldására (Help|About)

A program felépítése

Két fő rész: Amit látunk (maga a jegyzetfüzet (notebook), a menüsor és a paletták) az ún. kezelőfelület (front end), az itt bevitt inputadatokat adja át a magnak (kernel). Ezek különböző programok, akár különböző számítógépen is futhatnak (többprocesszoros gépek előnyben!)
Akár több (15) Mathematica futtatható párhuzamosan, ha a licencünk ezt engedi.

Csomagok (adott, vásárolt, ingyenes)

A kezdetek

Súgó

Online és offline help (F1);
Súgó: Welcome screen|Getting started
Virtual Book 
Wolfram Demonstrations (konkrét forráskódok olvasása)

Hyperlink["Wolfram Demonstrations (konkrét forráskódok olvasása)","http://demonstrations.wolfram.com"]

Hyperlink["Video","http://www.wolfram.com/broadcast/screencasts/tour/?buildid=1213965"]

Megéri...

Indítás és működés

A Mathematicát a parancssorba a "mathematica" parancs beírásával indítjuk.
	Linux alatt NUM LOCK probléma??
A mentett állományok .nb kiterjesztést kapnak (NoteBook)
Kiértékelés:  <SHIFT>+<ENTER> vagy <NUM-ENTER> 
Az <ENTER> a szokásos beviteli sortörés

3+2

Menüsor és paletták

FourierD

Edit|ExtendSelection; CompleteSelection; Preferences; Print|PDF Printer
Insert|InputFromAbove; Typesetting;  Table/Matrix; Hyperlink
Format|Style; StyleSheet; OptionInspector; TextJustification
Cell|Divide; Merge; DeleteAllOutput
Graphics
Evaluation|EvaluateNotebook; QuitKernel|Local; Abort
Palettes|Other
Window/Magnification; TileWindowsWide/Tall; FullScreen
Help|FunctionNavigator; VirtualBook; F1; WelcomeScreen

Az első példák

Számolgatás

45654+45846

27 10.3

2^256

(2^\[Placeholder])

Törtek szimbolikus kezelése

46489894/46456+45468/465

FactorInteger[589489496]

Prime[14341]

PrimeQ[44444]

Tetszőleges pontosságú numerikus kiértékelés

N[π,1700]

π+2.

Komplex számok és speciális függvények

{I,E,Pi}

N[%]

(((2+3I))^5)

Conjugate[4+I]

Zeta[2]

Kalkulus és függvényábrázolás

(∫_1^2)((x^2)+Sin[x])\[DifferentialD]x

D[Cos[x](Sqrt[1-(x^2)]),x]

Manipulate[Plot[{Sin[t x],Cos[x]},{x,-π,π}],{t,0,10,1}]

Animate[Plot[{Sin[t x],Cos[x]},{x,-π,π}],{t,0,10,1}]

Animate[Plot[Exp[-a t],{t,0,3},PlotRange->1],{a,1,5}]

Animate[Plot[t((x^2)-1)+(1-t)(-(x^2)),{x,-1,1},Axes->False,
PlotLabel->Row[{"Félév ",Style["\neleje",GrayLevel[t]],Style["\nvége",GrayLevel[1-t]]}],Epilog->{Circle[{0,1},3],Disk[{1,2},.3],Disk[{-1,2},.3],Line[{{0,0.6},{0,1.6}}]},PlotRange->{{-3,4},{-3,4}},AspectRatio->1],{t,0,1},AnimationRunning->False]

Szintaxis

A függvénynevek

A beépített függvénynevek Nagy betűvel kezdődnek; a többtagú parancsok értelmes szavanként, mint pl

FactorInteger[120]

Az argumentumok szögletes zárójelbe kerülnek (bracket)
Vesszővel választjuk el a függvényargumentumokat, pontosvessző elnyomja az eredmény kiíratását.

Számtan

Majdnem kézenfekvő; a szorzásjelet nem kell kiírni, de az egyértelműség miatt szóközt kell tenni

x=2;y=3;xy=15;
{x,y,x y,xy,3 4,3+4,0*x,x+z+z,6/2}

Figyeljük meg az automatikus egyszerűsítéseket

Zárójelek és speciális karakterek

Négy (öt..., sőt hat...) féle zárójel van:
	- Csoportosítás, a precedencia kikerülése 	2*(3+5)
	- Függvényargumentum		f[x,y]
	- Lista (nem rendezett Multiset)	v={1,2,3,4,2,2,2,5}
	- Listaelem				v[[1]]

v={1,22,34,3,-1,2,2}

v[[3]]

?Plot

??Plot

Az ESC billentyű (feloldás)
	Görög betűk				α,β,ω,...
	Speciális szimbólumok		e,ϵ,∞,d,i,...
	Listaelem (ez az ötödik zárójel)	v[[2]]

A súgó karakterei:
	?Function				súgó a Functionről
	??Function				részletes súgó a Functionről
	Joker karakterek:			@, *
	
Mi történt?					%, %%, ...

Kommentár, magyarázat			(* ez itt egy komment *)

?*Plot*

?Sqrt

??Sqrt

x+2

%+3

%+3

%%%

(* Ez a magyarázat illusztrálja a hatodik zárójeltípust *)

Típusok

Az objektumok 0. eleme az objektum típusa

{5[[0]],π[[0]],(1/2)[[0]],I[[0]],{1,2,3}[[0]]}

FullForm[{1,2,3}]

{Head[5],Head[π]}

Értékadás vs. függvények (Késleltetés)

Három rossz megoldás, és amit valójában használunk:
1. Egyetlen pontban definiált (paraméteres) függvény azonnali értékadással

Clear[f,x];
f[x]=x+Random[]

{f[1],f[2],f[x],f[2]}

x=4;

f[x]

2. Mindenütt értelmezett függvény (részben) azonnali értékadással

Clear[f,x];
f[x_]=x+Random[]

{f[1],f[2],f[x],f[2]}

3. Egyetlen pontban definiált függvény késleltetett kiértékeléssel

Clear[f,x];
f[x]:=x+Random[]

{f[1],f[2],f[x],f[2]}

x=4;

f[x]

4. És amit használunk: Mindenütt értelmezett függvény késleletett kiértékeléssel

Clear[f,x];
f[x_]:=x+Random[]

f[x]

{f[1],f[2],f[x],f[2]}

További megadási módok (a Function tartalmazza a késleltetést, az x lokális változó benne, ezt jelzi a zöld színe).

Clear[f,x];
f=Function[x,(x^2)+2]

{f[1],f[2],f[x],f[2]}

x=2;
{f[1],f[2],f[x],f[2]}

Ugyanaz, csak gyorsírással (tiszta függvények, slotok) - identitásfüggvény, illetve vetítések

f=(((#1)^2)+2#2+1)&

{f[1],f[2,2]}

{f[a],f[b,c]}

Az Equal- SameQ függvények, illetve a Rule objektum

Az Equal kiértékelésre vár, a SameQ nem.

Clear[x,y]
Equal[x,y]

SameQ[x,y]

x===y

Clear[x];
sol=NSolve[(x^2)+6x==2,{x}]

{sol[[1]],sol[[1,1]],sol[[1,1,0]],sol[[1,1,1]],sol[[1,1,2]]}

x/.sol[[1]]

Gyorsírás

@	Prefix parancs/művelet (pl. a függvény ilyen) írásmód, argumentum kijelölés illetve opcionális paraméterek nélkül
	Hasznos, ha nem szeretnénk egy formula végét megkeresni.
	Ne halmozzuk!

N[π]
N@π

//	Postfix művelet (mint a transzponálás)

π//N

~	az infix művelet

Clear[x,y]
x_~egyesites~y_:=Union[x,y]

{1,3,2}~egyesites~{3,5,4}

A Union[] függvény tehát rendezett halmazt csinál a listából: 
	elvesznek az ismételt elemek;
	az automatikus rendezés miatt költséges.

/. (teljes nevén ReplaceAll[])

MatrixForm[(({{a, b}, {c, d}}))/.b->c/.d->b/.c->1]

x+(y^3)+(1/x)/.x->2

/@ (vagyis a Map[])

Map[k, {3,4,5}]

k[{3,4,5}]

k/@{5,6,7}
Factorial/@{5,6,7}

Factorial[{5,6,7}]

@@ (vagyis az Apply[], vagyis a Head cseréje)

FullForm[{1,2,3}]

Times[{1,2,3}]
Times[1,2,3]

Apply[Times,{1,2,3}]

Times@@{1,2,3}

A listák

A Mathematica-ban ,,majdnem'' minden objektum (általánosított) lista (gondoljunk a típusra, mint 0-dik listaelemre).

v={1,2,3}

A mátrix listák listája (a sorok a listaelemek, amelyek elemei a sor elemei)

m={{1,2,3},{3,4,I}}

m//MatrixForm

Transpose[m]

Transpose[m]//MatrixForm

A listaelemek sorszámozása 1-től kezdődik (a 0-dik elem a típus, ami nem vizualizálódik expliciten).
Ügyeljünk az esetleges zárójelezésre.

{m[[2,3]],m[[2]][[3]],(m[[2]])[[3]]}

Listák megadása
	Kézzel	{a,b,c}

l={1,2,3}

A Table[] függvény

Table[(i^2),{i,9}]
Table[(i^2),{i,5,9}]
Table[(i^2),{i,5,9,1/2}]

A Range[] függvény

Range[10]
Range[2,10]
Range[{2,10}]

A Range egy listázható függvény

Attributes[Range]

A Logaritmus szintén

Log[Range[5]]

Array[Factorial[#]+2&,4]
Array[#^2&,{5}]

A mátrix listák listája, tehát a Fourier-mátrix az alábbi sorral nyerhető:

n=4;
m=(1/(Sqrt[n]))Table[Table[(E^(((2π I)/n)i j)),{i,1,n}],{j,1,n}];
MatrixForm@m
Clear[n]

Vagy:

n=5;
MatrixForm[(1/(Sqrt[n]))Table[(E^(((2π I)/n)i j)),{i,1,n},{j,1,n}]]
Clear[n]

Listaműveletek

mylist = Range[14]

Drop[mylist, 3]
Drop[mylist, {3}]

Take[mylist, 3]
Take[mylist, {3}]

Append[mylist, 3]

Prepend[mylist, 3]

Ez levágja a végét

Partition[mylist, 3]

Flatten[{{1,2,3},{4,5,6},{7,8,9},{10,11,12}}]

Összeadás, kivonás, szorzás

{a,b,c}+{1,2,3}

{a,b,c}{1,2,3}

Times[{a,b,c},{1,2,3}]

{a,b,c}.{1,2,3}

Hatványozás

ClearAll[a,b,c,d,e,f];
(({a,b,c})^d)

(a^({d,e,f}))

(({a,b,c})^({d,e,f}))

FullForm[{(a^d),(b^e),(c^f)}]

Times[a,b,c]

Apply[Times,{a,b,c}]

Times@@{a,b,c}

Apply[Times,{(a^d),(b^e),(c^f)}]

Függvényábrázolás

A Plot[] parancs

Plot[(x^2)Sin[x],{x,1,2π}]

Plot[{(x^2)Sin[x],10Cos[x]},{x,1,2π},PlotRange->{-30,30},AspectRatio->1,Frame->True]

Mi a probléma a következő paranccsal?

Plot[{(x^3), D[(x^3),x]}, {x, -2,2}]

A Plot[] késlelteti az első argumentumának a kiértékelését. (Gyakorlatilag arról van szó, hogy a D[] függvény az x szimbólum helyett annak értékét kapja az ábrázolás során. Nincs értelme tehát egy konstans szerint deriválni).

Plot[Evaluate[{(x^3), D[(x^3),x]}], {x, -2,2}]

Az Evaluate parancs azonnal kiértékeli az első argumentumot. A Plot ezen viselkedése az attribútumai között található:

Attributes[Plot]

Itt grafikonok egy listája látható:

Table[Plot[(x^i),{x,-2,2},PlotRange->{-2,2}],{i,0,3}]

A ListPlot[]

A ListPlot a természetes számokhoz rendeli az argumentumaként megadott értékeket.

data=Table[Prime[i],{i,1,50}];

{ListPlot[data],ListLinePlot[data]}

A Show különböző grafikai objektumokat jelenít meg egyszerre:

Show[{ListPlot[data],ListLinePlot[data]}]

h[x_]=Fit[data, {1, x, x^2}, x]

Show[{ListPlot[data],Plot[h[x],{x,1,50}]}]

xy = Table[{j, j^2}, {j, -3, 3, .2}]

ListPlot[xy]

DiscretePlot[Prime[i],{i,1,50}]

3Ds megjelenítés és szeletek

Plot3D[Tooltip[Sin[x y],"felület"], {x, 0, 3}, {y, 0, 2.5}]

ParametricPlot3D[ Tooltip[{Cos[u](2+ Cos[v]), (2+Cos[v])Sin[u], Sin[v]}], {u, -π, π}, {v, -π, π},Axes->None,Mesh->None]

Diszkrét(ebb) változatok.

data = Table[2(x^2)+(y^2)-10, {x, -3, 3, 1}, {y, -3, 3, 1}];

ListPlot3D[data]

A szintvonalak értéke tooltipként megjelenik.

ContourPlot[2(x^2)+6(y^2)-30,{x,-3,3},{y,-3,3}]

ListContourPlot[data]

ListDensityPlot[data,InterpolationOrder->0]

Külső kapcsolatok

LaTeX

TeXForm[m]

Import/Export: Fileok beolvasása, vagy eredmények fileba írása

ed=ExampleData[{"TestImage","Lena"}]

ListContourPlot[Reverse[ExampleData[{"TestImage","Lena"},"GrayLevels"]],ColorFunction->"Pastel",MaxPlotPoints->100]

r=Import["ExampleData/rose.gif"]

ImageHistogram[r, Appearance->"Separated"]

ImageHistogram[ed, Appearance->"Separated"]

Manipulate[ImageAdjust[ed,c],{c,{0,0},{1,1}}]

Export["test.gif",Integrate[1/(x^4-1),x]]

Import["test.gif"]

Maga a NoteBook, mint kiadványszerkesztő program (házi feladatok készítése)

Tézisek

Megtervezték

Alapvető adatstruktúra az általánosított lista. A típusok száma néhány ezer - ha akarod.

l={a,b,c,d,e};

Reverse[l]

Take[l, 2]

Drop[l,-1]

Reverse[f[a,b,c]]

ArrayPlot[Reverse[CellularAutomaton[30,{{1},0},20]]]

Take[a+b+c+d+e+f,3]

Drop[a+b+c+d+e+f,3]

Paradigmák

Procedurális, listakezelő, funkcionális, logikai (mintaillesztés) stb. stb.
Mindegyik megvan (oktatás), de nem vagyunk (túlságosan) Sróf mesterek.

Tiltott, tűrt és támogatott függvények (Felejtendő, felejthető, felkarolandó)

Külön engedéllyel használható szavak listája

Az alábbi szavak használatához külön engedély kell (aki ,,tud" programozni, az különösen veszélyeztetett):

* Goto és Label (az engedélyt nem fogom megadni)
    * Break
    * Continue
    * Do
    * For
    * Length
    * Print
    * Return

Jól gondolja meg azt is valaki, hogy a Table vagy a Length függvényre van-e szüksége. Ezek helyett funkcionális programozási struktúrákat, mintaillesztést, listakezelést, akármit használhatunk, de nem szedünk szét egy matematikai objektumot elemeire azért, hogy azután összerakjuk, hasonlóan (de szigorúbban, mert lehet és mert érdemes) ahhoz, ahogyan lineáris algebrában amíg lehet, nem használunk koordinátákat. A Mathematica a funkanalra emlékeztet: nem teszi fölöslegessé az alsóbb szintű dolgokat, de elkerülhetővé teszi őket, amikor ez lehetséges.

Kérdés (haladottabbakhoz): Mondjanak meggyőző példát, amikor valóban szükség van a fentiek közül valamelyikre.

Jó tudni (Információ, kitekintés)

Az érdeklõdõ olvasó számára szeretnénk még további segítséget nyújtani. Az általános iskola és a középiskola közötti átmenetet segíti a nemzetközi összefogással készült kilencnyelvű

Hyperlink["Matematikai fogalomtár","http://mbuttons.bolyai.hu/"]

Megmégezis:

Hyperlink["Speciális függvények","http://functions.wolfram.com"]

Jó kiegészítõ az angol

Hyperlink["Angol Wiki","http://hu.wikipedia.org/wiki/Kezdõlap"]

és a magyar

Hyperlink["Magyar Wiki","http://en.wikipedia.org/wiki/Main\_Page"]

nyelvű wikipédia is. És a házi? Szabad gazdagítani:

Hyperlink["háziwiki","http://wiki.math.bme.hu/index.php/Kezd%C5%91lap"]

Egyértelműen felsõfokú értelmezõ szótárként használható az Eric Weisstein által szerkesztett lap:

Hyperlink["Lexikon: Eric Weisstein","http://mathworld.wolfram.com"]

Michiel Hazewinkel a szerkesztője a Springer által a legkülönbözőbb formában megjelentetett, Encyclopaedia of Mathematics című -- eredetileg orosz nyelvű, ötkötetes -- kiadványnak, amely szintén felsőfokú:

Hyperlink["De: Math. enciklopédia is van","http://eom.springer.de"]

Magunk is jól hasznosítottuk, ezért talán az olvasónak is hasznára válhat az alábbi néhány szótár:

Hyperlink["rengeteg angol egynyelvû szótár egy helyen","http://www.onelook.com/"]

egy félkész, de sok szót tartalmazó angol-magyar és magyar-angol szótár:

Hyperlink["félkész","http://mek.oszk.hu/00000/00076/html/index.htm"]

Hyperlink["idegen szavak szótára (Magyarító könyvecske)","http://www.net.klte.hu/{\mytilde}keresofi/mke/r.htm"]

és természetesen mindenek előtt a SZTAKI szintén nem tökéletes, de nagyon hasznos soknyelvű szótára:

Hyperlink["SZTAKI","http://szotar.sztaki.hu/index.hu.jhtml"]

És mindenek után meg előtt:

Hyperlink["Mathematica TJ","http://www.math.bme.hu/~jtoth/Mma/mma.html"]

Másokéi közül ezek ajánlottak:

Hyperlink["Gray: Masternig Mathematica","http://www.mathprogramming-intro.org/book/node286.html"]

Hyperlink["Cookbook","http://ebookee.org/Mathematica-Cookbook-By-Sal-Mangano_1101082.html"]

Aki talál hasznos, közérdekű dolgot, szóljon közzétesszük. Például:

Hyperlink["Nemazabush","http://www.theatlantic.com/doc/194507/bush"]

Egy kis számelmélet

A számok alakjai

IntegerQ[2]

IntegerQ[2.]

Head[2]

Head[2.]

ClearAll[x];
f[x_]:=2x/;IntegerQ[x]
g[x_]:=2x/;IntegerQ[x]==True
h[x_/;IntegerQ[x]]:=2x

{f[2],f[2.],g[3],g[3.2],h[5],h[π]}

Ceiling[3.5]

IntegerPart[3.5]

Floor[3.2]

{Round[3.4],Round[3.5],Round[3.6]}

Számrendszerek

BaseForm[234,2]

IntegerDigits[234]

FromDigits[{2,3,4}]

IntegerDigits[234,2]

RealDigits[123.55]

Oszthatóság

Osztók:

Divisors[2368]

Osztók száma:

d1[n_]:=Length[Divisors[n]]
d1[2368]

d2[n_]:=Apply[Times,Transpose[FactorInteger[n]][[2]]+1]
d2[2368]

d3[n_]:=DivisorSigma[0,n]
d3[2368]

Legnagyobb közös osztó:

GCD[15,20,30]

Legkisebb közös többszörös :

LCM[2,3,5]

Osztási maradék:

Mod[36,10]

PowerMod[2,10,100]

Mod[2^10,100]

Quotient[15,4]

ClearAll[m,n];
m=25;n=78;
m==n Quotient[m,n]+Mod[m,n]

m n==GCD[m,n]LCM[m,n]

Prímszámok

Az n-edik prímszám:

Table[Prime[n],{n,20}]

Prime[(10^9)]

DiscretePlot[Prime[n],{n,1,100}]

A prímek száma:

PrimePi[10^9]

DiscretePlot[PrimePi[n],{n,1000}]

ClearAll[n];
n=Prime[(10^10)]Prime[(10^10)-1]

PrimeQ[n]