A Mathematica alapjai

Ebben a leírásban megkíséreljük röviden ismertetni a Wolfram Research által kifejlesztett Mathematica szoftvert. Amint neve is mutatja, a program matematikai számítások számítógépes elvégzésére alkalmas. Itt a "számítások" szó alatt azonban nem csak pusztán "számolásra" kell gondolnunk, a Mathematica sokkal több ennél, ahogyan ez majd e jegyzet végére érve remélhetõen kiderül. Célom tehát az, hogy tömören, általános felhasználói szinten bemutassam ezt a komplex és igen-igen sokoldalú szoftvert. Természetesen eme leírás nem helyettesítheti a Mathematicaról nyomtatásban megjelentetett nagyszámú leírást, kézikönyvet; csupán az elindulás, az alapok elsajátítása, a lehetõségek felvillantása itt a cél. Emellett minden leendõ felhasználót ösztönzök arra, hogy az itt leírt példák és a program helpje alapján maga kísérletezzen, próbálgasson tovább, mert úgy gondolom, hogy e módon is sok hasznos és érdekes dologra rá lehet jönni, s a rendszert még jobban megismerni.

A Mathematica idén, 1998-ban 10 éves. Ennek kapcsán nyáron Chicagoban egy nemzetközi konferenciát rendeztek, ahol ismertették a Mathematica programcsomagot, elõadásokat tartottak lehetõségeirõl, felhasználásáról, az oktatásban betöltött szerepérõl.

A Mathematica kifejlesztése Stephen Wolfram és az évek során egyre bõvülõ csapata nevéhez fûzõdik. Számos tudományterület számos kiváló tudósa fektetett óriási tudásmennyiséget ebbe a programba. A mai modern matematika eszközeinek és alkalmazásainak a számítógép erejével történõ összekapcsolása hihetetlenül termékenynek és gyümölcsözõnek bizonyult. A Mathematicat a világ kutatóintézetei és egyetemei évek óta sikerrel használják, mind a kutatómunkában, mind az oktatás és szemléltetés terén. Túlzás nélkül állítható, hogy az élet az ilyen és ehhez hasonló matematikai programcsomagok nélkül ma már elképzelhetetlen lenne.
A Mathematicaba kézikönyvek és táblázatok tucatjait programozták bele. Segítségével olyan problémák oldhatók meg könnyûszerrel, amelyek "kézzel" akár hónapokig tartanának, vagy lehetetlenek volnának. A Mathematica szerkezete, felépítése nagyon logikus és átgondolt, az évek során sokat finomodott. Ez lehetõvé teszi, hogy bonyolult mûveleteket, pl. integrálást, vagy differenciálegyenletek megoldását is mindössze egy-egy parancs segítségével végezzük el. A Mathematica nagy ereje a több mint félezer beépített parancson túl a programozhatóságában is rejlik. Egyszerûen gyárthatunk hatékony algoritmusokat, amelyekkel még inkább meggyorsíthatjuk problémáink megoldását. (A Mathematica programozásáról több könyv is megjelent.) Speciális, alkalmazásorientált célokra a Mathematicahoz elõre megírt (segéd-)programcsomagokat is mellékelnek, pl. statisztikai, algebrai, geometriai, sõt optikai csomagokat, vagy olyanokat, amelyek segítségével még több integrált vagy differenciálegyenletet tudunk kezelni, megoldani. A csomagok általában jól dokumentáltak, így külön használatukra itt nem térünk ki, részben persze terjedelmi okok miatt sem. A Mathematica tehát nem egy lezárt rendszer, hanem inkább egy olyan jól mûködõ váz, amely az igényeknek megfelelõen tetszés szerint bõvíthetõ; így válik roppant hatékony eszközzé a matematikusok, fizikusok, mérnökök és a többi tudományterületen dolgozó szakemberek kezében.

Aki a Mathematica képességeivel, lehetõségeivel részletesebben szeretne megismerkedni, annak ajánlom, hogy látogasson el a Wolfram Research homepagere, ahol még sok-sok érdekes dolgot találhat.


E bevezetõ rész után térjünk rá az egyes funkciók és parancsok konkrét ismertetésére. Ezeket témakörök szerint részekre osztottam; a megfelelõ témanévre kattintva az adott részhez ugorhatunk (ha csak egy bizonyos dolog érdekel), de persze olvashatjuk a szöveget "lineárisan" is. Igyekszem az ismertetést - ahol csak lehet - példákon keresztül elvégezni; menet közben nyugodtan próbáljunk ki más paramétereket, más értékeket, más függvényeket, és nézzük meg, mi történik.
Természetesen senki se gondolja azt, hogy az itt következõ leírás valamilyen értelemben is teljes lenne; ahogy e jegyzet címe (és a bevezetõ rész) is mutatja, itt csak a Mathematica alapjai, az elinduláshoz és használathoz szükséges fontosabb parancsok, fogalmak kerül(het)nek ismertetésre.

Tartalom:


Elindulás, input-output, általános jellemzõk

