Podstawowe Operacje. Typy liczb. W pakiecie Mathematica mamy do czynienia z czterema typami liczb: 1. Integer liczby całkowite, 2. Rational liczby wymierne. 3. Real liczby rzeczywiste, 4. Complex liczby zespolone. Aby liczba była interpretowana jako rzeczywista musi ona zawierać kropkę. Na przykład: Zapis liczby 3 (bez kropki) jest odbierane jako liczba całkowita; 3. (z kropką) liczba rzeczywista. Typ danej liczby można sprawdzić za pomocą instrukcji Head: In[1]:= Head[3] Out[1]:= Integer In[2]:= Head[3.] Out[2]:= Real 1 Out[3]:= Head[ ] 5 Out[3]:= rational Oprócz tej instrukcji Mathematica dysponuje kilkoma innymi, za pomocą, których można sprawdzić, jaki typ ma podana liczba (parzysta, nieparzysta, pierwsza itp.). Wszystkie one są rozmieszone w dodatku D3. Liczby wymierne są zapisywane w postaci ułamków nieskracalnych, bo Mathematica jest to system symbolicznych przetworzeń i zawsze stara się przedstawić wyniki w postaci dokładnej. In[4]:= 1/5 1 Out[4]:= 5 Jeśli chcemy wynik w postaci dziesiętnej trzeba w liczniku lub mianowniku pisać kropkę. In[5]:= 1./5 Out[5]:= 0.2 Jeśli podczas obliczeń dużych zagadnień liczby mają typ wymiernej lub całkowitej, wtedy często bywa, że proces obliczenia trwa długo, lub nie ma końca. W takich przypadkach konieczna jest zmiana typów danych na rzeczywiste. W dodatku D1 dano krótki opis instrukcji( oraz przykłady), które konwersują typami. 13
Poniżej na konkretnym przykładzie zobaczymy, jakie odgrywają rolę typy liczb podczas obliczeń. Załóżmy, ze chcemy znaleźć pierwiastek równania. 2 x = Cos( Żeby rozwiązać metodą iteracji, trzeba je zapisać w postaci x ) (1) ϕ ( x ) = Cos( x ) (2) i zastosować instrukcję Nest, która zagnieżdża funkcję i ma postać Nest[ ϕ, x 0, n ] - gdzie ϕ jest funkcją postaci (2), x 0 początkowy punkt (grube przybliżenie pierwiastka) a n liczba iteracji(stopień zagnieżdżania). Poniżej podanego przykładu widać różnicę w traktowaniu różnych typów liczb przez Mathematica. Najpierw są określone równanie (1) i wzór (2). In[1]:= f@x_d := x 2 Cos@xD In[2]:= ϕ@x_d := è Cos@xD In[3]:= Nest@ϕ, 1., 5D Out[3]= 0.820786 Tu rozwiązuje się zagadnienie, początkowy punkt jest liczbą rzeczywistą (ona ma kropkę), In[4]:= Nest@ϕ, 1,5D * * Out[4]= ( Cos A ( Cos A&Cos A $Cos A è Cos @1DEEEE Tu początkowy punkt jest liczbą całkowitą i Mathematica daje dokładne rozwiązywanie Aby wyjaśnić wpływ typu liczb na czas obliczenia, dodajemy instrukcje Timing. In[5]:= Nest@ϕ, 1., 1000DêêTiming Out[5]= 80.05 Second, 0.824132 < In[6]:= Nest@ϕ, 1, 1000DêêN êê Timing Out[6]= 813.73 Second, 0.824132 < Porównując wyniki z linii 5 i 6 widzimy, ze w drugim przypadku potrzeba o wiele więcej czasu. Jeszcze raz zwróćmy uwagę na wyrażenie w linii 6. Instrukcja //N jest konieczna. Rozważmy jak działa Nest w rozpatrywanym przypadku: najpierw otrzymywany jest dokładny pierwiastek(wyobraźmy sobie jak olbrzymiej wielkości jest to wyrażenie. Będzie miało ono postać z linii 4, lecz kilka tysiąckrotne zagnieżdżone), potem dzięki operatorowi //N obliczana 14
jest jego wartość liczbowa. Gdybyśmy nie zastosowali tego operatora, Mathematica starałaby się wyświetlić całą postać dokładnego pierwiastka, co faktycznie jest niemożliwe. Definiowanie zmiennych. W bardzo prosty sposób możemy określać zmienne, a mianowicie znak równości (=) przypisuje zmiennej wartość np. x = 4. Od tego momentu zmienna x ma wartość 4. Aby anulować te przypisanie wystarczy napisać In[1]:= x =. Znak kropki anuluje wcześniejsze przypisanie. Zwracamy uwagę na to, że przy takim zapisie komórka wyjściowa nie pojawia się. Jeżeli chcemy nadać pewną wartość wyrażeniu, równaniu czy funkcji możemy to uczynić następująco: wyrażenie/. zmienna wartość. Na przykład: In[2]:= x 3 + 2 x 10 /.x a+1 Out[2]:= -10+2(a+1)+(a+1) 3 Zamianę w wyrażeniach również można zrobić za pomocą instrukcji podanych w tabeli. Operacja Replace[wyrażenie, reguła] Replace[wyrażenie, reguła, n] Replace[wyrażenie, reguła, {n}] ReplaceAll[wyrażenie, reguła] Komentarz Przekształca wyrażenie według podanej reguły. Przekształca wyrażenie według podanej reguły od zera do n-tego poziomu. Przekształca wyrażenie według podanej reguły tyłko na n-tym poziomie. Przekształca wyrażenie według podanej reguły (na wszystkich poziomach). Gdzie reguła ma postać: Szablon wartość Polecenie ReplaceAll jest równoważny na instrukcje: Wyrażenie/.szablon wartość UWAGA. Szablon w regułach to dowolne wyrażenie (o szablonach dokładne będzie mowa w rozdziale Szablony). 15
Działanie instrukcji, podanych w tabeli pokażmy na przykładach: In[3]:= wyr = 81, x, 1 + 2x+ x 2,x 3 <; In[4]:= ReplaceAll@wyr, x ad Out[4]= 81, a, 1 + 2a+ a 2,a 3 < Tu instrukcja ReplaceAll w wyrażeniu zmienia x wszędzie na a (na wszystkich poziomach) In[5]:= wyr ê. x a Out[5]= 81, a, 1 + 2a+ a 2,a 3 < To samo, co wyżej można zrobić za pomocą podstawki. In[6]:= Replace@wyr, x_ y_ a^b, 1D Out[6]= 81, x, 1 + 2x+ x 2,a b < Tu instrukcja Replace w wyrażeniu zmienia x w powolnej potędze wszędzie na a b (od zera do pierwszego poziomu) In[7]:= ReplaceAll@wyr, x_ y_ a + bd Out[7]= 81, x, 1 + a + b + 2x,a+ b< Tu instrukcja ReplaceAll w wyrażeniu wszędzie znajdzie zmienną x w jakikolwiek potędze i zamienia ją na a+b (na wszystkich poziomach) 16
Operacje arytmetyczne. W Mathematica wszystkie tradycyjne operacje arytmetyczne wykonuje się w zwykłej kolejności i są pokazane poniżej w Tabeli 3. Tabela 3 Operacja Z Palety Alternatywa Nazwa operacji x^y x/y y x Power[x,y] Potęgowanie x Divide[x,y] Dzielenie y x*y x y Times[x,y] Mnożenie x+y Plus[x,y] Dodawanie -x Times[-1,x] Odejmowanie Uwaga. Wyrażenie xy oznacza zmienną o nazwie xy. Gdy rozdzielimy je spacją x y będzie to wyrażenie x razy y. Szczegółowy opis funkcji matematycznej jest podany w dodatku D2. Operatory Logiczne i Relacje. Wynikiem dowolnej relacji zawsze jest wartość logiczna: True Prawdziwa False Nieprawdziwa Poniżej w Tabeli 4 są podane wszystkie operacje relacji. Tabela 4 Operacja Z palety Alternatywa Komentarz x==y Equal[x,y] Równość x!=y Unequal[x,y] Nierówność x>y Greater[x,y] Większe x>=y GreaterEqual[x,y] Większe lub równe x<y Less[x,y] Mniejsze x<=y LessEqual[x,y] Mniejsze lub równe x===y SameQ[x,y] Identyczne x=!=y UnsameQ[x,y] Nieidentyczne x=y=z x!=y!=z Wszystkie zmienne równe Wszystkie zmienne różne 17
W pakiecie Mathematica łatwo można zapisać dowolnie złożone wyrażenie logicznie. Podczas zapisu wyrażenia trzeba brać pod uwagę pierwszeństwo wykonanych operacji. Z poniższego przykładu widać, że operacja sumowania ma pierwszeństwo nad porównaniem. In[1]:= 7+8 > 11 Out[1]:= True Gdy zmienne nie mają nadanej wartości, Mathematica nie może rozstrzygnąć czy formuła jest prawdziwa czy fałszywa. In[2]:= a==b Out[2]:= a == b to można było zapisać inaczej: In[3]:= wyrażenie = a==b Out[3]:= a == b In[4]:= wyrażenie/. {a 3,b 5} Out[4]:= False lub wstawiamy wyrażenie nowe znaczenia zmiennych a i b. In[5]:= wyrażenie/. {a 11,b 11} Out[5]:= True Mówimy, że wyrażenie jest wyrażeniem logicznym, jeżeli on składa się z logicznych operacji i otrzymuje wartość logiczną. W tabeli 5 są określone operacje logiczne, które spotyka się w Mathematica. Tabela 5 Operacja Z palety Alternatywa Komentarz!p Not[p] Negacja p&&q And[p,q] Koniunkcja p7q Or[p,q] Alternatywa Implies[p,q] Implikacja Xor[p,q] Alternatywa wykluczająca p i q w tabeli 5 są logicznymi wyrażeniami na przykład, jeśli p=7>4 (p ma wartość True) i q=false, wtedy In[ ]:= And[p,q] Out[ ]:= False 18
Tworzenie List. Lista w Mathematica jest potężnym obiektem i pozwala zgromadzić elementy różnego rodzaju. Osoby, które zechcą poznać Mathematica głębiej, będą o tym przekonane. Listę tworzy się przez umieszczanie obiektów w nawiasach klamrowych. Obiekty w nawiasach oddziela się przecinkami. Liście można nadać nazwę i w przyszłości będziemy często zaznaczali ją przez ls. Na Rys. 11 pokazano prosty przykład określania listy. Rys. 11 Jak widać z Rys. 11 Mathematica może wydzielić obiekty z listy i operować poszczególnym elemencie. Aby wyciągnąć trzeci element z listy ls, piszemy ls[[3]]. Trzeba zwracać uwagę na to, że indeksy w listach pisze się w podwójnych kwadratowych nawiasach [[ ]]. Kombinacja symboli (* i *) pozwala pisać w komórkach wejściowych komentarze. Inaczej zapisane komentarze w Mathematica jest traktowane jako błąd. W tabeli 6 jest podany krótki opis instrukcji Table i Range. Polecenie Table pozwala stworzyć listę różnych postaci. Table[ x n, {n, 0, 5} ] daje listę ciągu funkcji potęgowych: {1, x, x 2, x 3, x 4, x 5 } 19
Tabela 6 Instrukcja Krótki opis instrukcji Table[f,{i max }] Tworzy listę i max długości o elementach f. Table[f,{ i, i max }] Tworzy listę o elementach f, i zmienia się od 1 do i max. Table[f,{ i, i min, i max }] Tworzy listę o elementach f, i zmienia się od i min do i max. Table[f,{ i, i min, i max,di}] Tworzy listę o elementach f, i zmienia się od i min do i max z krokiem di. Table[f,{ i, i min, i max },{ j, j min, j max }] Tworzy wielowymiarową listę o elementach f. Range[x 1, x 2, dx] Tworzy listę liczb od x 1 do x 2 z krokiem dx. Range[n] Tworzy listę liczb naturalnych od 1 do n z krokiem 1. Natomiast za pomocą instrukcji Range można otrzymać dowolny ciąg liczbowy w postaci listy, jednostajnie rosnącą lub malejącą: In[] : = Range [ 2.5,7,1.5] Out [] : = {-2.5, -1., 0.5, 2., 3.5, 5., 6.5} Na elementach listy w Mathematica można zrobić różne manipulacje. W tym celu w pakiecie istnieje dużo różnych funkcji, których krótki opis znajduje się w dodatku D4-D8. 20
Macierze i Wektory Instrukcje, za pomocą, których określa się wektory i macierze są podane w tabeli 7. Instrukcja Table[f[i],{I, n}] Array[f,{ i, n }] Table[f[i,j],{ i, n },{ j, m }] Array[f,{ i, n },{ j, m }] IdentityMatrix[n] DiagonalMatrix [ls] Tabela 7 Krótki opis instrukcji Tworzy wektor długości o n elementach f[i], i=1,2,...,n. Tworzy wektor o elementach f[i], i zmienia się od 1 do n. Tworzy macierz o elementach f [i,j]. Tworzy macierz o elementach f [i,j]. Tworzy macierz jednostkową. Tworzy macierz diagonalną, z elementami ls na przekątnej. Wektor w Mathematica reprezentuje się jako lista ujęta w nawiasach klamrowych. Oprócz instrukcji, które są podane w tabeli 7, macierze i wektory można tworzyć za pomocą polecenia Table z tabeli 6. Niżej pokażemy kilka przykładów podania wektora. Tu a jest wektorem i określa się go jako zwykłą listę: In[1] : = a = Table [ i^ 2,{ i,4}] Out [1] : = {1,4,9,16} Taki sam wektor można określić inaczej: 2 In [2]: = s = Table[ b[ i] = i,{ i,4}] ; In[3]: = s Out[3]: = {1,4,9,16} W tym przypadku s jest wektorem (listą) i jego elementy można wyciągnąć dwoma sposobami. In[4] : = s[[3]] Out [4] : = 9 In[5] : = b[3] Out [5] : = 9 21
Tu wektor a określa się zastosowaniem instrukcji Array: In[]: = Array[ a,4] Out[]: = { a[1], a[2], a[3], a[4]} To jest lista bez nazwy, ale do elementów tej listy(wektora) można odwołać się nazwą a[i], i=1,2,3,4; Lista, której elementy są listą o stałej długości, jest macierzą. In[1]: = A = {{ a, b},{ c, d}}; In[2]: = A// MatrixForm a b Out[2]: = c d Wyżej instrukcja MatrixForm pokazuje wyrażenie w postaci macierzowej. Jeśli macierz określamy zastosowaniem instrukcji Array In[3]:= m = Array@A, 83, 4<D êê MatrixForm Out[3]//MatrixForm= i A@1, 1D A@1, 2D A@1, 3D A@1, 4D y A@2, 1D A@2, 2D A@2, 3D A@2, 4D k A@3, 1D A@3, 2D A@3, 3D A@3, 4D { wtedy do elementów tej macierzy można odwołać się jako A[i,j], jak również m[[i,j]]. Na przykład: In[4]:= Do@A@i, jd = 4 Hi 1L + j, 8i, 3<, 8j, 4<D In[5]:= m êê MatrixForm Out[5]//MatrixForm= i 1 2 3 4 y 5 6 7 8 k 9 10 11 12{ In[6]:= A@3, 2D Out[6]= 10 In[7]:= m@@3, 2DD Out[7]= 10 Do dowolnego wiersza macierzy można odwołać się wpisując numer wiersza w podwójnych nawiasach kwadratowych po nazwie macierzy: In[7] : = m[[1]]^2 1 Out[7] : = {0,3,8,15} Teraz opiszemy inny sposób tworzenia macierzy. Z menu Input wybieramy opcję Create Table/Matrix/Pallete... W otwartym oknie dialogowym (Rys. 12) 22
Rys. 12 w polu Make zaznaczamy Matrix. Następnie wpisujemy liczbę wierszy (Number of rows) i kolumn ( Number of columns). Na koniec klikamy na przycisk OK i powstaje pusta macierz, i y k { po tym należy wypełnić ją odpowiednim sposobem. Aby dodać kolumnę do macierzy stworzonej wyżej opisywanym sposobem, wskazujemy kursorem na odpowiednie miejsce i naciskami na kombinację klawiszy Ò, (Ctrl+Przecinek). Tak samo wstawiamy wiersze, ale wykorzystując następującą kombinację klawiszy Ò (Ctrl+Enter). Instrukcje i operacje matematyczne działające na macierzach są opisane w załączniku D10. 23