Ebben a fejezetben olyan dolgokról lesz szó, amelyek alapvetõek a Mathematicaval való munkához, ezért a fejezet elolvasását mindenképpen ajánljuk.

Az ELTE Unixos hálózatán a szoftver a Turánon található, ha éppen nem itt vagyunk, akkor az
rlogin turan
paranccsal léphetünk a szerverre. Innen a programot a
mathematica
paranccsal indíthatjuk. Ha minden rendben ment, megjelenik a Mathematica-ablak.

Mindenekelõtt megjegyezzük, hogy ezen ablak képernyõre kerülésekor a Mathematica még nincs teljesen használatra kész állapotban, ugyanis a parancsértelmezõ rész (=Kernel) alapesetben nincs a memóriában. Emiatt az elsõ parancs beírása után csak pár másodperc múlva jelenik meg a jellegzetes Mathematica-prompt (közvetlenül utána pedig maga a parancs):
In[1]:=

Egy parancs bevitelét a Shift-Enter lenyomásával fejezhetjük be. Ha esetleg olyan hosszú lenne az inputunk, hogy egy sorban nem fér el, a befejezetlen utasítást nyugodtan folytathatjuk új sorban az Enter leütésével. (A Mathematica folyamatosan figyeli inputunkat, és az Enter hatására mindaddig új sort kezd, amíg befejezetlen kifejezéseket talál. A Mathematica akkor tekinti befejezettnek a bevitelt, ha minden zárójelet bezártunk és úgy ütünk Shift-Entert.)
A Mathematica válaszát az

Out[1]=

prompt után írja ki.

A Mathematicaval a továbbiakban is interaktívan, azaz párbeszédesen kommunikálunk; beírjuk a megfelelõ parancsot, a Mathematica pedig némi számítás után kiadja az eredményt. Egy összetettebb feladatot általában több részfeladatra bonthatunk, s a Mathematicaval ezeket a részeket külön-külön oldjuk meg. Nagy elõnye a programnak, hogy az egyes részszámítások eredményei mindvégig a memóriában maradnak, és onnan könnyen elérhetõk egy egyszerû hivatkozással:
az n-edik lépés eredményére egyszerûen az Out[n] szimbólummal hivatkozhatunk. Ezek tehát nem mások, mint változók, melyeknek munkánk során folyamatosan értéket adunk. Egy konkrét példában:

In[1]:=3+5
Out[1]=8
In[2]:=1-5
Out[2]=-4
In[3]:=Out[1]+Out[2]-1
Out[3]=3

Ha csak az elõzõ pár outputra szeretnénk hivatkozni, használhatjuk a % (százalék) jelet is. Ez az elõzõ outputot jelenti, a %% jel a kettõvel elõzõt, stb.

A Mathematica parancsairól általában elmondható, hogy vagy hagyományos matematikai formában írhatjuk be õket, vagy az illetõ matematikai fogalom (többnyire rövidítés nélküli) angol nevével hivatkozhatunk rájuk. Alapszabály, hogy a Mathematica különbséget tesz a kis- és nagybetûk között.

A parancsok és függvények neve mindig nagy kezdõbetûvel írandó! Amíg ezt nem szokjuk meg, gyakran kaphatunk erre vonatkozó hibaüzeneteket.

A függvénynév után közvetlenül, szóköz nélkül következik az õ argumentuma, mindig szögletes zárójelben.
Tehát pl. így: Sin[x], és soha nem (kerek zárójelben)!
A kerek zárójeleknek elkülönítõ, prioritáskijelölõ szerepük van. Használjuk õket bátran, ahol kifejezéseinkben a legkisebb kétség merül fel a mûveletsorrenddel kapcsolatban.

Az egy argumentumú parancsok esetében a Parancs[kifejezés] helyett ekvivalens megoldás a kifejezés // Parancs alak is.

A több argumentumú függvények argumentumait vesszõvel választjuk el. Például ArcTan[x,y].
Ez utóbbi példa azt is demonstrálja, hogy az olyan parancsnevek esetén, melyek több szó összetételébõl keletkeztek, az egyes szórészeket is általában nagy betûvel írjuk. (Jelen esetben az "arcus" és "tangent" szavak kezdõbetûit.)

Változóneveknek tetszõleges név választható (persze legyen egy szó), kivéve a rendszerbe beépített parancs- és függvényneveket.
Elõfordulhat, hogy mondjuk egy listának azt a nevet kívánjuk adni, hogy "list". Ezt megtehetjük; de mivel a Mathematicaban van egy List nevû parancs, a program a név adásakor figyelmeztet, hogy hasonló nevû utasítás már létezik. (Különbség van a kis- és nagybetûk között!) Ez csupán egy figyelmeztetés, hogy esetleg nem mi tévedtünk-e, nem egy elírás történt-e. Példánkban nyilván szándékosan adtuk ezt a nevet a listának, néha azonban jól jön a figyelmeztetés, amikor is tényleges félregépelés történt.
A változókban egyébként nem csak számokat tarthatunk, hanem szinte tetszõleges Mathematicai objektumot, kifejezést. Ha egy változónak már adtunk értéket, ezt nevének beírásával tekinthetjük meg újra.

Nagyon fontos dolog a kétfajta egyenlõségjel megkülönböztetése :

Tehát míg például b = 5 a "b" nevû változónak az 5 értéket adja, addig b == 5 egy logikai kifejezés, amely igaz, ha b értéke eredetileg 5 volt, és hamis, ha nem. Jegyezzük már most meg, és mindig tartsuk szem elõtt, hogy az egyenletmegoldások során a == jelet használjuk, pl. a Solve[x^2+1 == 0, x] parancsban (leírását lásd a megfelelõ résznél). Ha mégis = jelet írnánk, ez nehezen kideríthetõ hibához vezethet.

Egy változó tartalmát a " =. " vagy a ClearAll[változónév] paranccsal törölhetjük. Pl. a

b=.

vagy a

ClearAll[b]

utasítások bármelyikével felszabadíthatjuk "b" nevû változónkat. Fontos, hogy ha pl. egy szám volt b-ben, akkor törlés után értéke nem 0 lesz, hanem "semmi", azaz teljesen tiszta lappal indul.

Lényeges dolog, hogy függvények változóinak, egyenletmegoldások során ismeretlennek NE használjunk olyan változóneveket, amelyeknek elõzõleg már adtunk értéket. Vagy használjunk más nevet, vagy töröljük ki értékét a " =. " paranccsal használat elõtt.

Ha egy parancs bevitele után a Mathematica outputnak ugyanazt adja vissza, amit mi beírtunk (egy hibaüzenet kíséretében), akkor nagy valószínûséggel szintaktikus hibát vétettünk, elírtunk egy nevet, nem jól párosítottuk a zárójeleket, vagy az elõzõ bekezdésekben említett hibák valamelyikét követtük el. Ilyenkor javítsuk ki a hibát, és írjuk be újra az inputot. Elõfordulhat viszont, hogy a Mathematica hibaüzenet nélkül adta vissza az általunk beírt sort, látszólag anélkül, hogy bármit is csinált volna vele. Ekkor (1) vagy nyugtázta a bevitelt (pl. egy változó értékadásakor elfogadja az értéket, más teendõje nincs) - ez teljesen normális, (2) vagy az történt, hogy a feladatot nem tudta megoldani, elvégezni (például egy integrálást). Ez utóbbi esetben esetleg próbáljuk valahogy átfogalmazni problémánkat, ha tudjuk.

Most ejtsünk pár szót a helprõl.
Az egyes parancsokról leggyorsabban a ?Parancsnév formában kérhetünk rövid leírást. (Nagybetûvel kezdjük a nevet!) Ha azt szeretnénk, hogy pl. az összes "Ab..."-vel kezdõdõ parancsot kilistázza a Mathematica, akkor ?Ab* -ot kell beírnunk. (Ha pedig látni szeretnénk minden beépített parancsot, próbálkozzunk a ?* utasítással. Eredményül szép hosszú listát fogunk kapni.) Segítségkérésre másik lehetõség, ha magát a Help menüt használjuk. Az Open Function Browser... pontjának Built in functions címszava alatt a beépített parancsokat, függvényeket tekinthetjük meg, míg a Packages szóra klikkelve a segédprogramcsomagok utasításai kerülnek a képernyõre. (Ez utóbbi utasítások nincsenek automatikusan a memóriában, tehát használat elõtt be kell tölteni õket.)

Megtörténhet, hogy egy elindított, hosszú számítást le szeretnénk állítani. Ez a legtöbb esetben lehetséges, mégpedig az Action menü Interrupt pontjának Abort Calculation parancsát választva.

Végül, ha minden számítást befejeztünk, a Mathematicaból a File menü Quit parancsával léphetünk ki.


A Mathematica mint kalkulátor, alapmûveletek, alapszámítások

Ebben a fejezetben a számolásokról, a különbözõ típusú számokról és elemi mûveletekrõl lesz szó.

A Mathematicat tekinthetjük úgy is, mint egy nagy teljesítményû számológépet. Ám ellentétben a hagyományos számológépekkel, a Mathematica tetszõlegesen nagy számokkal és tetszõleges pontosságig tud dolgozni; elvben az egyetlen korlát számítógépünk véges memória- és diszkkapacitása. A Mathematicaban hatalmas számítási erõ rejlik.

Elõször is megjegyezzük, hogy a Mathematica tizedespontot használ tizedesvesszõ helyett.

A Mathematica alapvetõen kétfajta típusú számot különböztet meg: az egyikben nincs tizedespont, a másikban van. Amely számban nincs tizedespont, azt a Mathematica a számítások során mindvégig pontos értéknek tekinti, ezeknél kerekítést sosem végez. Ezek az Integer típusú számok. Azonban ha egy képlet valamely részében tizedespont szerepel, akkor az abban a részben szereplõ összes érték tizedespontos típusú számmá alakul, ezekre a Mathematica úgy tekint, mint közelítõ értékekre. Ezek a Real típusú számok. Pl. az "5" az egzakt ötöt jelenti, míg az "5." egy lebegõpontos szám. Mindjárt látunk egy példát a köztük levõ lényeges különbségre.

A példa a fent említett különbségre az egzakt és lebegõpontos számok között:
Sqrt[5]-öt írva a Mathematica ezt ilyen alakban hagyja és pontos számnak tekinti a számolásokban, viszont Sqrt[5.]-öt átkonvertálja 2.23607-té.

A Mathematica minden további nélkül kezelni tudja a komplex számokat. A képzetes egység jele: I. (Nagy i betû.) Itt is érvényes a szabály:
NE írjuk egybe a képzetes egységet változónevekkel. x+yI helyett írjunk x+y*I-t vagy x+y I-t.

Néhány beépített konstans:

Számkifejezések közelítõ értékeit az N paranccsal számíthatjuk ki.
Ha 6 értékes jegynél pontosabb értéket szeretnénk, az N[szám,pontosság] formát használjuk. Pl. a "gyök kettõ" elsõ 1000 tizedesjegye az N[Sqrt[2],1000] utasítással kapható meg.
N[Sqrt[2]] helyett használhatunk Sqrt[2]//N-et is, ahogy azt az elsõ fejezetben láttuk.

Az "x" valós számot "dx" hibával egzakt racionális számmá a Rationalize[x,dx] konvertálja.
Pl. egy, a "Pi"-t a 10^(-5)-es hibahatáron belül közelítõ racionális számot a Rationalize[N[Pi],10^(-5)] szolgáltat.


Elemi függvények

E rövid fejezetben felsoroljuk a legfontosabb elemi függvényeket.

Trigonometrikus függvények, hiperbolikus függvények és inverzeik:

Ezeknek a függvényeknek természetesen adhatunk komplex szám argumentumot is.
Van egy kétargumentumú ArcTan függvény, ArcTan[x,y]. Ez figyelembe veszi azt is, hogy az (x,y) pont melyik síknegyedben van.

A trigonometrikus függvények alapértelmezésben radiánban dolgoznak. Ha 30 fok szinuszát szeretnénk bevinni, használjuk a Sin[30 Degree] formát.

Az "E" alapú exponenciális függvény jele az Exp.
A természetes alapú logaritmus a Log.
Végül például a "kettes alapú logaritmus 8" Mathematicai megfelelõje: Log[2,8].


Számelméleti függvények

Most felsoroljuk a leggyakoribb számelméleti illetve kombinatorikai függvények Mathematica-beli alakjait.


Logikai kifejezések

Az "igaz" logikai értéket a True, míg a "hamisat" a False szó képviseli.

Módunk van állítások igazságának eldöntésére a következõképpen:
például 6+1 == 7 -re a Mathematica True-t válaszol, ám Log[2.] Sqrt[2.] -re False-ot, hiszen ez utóbbi a nagyobb érték.
Ezek helyett használhatjuk a TrueQ utasítást is. A szó végén álló "Q" betû arra utal, hogy ez egy eldöntendõ kérdés (question), így TrueQ[6+1 == 7] -re igazat ad vissza. (A TrueQ parancsot magyarul talán "Igaz-e, hogy..."-nak olvashatnánk.)
Megjegyezzük, hogy ennek analógiájára számos más "Q"-végû parancs is létezik. Néhány ezek közül: a NumberQ, IntegerQ, EvenQ, OddQ. Ezek igazat adnak vissza, ha argumentumuk rendre szám, egész szám, páros egész, páratlan egész szám. Két példa:
EvenQ[4] nyilván igaz értéket ad vissza, míg IntegerQ[4.] hamisat, hiszen a 4. számot a tizedespont miatt egy valós típusú számként interpretálja a Mathematica (és nem egy egzakt egészként).
(Erre a "Mathematica mint kalkulátor..." címû fejezetben utaltunk.)


Listák kezelése

A Mathematicaban a lista típus fontos szerepet tölt be.

Ha adatokat, táblázatokat kell tárolnunk, vagy ezekkel dolgoznunk a Mathematicaban, akkor ezt a típust használjuk. De listákként fogjuk fel a vektorokat és mátrixokat is, ezeket részletesebben a lineáris algebráról szóló részben tárgyaljuk.

Egy lista elemeit vesszõvel választjuk el egymástól, s köréjük kapcsos zárójeleket { } teszünk. A Mathematica lista-fogalma a matematikai halmazfogalomhoz áll a legközelebb, a listákra nyugodtan gondoljunk halmazként. (Ám míg egy halmazban egy elem csak egyszer szokott szerepelni, itt a listákban azonos elemeket többször is felsorolhatunk.)
Például ez egy lista: {1,True}, amelynek két eleme az "1" szám és az "igaz" logikai érték.
Egy másik példa: {{1,2},{3,5}}, ez egy két elemû lista, melynek elemei maguk is listák.

Tekintsük át az általános listamanipulációs parancsokat.

Egy lista n. elemét a {lista}[[n]] utasítással kaphatjuk meg.
Például {1,10,100}[[2]] = 10 lesz. (Fontos tehát, hogy az eredmény maga a listaelem, és nem a(z egyetlen) listaelembõl álló lista!)
Többszörös listáknál is használható ez a formula: pl.
{{1,2},{3,4}}[[2]][[1]] eredménye a 3 lesz, hiszen az eredeti lista 2. eleme a {3,4}, ennek 1. eleme pedig a "3" szám.
(Ilyeneket tipikusan akkor szoktunk használni, amikor a Solve parancs által egy egyenlet gyökeiként visszaadott listából szeretnénk a numerikus értékeket "kicsipegetni". Erre vonatkozólag lásd az egyenletek megoldásáról szóló fejezetben a Solve parancsot.) Listák generálásával kapcsolatban lásd még a Table parancsot.
Listák megjelenítésére a ListPlot parancs szolgál.
Hosszú listák, kifejezések rövidített kiírására pedig a Short utasítás alkalmas.


Lineáris algebra

Az elõzõ fejezetben említettük, hogy a Mathematicaban a vektorokat és mátrixokat speciális listákként kell felfogjuk.

Például a háromdimenziós térben az (x,y,z) koordinátájú vektor itt egyszerûen {x,y,z} alakú.
Hogy egy lista vektor-e, a VectorQ paranccsal verifikálhatjuk. Pl. VectorQ[{1,2,3,4}] igaz lesz (ez egy négydimenziós vektor), míg VectorQ[{1,2,{3}}] hamis, mert a 3. pozícióban szerepel egy lista is.

Hasonlóképpen a mátrixok a kettõs listák. Például a következõ lista egy 2x3-as mátrixot definiál:
{{1,2,3},{4,5,6}}
Ezt úgy kell érteni, hogy az elsõ sor elemei az 1, 2 és 3,
a második sor elemei pedig a 4, 5 és 6.
Egy listáról a MatrixQ paranccsal állapíthatjuk meg, hogy valóban mátrix-e.
Néha szükség lehet arra, hogy a mátrixokat a hagyományos mátrixformában láthassuk, erre szolgál a MatrixForm utasítás.
Például az elõbbi mátrixunkat az emberi szem számára tetszetõsebb téglalapos formába rendezhetjük a
{{1,2,3},{4,5,6}}//MatrixForm használatával.

Az ide tartozó legfontosabb utasítások:


Algebrai kifejezések manipulációja, polinomok

Most a változókat tartalmazó kifejezésekrõl és azok különbözõ alakjairól, átalakításairól lesz szó.

Az egyik leghasznosabb és leggyakrabban használt egyszerûsítési parancs a

amely hatékonyan alkalmazza a fent felsorolt parancsokat, hogy a kifejezést a lehetõ legegyszerûbb alakra hozza. Mind szimbolikus, mind numerikus kifejezésekkel jól boldogul, néha drámai egyszerûsítéseket produkál.

Végül a helyettesítõ operátorról szólunk.
Ha egy kifejezés valamely változója helyébe egy másik változót, kifejezést vagy számot szeretnénk helyettesíteni, a következõ alakot használjuk:
kifejezés / . régi változó - új érték
Példák: az x^2 + Log[x] kifejezésben x helyére 5-öt írunk
x^2 + Log[x] /. x-5

Szimultán helyettesítések esetén { } jelet kell használnunk. Az
x*y + z^2 /. { x-(a+1) , y-4 } eredménye a "4(a+1) + z^2" kifejezés lesz.


Egyenletmegoldás, minimumkeresés, interpoláció

Egyenletek megoldására alapvetõen a Solve parancs szolgál.

Például a Solve[ x^3 - 2x^2 - 5x + 6 == 0 ] megoldja ezt a harmadfokú egyenletet. (Ne felejtsük el a dupla egyenlõség jelet!!!) A megoldásokat a parancs egy listában helyezi el, ebben az esetben ilyen módon:
{{x - -2} , {x - 1} , {x - 3}}.
Ha pl. egy "gyok1" nevû változóba szeretnénk betenni az elsõ gyök értékét, tömören írhatjuk ezt:
gyok1 = Solve[ x^3 - 2x^2 - 5x + 6 == 0 ][[1]][[1]][[2]].
Itt a Solve[...] rész adja a fenti 3 elemû listát, az [[1]]-es ennek elsõ elemét, {x - -2}-t, a következõ [[1]]-es ennek a listának az elsõ elemét, x--2. Majd a [[2]] operáció magát a (-2)-t.
(Az ilyen típusú kifejezésekrõl a listák kezelése c. részben volt szó.)

Ha négynél magasabb fokú egyenletet akarunk megoldatni a Mathematicaval - mint tudjuk - semmi garancia sincs arra, hogy valóban létezik gyökképlet a megoldásra. Ilyen esetekben a Solve leválasztja azokat a gyököket, melyeket megtalált, a többit a ToRules[Roots[...]] alakban hagyja, ahol a "..." helyén álló egyenletrésszel nem tudott elbánni.
Numerikusan azonban még ilyen esetekben is mindig megkaphatjuk a megoldásokat.
Ennek egyik módja, hogy az együtthatókat lebegõpontos formában adjuk meg (pl. 5 helyett 5.-öt írva), ezzel kényszerítve ki a numerikus megoldást.
A másik út, hogy az N[Solve[egyenlet == 0], pontosság] alakot használjuk, amelynek elõnye, hogy még a kívánt pontosságot is meghatározhatjuk. (Szokás szerint a pontosság helyén egy természetes szám áll.)

Ha több változó szerepel az egyenletben, írjuk oda, hogy melyik változóban kérjük a megoldást.
Például a Solve[ a*x^2 + b*x + c == 0, x ] megadja az általános másodfokú egyenlet megoldóképletét.

Több egyenletbõl álló egyenletrendszer esetén az egyenleteket a && ( = logikai "és") jellel kapcsolhatjuk össze. Például: Solve[ x^2-1 ==0 && 2x+2 == 0 ].
Ha nincs megoldás, eredményül üres halmazt, { }-t kapunk.

Paramétereket tartalmazó egyenletek esetén használhatjuk a Reduce utasítást, amely úgy adja meg az összes megoldást, hogy figyelembe veszi a paraméterek lehetséges értékeit. Egy példa:
Reduce[ a*x + b ==0, x ] hatására ezt kapjuk:
b == 0 && a == 0 || a != 0 && x == -b/a
A logikai kifejezések c. fejezetben magyaráztuk meg az ilyen formulák értelmét; így olvasandó:
"(b = 0 és a = 0) vagy (a nem 0 és x = -b/a)".

Az Eliminate[egyenletek, változók] parancs a megadott (és &&-sel összekapcsolt) egyenletekbõl kiküszöböli a megadott változókat, a többiekkel fejezve ki õket.

A FindRoot parancs egyenletek gyökeinek közelítõ értékét keresi, a megadott kezdõponttól.
Például a FindRoot[Sin[x] == 0.5, {x,0}] megkeresi a Sin[x] = 0.5 egyenlet 0-hoz legközelebb esõ gyökét.

A FindMinimum utasítás a megadott függvény (lokális) minimumhelye után kutat, a megadott kezdõponttól. Pl.
FindMinimum[-Exp[-x^2], {x,-1}]. Ez egy listát ad vissza, melynek elsõ eleme a minimum értéke, második eleme a minimum helye.

Utoljára tárgyaljuk a Fit parancsot, amely egy kicsit kilóg a sorból: ez a fentiek "fordítottját" végzi bizonyos értelemben. A megadott adatokra a megadott függvények lineáris kombinációjából gyárt egy legjobban illeszkedõ függvényt, tehát tulajdonképpen interpolál.
Mûködését ismét egy példán keresztül világítjuk meg:
Fit[{{1,5},{2,6},{3,7}}, {1,x,x^2,x^3}, x] hatására egy olyan harmadfokú polinomot kapunk, amely az 1, 2, 3 helyeken rendre az 5, 6, 7 értékeket veszi fel. (Persze egyáltalán nem muszáj x-hatványokat megadnunk, mint a példában tettük; a Fit tetszõlegesen megadott függvények lineáris kombinációját rá tudja illeszteni adatainkra.)
Egyébként a speciális függvényekrõl szóló fejezetben megemlítünk még néhány nevezetes interpolációs polinomot.


Határérték, sorfejtés, összegzés


Deriválás, integrálás

Elõfordulhat, hogy egy primitív függvényt a Mathematica nem tud meghatározni (mert pl. nincs is rá bevezetett jelölés), ilyenkor változtatás nélkül visszaadja az általunk inputként beadott sort. Bizonyos divergens határozott integrálok esetén is ez történik. (Bár a Mathematica legújabb, 3-as verziójában ezen sokat javítottak.) Ilyen helyzetekben ne adjuk fel, próbáljuk még meg a numerikus integrálás parancsát:

Ha végképp nem boldogulunk egy integrál kiszámításával, ellátogathatunk egy külön erre a célra létrehozott web site-ra. A Wolfram Research által mûködtetett oldal, a www.integrals.com a Mathematica legújabb "engine"-jét használva rengeteg primitív függvényt tud meghatározni (persze a válaszban gyakran szerepelnek speciális függvények). Az oldal interaktívan mûködik: beírjuk és elküldjük kérdésünket, s ha jó a kapcsolat, pár másodperc múltán megérkezik a válasz. Lehetõség van arra is, hogy amennyiben egy integrál szerintünk kiszámítható, de a program nem tudja kiszámolni, akkor a szóban forgó integrált elküldjük az ottani szakembereknek; õk kielemzik a problémát és betáplálják a programba.

Integrálfüggvények grafikus megjelenítésérõl a grafikáról szóló fejezetben olvashatunk.


Differenciálegyenletek


Speciális függvények, transzformációk

A Mathematica számos speciális függvényt és polinomot tartalmaz, amelyek az alkalmazások szempontjából fontosak. Ezek közül ragadunk ki most - némileg önkényesen - néhányat. Ezekkel is csak felsorolásszinten foglalkozunk. A neveikbõl többnyire következtetni lehet a funkciójukra, mûködésükrõl részletesebb információt a helpbõl kérjünk (?Függvénynév).
Ha az itt következõ felsorolásban egy parancsnév után *-ot látunk, az arra utal, hogy a csillag helyén többfajta karakter állhat, a csillag ezek közül helyettesít egy (esetleg több) karaktert, helpet is így kérhetünk róluk. Ezek egy függvény módosításai, variánsai általában; a "csillag" itt egy függvénycsalád több tagját fogja össze. A helpben õk részletesen le vannak írva. (Például az Elliptic* helyettesíti az EllipticE, EllipticF, EllipticK, EllipticPi, EllipticTheta stb. függvények valamelyikét.)


Grafika: grafikonok és adatmegjelenítés

A grafikus megjelenítés kiemelten azon feladatok közé tartozik, amelyben a Mathematica nagyon sokat tud nyújtani illetve segíteni. Sajnos e fejezetben is rá vagyunk kényszerítve, hogy csak a lényeget mondjuk el, kihagyván az (igen érdekes) részleteket.

A grafikai parancsok népes családja a Plot parancsra és variánsaira épül. (Ezek közül most nem kerülnek ismertetésre - többek között - a ContourPlot, a DensityPlot és az animációs parancsok. Róluk rövid útmutatást a helpben találhatunk.)

A Mathematicaval mind két-, mind háromdimenziós ábrák készíthetõk. Egy háromdimenziós ábrát generáló parancs neve tipikusan az analóg kétdimenziós parancs nevébõl és a "3D" szócskából áll. (Pl. Plot és Plot3D)

A Plot paranccsal függvények grafikonjait rajzolhatjuk meg, két dimenzióban. Például a
Plot[Exp[x],{x,-5,3}] kirajzolja az E^x függvény egy részét, amikor x befutja a [-5,3] intervallumot.
Ha több függvényt akarunk egy koordinátarendszerben ábrázolni, listaként soroljuk fel õket, pl. az E^x és Sin[x] függvényeket a
Plot[{Exp[x],Sin[x]},{x,0,5}] sorral rajzolhatjuk ki.
Ebben a példában az Exp függvény értéke nagyon nagy lesz a Sin-hoz képest és a Sin függvény esetleg nem látszik szépen. Ekkor szükség lehet arra, hogy beállítsuk, a függõleges tengelyen mekkora értékekig engedélyezzük a rajzolást. Erre a PlotRange opció szolgál. Például a
Plot[{Exp[x],Sin[x]},{x,-3,3},PlotRange-{-2,2}] parancs a két függvényünket egy 3+3 egység széles és 2+2 egység magas (origó középpontú) képzeletbeli téglalapban helyezi el.

Ha függvényünkben szingularitás van, a Plot használatakor hibaüzenetet kaphatunk. Ez történik akkor is, ha a Plotban megadott tartomány kívül esik a függvény értelmezési tartományán. Pl. Plot[Sqrt[x],{x,-1,2}] hibát jelez, és nyilván csak a nemnegatív x-ekhez tartozó értékeket rajzolja ki. Példa egypontú szingularitásra:
Plot[Sin[1/x],{x,-3,3}], ez az x=0-ban nem értelmezett, a Plot viszont itt is ki szeretné számolni a függvényértéket. Ezen azonban egy egyszerû trükkel segíthetünk: toljuk el egy picit az értelmezési tartományt, "bontsuk meg" a szimmetriát, így nem fog a 0-ba osztópont ("mintavételi pont") kerülni. Tehát írjuk pl. ezt:
Plot[Sin[1/x],{x,-3,3.1}]
Komplex értékeket is adhatunk argumentumnak, de vigyázni kell, hogy a függvényérték mindig valós maradjon, hiszen két dimenziós ábrákról van most szó.
A híres dzeta-függvény elsõ pár gyökét láthatjuk a következõ ábrán (itt a függvény abszolút értéke áll):
Plot[Abs[Zeta[1/2+I*y]],{y,-20,30}]

Az integrálokról szóló fejezetben szó volt az integrálfüggvények ábrázolásáról.
Ezt is egy példán keresztül mutatjuk meg: Plot[Integrate[1/Sqrt[2Pi]*Exp[-x^2/2],{x,-Infinity,t}],{t,-3,3}] például a standard normális eloszlás eloszlásfüggvénye a [-3,3] intervallumban.

Ha megfigyeljük, a Plot parancs outputja - a grafikon mellett - az ún. "Graphics" objektum. Tulajdonképpen ez reprezentálja a Mathematica számára a grafikus képet, ebben van eltárolva az információ. Ezt a Show paranccsal jeleníthetjük meg ismét (tehát anélkül, hogy újra beírnánk a Plot[...] utasítást). Pl. két Plot parancs eredménye az "Out[23] = -Graphics-" és az "Out[38] = -Graphics-" sor. Ekkor a két függvényt a
Show[ {Out[23] , Out[38]} ] paranccsal jeleníthetjük meg egyszerre.

Térjünk most rá a kétparaméteres függvényekre.

Ezeket a térbeli ábrákat a Plot3D segítségével jeleníthetjük meg. Pl. a komplex változós gamma-függvény abszolút értéke így fest:
Plot3D[Abs[Gamma[x+I*y]],{x,-3,3.1},{y,-4,4.1}]
Ez az utasítás alaphelyzetben esetleg túl durva poligonokat használ a megjelenítéshez, ezen a PlotPoints-szal finomíthatunk. Pl. Plot3D[...,{x,-3,3.1},{y,-4,4.1},PlotPoints-40]
A takarások miatt szükséges lehet a térbeli ábrát más szemszögbõl is megszemlélnünk, erre való a ViewPoint opció. Pl. Plot3D[...,{x,-3,3.1},{y,-4,4.1},ViewPoint-{0,0,2}]

Néhány ViewPoint érték és jelentése:

{0 , 0, 2} = felülnézet
{2 ,-2, 0} = jobb sarok
{-2,-2, 0} = bal sarok
{0 ,-2,-2} = lentrõl elölrõl
{0 ,-2, 2} = felülrõl elölrõl
{0 ,-2, 0} = szembõl

A listákról szóló fejezetben hivatkoztunk a ListPlot parancsra. Ezzel - amint nevébõl következik - a listákat szemléltethetjük, elemeiket ábrázolhatjuk, mégpedig (a legegyszerûbb esetben) pontokkal. Pl.
ListPlot[{{1,2},{2,3},{3,4},{4,5}}]
az 1, 2, 3, 4 helyeken rendre a 2, 3, 4, 5 értékeket jeleníti meg.
(Ennek a parancsnak is létezik "3D"-s megfelelõje, a ListPlot3D.)

Végül a ParametricPlot parancs kerül terítékre. Ezzel egyparaméteres görbéket jeleníthetünk meg síkban. Pl.
ParametricPlot[{Cos[t],Sin[t]},{t,0,2Pi}] egy kört produkál.
Párja a ParametricPlot3D, ezzel

Megjegyzés. Az egyes parancsoknál értelemszerûen egyszerre több opció is megadható, vesszõvel elválasztva (pl. a Plot3D-nél szerepelhet mondjuk a ViewPoint és PlotPoints egyszerre is, ha úgy szükséges).

A grafikával kapcsolatban érdemes még megemlíteni a következõ lehetõséget. A grafikák, képek beírt parancsunk alatt jelennek meg. Ha az egérrel ráklikkelünk a grafikát tartalmazó részre, a kép körül megjelenik egy keret. Ezt a keretet (és persze vele együtt ábránkat is) tetszés szerint nagyíthatjuk (vagy kicsinyíthetjük), ha a sarkát vagy az oldalát megfogjuk és az egérrel a kívánt méretûre húzzuk ki. Ismét középre klikkelve és az egérgombot lenyomva tartva az ablakot másik helyre mozgathatjuk át. (Tehát lényegében itt is mûködik a Windowsban megszokott ¨drag-and-drop¨.)


Pár szó a ciklusokról, programozásról

Listák gyártására valamilyen szabály szerint a Table parancs alkalmazható. Pl.
Table[Prime[i],{i,1,20}] beírja az elsõ 20 prímszámot egy listába.

Az alapvetõ ciklusutasítás a Do[kifejezés,indextartomány].
Az elõbbi prímtáblázatot pl. ezzel a két utasítással is megkaphatjuk:
primek={}
Do[primek=Union[primek,{Prime[i]}],{i,1,20}]
Az eredmény a "primek" nevû listában fog szerepelni. (A "primek" változónevet beírva válik láthatóvá a lista tartalma.)

A feltételes utasítás az If[ feltétel, igaz, hamis ]. Pl.
If[a==4, Print["a erteke 4"], Print["a nem 4"]]
hatására az a=4 illetve "a" nem négy esetben a fenti szövegek valamelyike íródik ki.

Függvényt például így definiálhatunk (fontos az x után álló aláhúzásjel, ami csak a bal oldalon szerepel!):
f[x_] := Sin[x] + Cos[x]
Ezután pl. f[3]-ra Sin[3]+Cos[3]-at kapunk.
Feltételes értékadásra, definícióra példa:
g[x_] := 1+Log[x] /; x 0
Ez pedig egy "g" függvényt értelmez (1+Log[x]-nek) a pozitív x-ekre.


Néhány egyéb parancs

Ebben az utolsó fejezetben olyan parancsokat ismertetünk, melyek néha jól jöhetnek, de igazából egyik fenti fejezetbe sem illenek bele. (E fejezet parancsai vannak a legönkényesebben összeválogatva...)


Készítette: Lóczi Lajos, 1998.
E-mail cím: lloczi@cs.elte.hu