Matematyka przy komputerze

Skrypt opisujący podstawy programu Mathematica przygotowany przez dr Andrzeja Kozłowskiego i dr Galinę Filipuk.

Wstęp i przegląd

Spis treści

Wstęp i przegląd

Podstawowe informacje o Mathematice

Czym jest Mathematica?

Portal Wolfram Research i związane z nim projekty

Mathworld

Wolfram Alpha

Wolfram Demonstrations Project

Program edukacyjny

The Mathematica Journal

Inne strony związane z Mathematicą

Mathics

Wybrane przykłady możliwości Mathematiki

Wbudowane funkcje

Programowanie

Wyspecjalizowane funkcje

Grafika i interaktywna “Dynamika”

Format CDF, CDF Player i Projekt Demonstracji Wolframa.

Wolfram Alpha i “swobodna forma”

1. Wstęp i przegląd

W XXI stuleciu komputery bardzo istotnie zmieniają wszystkie aspekty naszego życia. Zmieniają również matematykę - zarówno sposób jej uprawiania, jak i rodzaj problemów, które nas interesują. Dzięki możliwości wykonywania obliczeń o wiele bardziej skomplikowanych niż to było wyobrażalne bez pomocy współczesnego sprzętu, dla każdego człowieka wyposażonego w komputer, odpowiednie oprogramowanie i trochę wiedzy matematycznej otworzyły się dawniej nieosiągalne rejony badań. Powstały potężne programy, które wspierają badania we wszystkich dziedzinach matematyki obliczeniowej:  manipulacji symbolicznej, obliczeniach numerycznych i wizualizacji (włącznie z interaktywną wizualizacją). Jednym z czołowych programów tego typu jest Mathematica firmy Wolfram Research. Mathematica jest doskonałym narzędziem do studiowania nowych działów matematyki obliczeniowej, ale także może być bardzo pomocna w badaniu tych bardziej tradycyjnych działów. Celem wstępnego rozdziału jest zademonstrowanie niektórych możliwości tego niezwykłego programu jakim jest Mathematica. Aby go osiągnąć, użyliśmy szeregu przykładów, z których część przygotowaliśmy sami, niektóre są zapożyczone z oficjalnej dokumentacji Mathematiki, a jeszcze inne są zebrane z różnych ogólnodostępnych źródeł w internecie.

Podstawowe informacje o Mathematice

Czym jest Mathematica?

Mathematica jest jednym z najpotężniejszych i najbardziej zaawansowanych systemów do symbolicznych i numerycznych obliczeń oraz wizualizacji. Jest nawet czymś więcej. Początkowo Wolfram Research opisywał Mathematikę jako “system do matematyki komputerowej”, ale później rozwinął ten opis do “jedynej platformy deweloperskiej w pełni integrującej obliczenia w pełne przepływy pracy” (“the only development platform fully integrating computation into complete work-flows”). Innymi słowy, w wizji Wolfram Research Mathematica ma być uniwersalnym narzędziem programistycznym, w którym wszelkiego rodzaju obliczenia, także symboliczne, są integralną częścią systemu.

Przykładem tego jest fakt, że Mathematica jest bardzo zaawansowanym narzędziem typograficznym. Za jej pomocą można tworzyć dokumenty matematyczne o jakości porównywalnej zKN1_wstep_i_przeglad_1.gif-em. Dokumenty te mają jednak jeszcze dodatkową zaletę, której brak KN1_wstep_i_przeglad_2.gif-owi  - mogą zawierać “żywe” formuły matematyczne i “żywą” grafikę, które po zmianie parametrów czy innych danych automatycznie są przeliczane i obiekty wizualne są rerenderowane. Dokumenty zawierające interaktywne obliczenia mogą być wysłane do innej osoby - np. współpracownika, studenta lub profesora - która może zmieniać parametry i wykonywać własne obliczenia, nawet niekoniecznie posiadając program Mathematica lub umiejętność jego obsługiwania. W pewnym sensie jeszcze dalej idącym rozwinięciem tej idei jest działający online program Wolfram|Alpha, którego “motorem” jest Mathematica.

Pod względem całego spektrum możliwości nie istnieje dziś narzędzie, które mogłoby konkurować z Mathematiką. Jeśli jednak ograniczymy się tylko do obliczeń pewnego typu, np. z dziedzin teorii grup, algebry przemiennej czy numeryki, to trzeba przyznać, że istnieją specjalistyczne programy (np. MAGMA, Singular, Macauley2, MatLab) potrafiące wykonywać niektóre obliczenia, które w Mathematice nie są zaimplementowane i wymagają samodzielnego programowania (co zwykle wiąże się z tym, że poźniej wolniej się wykonują). Jako program matematyczny, Mathematica jest programem przeznaczonym do celów ogólnych. Jest przygotowana do wykonywania zarówno symbolicznych, jak i numerycznych obliczeń. Posiada bardzo wiele wyspecjalizowanych funkcji z różnych działów matematyki (np. algebry wielomianowej, teorii grafów, równań różniczkowych, teorii prawdopodobieństwa, statystyki, matematyki finansowej itp.) oraz pokrewnych nauk (np. cyfrowe przetwarzanie obrazów, cyfrowe przetwarzanie sygnałów itp.). Tym, co ją najbardziej odróżnia od innych programów matematycznych, jest niezwykle rozwinięty język programistyczny, który daleko wykracza zasięgiem poza zastosowania w obliczeniach.

Portal Wolfram Research i związane z nim projekty

Wolfram Research posiada wiele stron internetowych związanych z Mathematiką i spokrewnionymi projektami. Główna strona, z aktualnymi informacjami, pożytecznymi programami, dodatkami, centrum edukacji oraz dokumentacją to www.wolfram.com. Z tej strony można także pobrać darmowy CDF-Player, tysiące demonstracji z kodem źródłowym i edukacyjne filmy.

Mathworld  <http://mathworld.wolfram.com/>

MathWorld jest bardzo pożytecznym i obszernym źródłem informacji z różnych dziedzin matematyki, zawierającym definicje, twierdzenia, przykłady itp. Często są one ilustrowane w załączonych plikach w formacie Mathematiki.

Wolfram Alpha  <http://www.wolframalpha.com/>

Wolfram Alpha - Mathematica (i więcej!) dla każdego!

Wolfram Demonstrations Project <http://demonstrations.wolfram.com>

Projekt zawiera ogromną liczbę interaktywnych demonstracji z różnych dziedzin nauki i sztuki, w tym bardzo wiele z matematyki, a także gry itp. Każdą demonstrację można pobrać w formie interaktywnego pliku CDF, a następnie w pełni używać przy pomocy darmowego CDF Playera (oczywiście niepotrzebnego osobom posiadającym najnowszą wersję Mathematiki). Bardzo pożyteczną rzeczą jest również dostępność kodu źródłowego każdej demonstracji. Może on być pobrany i swobodnie modyfikowany przez każdego, kto ma dostęp do Mathematiki (sam CDF Player nie nadaje się już do tego celu). Uważne studiowanie i modyfikowanie kodu demonstracji jest jedną z najlepszych metod nauczenia się programowania w Mathematice.

Program edukacyjny

Wolfram Research prowadzi ekstensywny program edukacyjny. Aby się zarejestrować i uczestniczyć w seminariach online Wolfram Educational Group (WEG), należy wejść na stronę:
<http://www.wolfram.com/services/education/calendar.cgi>
Na świecie, w tym także w Polsce, jest organizowanych wiele konferencji różnego typu poświęconych Mathematice i jej zastosowaniom. ICM (Centrum Interdyscyplinarne) prowadzi kursy wprowadzające do Mathematiki na Uniwersytecie Warszawskim.

The Mathematica Journal

The Mathematica Journal <http://www.mathematica-journal.com/> jest publikacją online poświęconą zastosowaniom Mathematiki w pracy badawczej i dydaktycznej.

Inne strony związane z Mathematicą

Doskonałym i darmowym wstępem do programowania w Mathematice jest książka Leonida Shifrina:
http://www.mathprogramming-intro.org/

Także Mathematica Guidebooks <http://www.mathematicaguidebooks.org/index.shtml> dostarczają bogatego zbioru przykładów spektakularnych zastosowań Mathematiki, szczególnie w fizyce, ale również w innych dziedzinach. Niestety  “Guidebooks” nie są w pełni kompatybilne z nowszymi wersjami Mathematiki (późniejszymi niż 5), więc najlepiej nadają się dla doświadczonych użytkowników programu, którzy samodzielnie potrafią dokonać koniecznych zmian w kodzie programów.

Jednym z najlepszych sposobów na zostanie ekspertem w Mathematice jest udział w grupie dysusyjnej zwanej MathGroup:
http://groups.google.com/group/comp.soft-sys.math.mathematica/topics?pli=1
Można tu zadawać pytania dotyczące każdego aspektu Mathematiki i otrzymywać wiele, często bardzo różnorodnych, odpowiedzi od ekspertów, włącznie z pracownikami Wolfram Research. Chociaż to forum nie służy z założenia temu celowi, czasem można tu nawet dostać rozwiązanie zadania matematycznego.

Podobny cel, choć w nieco inny sposób, jest realizowany przez stronę Mathematiki na Stack Exchange:
http://mathematica.stackexchange.com
Tak jak inne strony Stack Exchange, ta również nie jest tradycyjną “grupą dyskusyjną” jak MathGroup. Tutaj użytkownicy zadając pytania i odpowiadając na pytania innych użytkowników, zdobywają za to “punkty statusowe” (można również otrzymać punkty ujemne), “przywileje” i “odznaki” (badges).

Wielu ekspertów w Mathematice, włącznie z pracownikami Wolfram Research, wypowiada się także na forum Stack Exchange. Główną jego przewagą nad MathGroup jest znacznie nowocześniejszy interfejs - na przykład można tu łatwo umieszczać grafikę i formuły matematyczne (MathGroup zezwala tylko na posty w formacie ASCII). Trzeba jednak pamiętać, że tematyka Stack Exchange jest bardziej ograniczona i dotyczy niemal wyłącznie aspektów programistycznych.

Mathics

Dla tych, którzy nie mają dostępu do Mathematiki, a dla których Wolfram|Alpha nie jest wystarczający - na przykład dla osób chcących samodzielnie programować - dobrą alternatywą jest:
http://www.mathics.org
Mathics jest darmowym systemem do obliczeń i programowania używającym tej samej składni co Mathematica. Zawiera on co prawda tylko bardzo niewielki podzbiór funkcji matematycznych dostępnych w Mathematice, ale dobrze nadaje się do ćwiczenia języka programistycznego. W pewnym sensie Mathics i Wolfram|Alpha uzupełniają się: Wolfram|Alpha ma dostęp do prawie wszystkich zaawansowanych funkcji matematycznych Mathematiki, ale nie można w nim programować - za to w Mathics można programować, używając tego samego języka co w Mathematice, ale liczba wbudowanych funkcji jest ograniczona (niektóre bardziej zaawansowane opierają się na innym darmowym programie Sage).

Oczywiście naszym celem nie było opisanie wszystkich zasobów wiedzy i materiałów związanych z Mathematiką dostępnych w internecie. Byłoby to zadanie niemożliwe do wykonania nie tylko z powodu wielkiej ilości już istniejących stron i portali, ale także dlatego, że ich liczba ciągle się zwiększa. Tym niemniej mamy nadzieję, że informacje zamieszczone powyżej będą pomocne dla każdego pragnącego zdobyć podstawową wiedzę o Mathematice, a także dla osób, które już taką wiedzę posiadają, ale chcą zwiększyć swoje umiejętności w zakresie używania tego programu.

Wybrane przykłady możliwości Mathematiki

Wbudowane funkcje

Wiele zadań, także tych wziętych “z życia”, można rozwiązać, używając funkcji, które są “wbudowane” w Mathematice (słowo “funkcja” użyte w tym kontekście ma nieco inne znaczenie niż to znane z matematyki). Takich funkcji jest do naszej dyspozycji ogromna liczba. Wśród nich jednymi z najpożyteczniejszych są Solve i Reduce - są to bardzo ogólne funkcje korzystające z dużej ilości zaawansowanych algorytmów do “rozwiązywania” i “redukowania” różnego typu równań i nierówności. Należy od razu zauważyć, że mówiąc o “rozwiązywaniu”, mamy tu na myśli poszukiwanie dokładnych rozwiązań, a nie rozwiązań przybliżonych. W tym sensie rozwiązaniami równania KN1_wstep_i_przeglad_3.gifKN1_wstep_i_przeglad_4.gif i KN1_wstep_i_przeglad_5.gif:

KN1_wstep_i_przeglad_6.gif

KN1_wstep_i_przeglad_7.gif

a nie ich wartości przybliżone. Mathematica zawiera oczywiście także funkcje służące do rowiązywania równań metodami numerycznymi, np.:

KN1_wstep_i_przeglad_8.gif

KN1_wstep_i_przeglad_9.gif

KN1_wstep_i_przeglad_10.gif

KN1_wstep_i_przeglad_11.gif

ale na razie nie będziemy się nimi zajmowali. Warto zauważyć, że fakt, iż Solve i Reduce dają “dokładne” rozwiązania nie oznacza, że używają one wyłącznie symbolicznych metod. Jednym z najbardziej interesujących zjawisk w nowoczesnej “algeberze komputerowej” jest integracja obliczeń symbolicznych i numerycznych, która doprowadziła do powstania tak zwanych metod symboliczno-numerycznych (symbolic-numeric computation). Tradycyjnie metody symboliczne prowadziły do dokładnych wyników, ale kosztem dużej złożoności czasowej oraz pamięciowej obliczeń, podczas gdy dużo szybsze metody numeryczne zwracały tylko przybliżone rozwiązania problemów. Nowe metody, łączące obie powyższe, są szybsze i wymagają mniej pamięci od metod czysto symbolicznych, a jednocześnie dają dokładne wyniki (w sensie, który będzie opisany ponizej). Odgrywają one kluczową rolę w niektórych najciekawszych i najbardziej zaskakujących możliwościach funkcji Reduce i Solve.

We wcześniejszych niż 8. wersjach Mathematiki funkcje Reduce i Solve różniły się od siebie zarówno formatem wyników, jak i rodzajem problemów, do których mogły być stosowane. Funkcja Solve rozwiązywała w zasadzie tylko równania algebraiczne (wielomianowe), natomiast funkcja Reduce “redukowała” równania i nierówności każdego typu, dla którego Mathematica potrafiła znaleźć rozwiązanie dokładne i pełne. W wersji 8. różnice między tymi funkcjami są już znacznie mniejsze, ponieważ Solve zaczęła używać wielu metod, które dawniej używane były tylko przez Reduce. W dalszej części tego przeglądu będziemy używali głównie funkcji Reduce, zwróćmy jednak uwagę na jedną przewagę funkcji Solve w stosunku do funkcji Reduce - może ona zwracać rozwiązania częściowe problemu, gdy tymczasem Reduce zwraca jedynie pełne rozwiązania. Aby zilustrować to, rozważmy skomplikowane równanie niealgebraiczne:

KN1_wstep_i_przeglad_12.gif

Widzimy od razu, że jeden pierwiastek (x1) można znaleźć bardzo łatwo i rzeczywiście funkcja Solve nie ma z tym problemu:

KN1_wstep_i_przeglad_13.gif

KN1_wstep_i_przeglad_14.gif

KN1_wstep_i_przeglad_15.gif

Funkcja Solve znalazła ten oczywisty pierwiastek oraz poinformowała nas, że rozwiązanie nie jest pełne, sugerując użycie funkcji Reduce w celu jego uzupełnienia. Niestety ta porada okazuje się tym razem nieskuteczna:

KN1_wstep_i_przeglad_16.gif

KN1_wstep_i_przeglad_17.gif

KN1_wstep_i_przeglad_18.gif

Funkcja Reduce zwróciła informację, że zadanego równania nie da się w pełni rozwiązać metodami używanymi przez Reduce. Nie ma w tym nic dziwnego, ponieważ to równanie ma nieskończenie wiele pierwiastków, a funkcja Reduce nie zwraca żadnych rozwiązań, jeśli nie może zwrócić wszystkich. Jeśli jednak ograniczymy się tylko do skończonego przedziału liczb rzeczywistych, to Reduce znajdzie wszystkie pierwiastki,np.

KN1_wstep_i_przeglad_19.gif

KN1_wstep_i_przeglad_20.gif

Nie będziemy w tym momencie próbowali tłumaczyć dokładnie, co oznacza powyższy zapis, ale zauważmy, że:
1. Funkcja Reduce znalazła 9 pierwiastków leżących pomiędzy liczbami -5 i 5.
2. Jest to pełne rozwiązanie problemu - można je traktować jako dowód, że istnieje dokładnie 9 takich pierwiastków.
3. Odpowiedź jest podana w formie sumy logicznej równań elementarnych (a nie listy reguł, jak w przypadku Solve) - to znaczy, że równanie zostało zredukowane, co jest zgodne z nazwą funkcji.

Wróćmy na razie do bardziej podstawowych równań - równań wielomianowych. Zacznijmy od równania trzeciego stopnia, które Mathematica potrafi rozwiązać przy pomocy sławnej formuły del Ferro z szesnastego wieku (często nazywanej formułą Tartaglii):

KN1_wstep_i_przeglad_21.gif

KN1_wstep_i_przeglad_22.gif

Możemy ograniczyć poszukiwania pierwiastków np. tylko do tych, które są rzeczywiste:

KN1_wstep_i_przeglad_23.gif

KN1_wstep_i_przeglad_24.gif

Tym razem otrzymaliśmy dokładnie jeden taki pierwiastek. Możemy zapisać go również w postaci dziesiętnej z dowolną precyzją, na przykład do 30. miejsca po przecinku:

KN1_wstep_i_przeglad_25.gif

KN1_wstep_i_przeglad_26.gif

Ze sławnych twierdzeń Abela i Galois wiadomo, że rowiązań tego typu (wyrażonych za pomocą pierwiastników - czyli wyrażeń skonstruowanych z wykorzystaniem operacji arytmetycznych dodawania, odejmowania, mnożenia, dzielenia oraz potęg wymiernych) nie można podać dla ogólnych równań stopnia co najmniej 5. Oczywiście Mathematica potrafi rozwiązać takie równania dokładnie:

KN1_wstep_i_przeglad_27.gif

KN1_wstep_i_przeglad_28.gif

Każdy z pierwiastków opisany jest powyżej przez dwa parametry: swój wielomian minimalny (wielomian najniższego stopnia o całkowitych współczynnikach, którego pierwiastkiem jest między innymi on sam) oraz liczbę naturalną pomiędzy jedynką a stopniem wielomianu, która odpowiada pewnemu uporządkowaniu pierwiastków. To uporządkowanie jest nietrywialnym rezultatem algorytmu zwanego “izolacją pierwiastków”. Po izolacji pierwiastków możemy obliczyć je z dokładnością do dowolnego miejsca po przecinku:

KN1_wstep_i_przeglad_29.gif

KN1_wstep_i_przeglad_30.gif

Reduce można używać też do rozwiązywania problemów całkowicie symbolicznych. Na przykład możemy łatwo uzyskać znany warunek na to, żeby równanie kwadratowe KN1_wstep_i_przeglad_31.gif miało dwa jednakowe pierwiastki:

KN1_wstep_i_przeglad_32.gif

KN1_wstep_i_przeglad_33.gif

Powyższe wzory zna prawie każdy jeszcze z algebry szkolnej, ale już dla równania 3. stopnia uzyskanie podobnego wyniku nie jest takie łatwe:

KN1_wstep_i_przeglad_34.gif

KN1_wstep_i_przeglad_35.gif

Spróbujmy teraz rozwiązać równanie trygonometryczne. Na początek ograniczmy się do skończonego przedziału, na którym to równanie ma skończenie wiele pierwiastków:

KN1_wstep_i_przeglad_36.gif

KN1_wstep_i_przeglad_37.gif

Dodana na końcu funkcja FullSimplify służy do upraszczania odpowiedzi. Proponujemy sprawdzić, co się stanie, jeśli nie wpiszemy tej komendy.

Następnie rozwiążmy (lub raczej zredukujmy) powyższe równanie trygonometryczne na całej osi rzeczywistej:

KN1_wstep_i_przeglad_38.gif

KN1_wstep_i_przeglad_39.gif

Spróbujemy teraz zająć się czymś dużo trudniejszym: równaniem, którego na pierwszy rzut oka nie da się rozwiązać. Ograniczymy się do rozwiązań leżących wewnątrz okręgu o promieniu 1 i środku w 0.

KN1_wstep_i_przeglad_40.gif

KN1_wstep_i_przeglad_41.gif

Powyższe rozwiązanie może sprawiać wrażenie rozwiązania przybliżonego, ale w rzeczywistości jest ono “dokładne”. Można je obliczyć z dowolną precyzją:

KN1_wstep_i_przeglad_42.gif

KN1_wstep_i_przeglad_43.gif

Możemy także udowodnić, że nasze równanie nie ma rozwiązań rzeczywistych:

KN1_wstep_i_przeglad_44.gif

KN1_wstep_i_przeglad_45.gif

Tak jak stwierdziliśmy na początku tej sekcji - funkcja Reduce potrafi rozwiązać wiele równań i  nierówności przeróżnego typu. Kolejnym przykładem jest równanie w dziedzinie liczb całkowitych:

KN1_wstep_i_przeglad_46.gif

KN1_wstep_i_przeglad_47.gif

Następne przykłady są zaczerpnięte z internetowego forum MathGroup. Najpierw zacytujemy pytanie wysłane w styczniu 2011 roku przez Iwana Smirnowa:

“Czy istnieją nietrywialne rozwiązania równania diofantycznego:

KN1_wstep_i_przeglad_48.gif

gdzie, jak zawsze w równaniach diofantycznych, rozwiązania powinny być liczbami całkowitymi?”

Odpowiedź na to pytanie nie jest znana i Mathematica także nie potrafi tego problemu rozwiązać. Bardzo łatwo można jednak za jej pomocą udowodnić, że nie istnieją rozwiązania dla KN1_wstep_i_przeglad_49.gif:

KN1_wstep_i_przeglad_50.gif

KN1_wstep_i_przeglad_51.gif

Dodana na końcu funkcja Timing powoduje, że wraz z rozwiązaniem problemu zwracany jest czas, który był potrzebny na jego obliczenie. Oczywiście ten czas jest zależny od szybkości danego komputera (poza jakością algorytmu).

Zmieniając niektóre domyślne parametry Mathematiki, można łatwo udowodnić, że nie istnieją rozwiązania nietrywialne również dla KN1_wstep_i_przeglad_52.gif.

Programowanie

W poprzedniej sekcji rozważaliśmy problemy, które można rozwiązać za pomocą jednej wbudowanej funkcji Mathematiki (Reduce). Oczywiście z wieloma napotykanymi przez nas problemami nie da się w ten sposób sobie poradzić. W takich sytuacjach często jedynym wyjściem jest samodzielne napisanie odpowiedniego programu. Poniższy przykład pochodzi znowu z forum MathGroup:

“Znajdź wszystkie trójki różnych dwucyfrowych liczb pierwszych takie, że
i) średnia każdej pary liczb w trójce jest liczbą pierwszą;
ii) średnia wszystkich trzech liczb jest liczbą pierwszą.”

Kod rozwiązujący ten problem można napisać w Mathematice na wiele sposobów. Oto jeden z nich:

KN1_wstep_i_przeglad_53.gif

KN1_wstep_i_przeglad_54.gif

Dokładne wytłumaczenie tego kodu wymaga znacznie większej wiedzy o programowaniu w Mathematice niż możemy zakładać w tym momencie. Na razie chcemy zwrócić uwagę na użycie całego szeregu wbudowanych funkcji, które w tradycyjnych językach programistycznych wymagałyby osobnego zakodowania. W pierwszej linii, za pomocą wbudowanych funkcji Select oraz PrimeQ, wybieramy wszystkie liczby pierwsze z listy liczb dwucyfrowych. W drugiej linii tworzymy listę wszyskich trójek dwucyfrowych liczb pierwszych. Następnie w trzeciej linii usuwamy z tej listy “powtórki”, ażeby wreszcie w ostatniej linii z trójek, które nam pozostały, wybrać te, które spełniają warunki zadania.
Oczywiście można wykonać tę sekwencję operacji bez używania pomocniczych list ls1, ls2 i ls3, zapisując wszystko w jednej linii. Jednak dla wielu osób
kod napisany w ten sposób jest mniej czytelny:

KN1_wstep_i_przeglad_55.gif

Jest to tzw. “jednoliniowiec”. Jednoliniowce mają również swoich wielbicieli - co roku odbywa się nawet konkurs na najbardziej intrygującego jednoliniowca (notatniki z konkursu w roku 2012 można znaleźć tutaj:  https://www.wolfram.com/training/special-event/mathematica-experts-live-one-liner-competition-2012/ ). Jakkolwiek dla zwykłych śmiertelników dłuższa wersja kodu, używająca zmiennych pomocniczych i operacji przypisywania, jest prawdopodobnie łatwiejsza do odczytania i zrozumienia.

Przeanalizujmy jeszcze jeden przykład zadania zaczerpnięty z forum MathGroup:

“Jaki jest najprostszy sposób znalezienia długości najkrótszego cyklu powtarzającego się w rozwinięciu dziesiętnym ułamka? Na przykład 1/7 = 0,14285714285714285714, zatem długość cyklu (142857) wynosi 6.”

I w tym przypadku, poza wiedzą matematyczną, bardzo przydaje się dobra znajomość wbudowanych funkcji, żeby napisać wydajny kod w Mathematice. Nie istnieje jedna wbudowana funkcja, która bezpośrednio dawałaby odpowiedź na nasz problem, ale znajdujemy dwie funkcje blisko z nim związane: IntegerExponent i MultiplicativeOrder. Używając ich obu jednocześnie, możemy obliczyć poszukiwaną długość cyklu:

KN1_wstep_i_przeglad_56.gif

Teraz widzimy, że:

KN1_wstep_i_przeglad_57.gif

KN1_wstep_i_przeglad_58.gif

napisana przez nas funkcja daje poprawną odpowiedź.

Jedną z przyczyn, dla których dobra znajomość wbudowanych funkcji jest tak bardzo ważna w programowaniu w Mathematice, jest fakt, że takie funkcje działają dużo szybciej niż równoważne im funkcje napisane samodzielnie przez użytkowników w Mathematice, a równie szybko lub nawet szybciej niż podobne funkcje napisane w kompilowanych językach, takich jak C. Na szczęście także napisane przez siebie funkcje w Mathematice możemy znacznie przyspieszyć, poprzez tak zwaną kompilację. Poniżej podajemy przykład programu, który bez kompilacji działa dosyć wolno, ale ta bardzo mocno go przyspiesza. Służy on do konstrukcji spirali Ulama <http://mathworld.wolfram.com/PrimeSpiral.html> i jest autorstwa Daniela Lichtblau z Wolfram Reseach:

KN1_wstep_i_przeglad_59.gif

Stworzenie spirali z 60.000 punktów zajmuje tylko ułamek sekundy:

KN1_wstep_i_przeglad_60.gif

KN1_wstep_i_przeglad_61.gif

Otrzymaną spiralę możemy przedstawić graficznie na kilka sposobów - np. jako zbiór punktów, używając funkcji ListPlot:

KN1_wstep_i_przeglad_62.gif

KN1_wstep_i_przeglad_63.gif

czy jako zbiór linii, używając funkcji ListLinePlot:

KN1_wstep_i_przeglad_64.gif

KN1_wstep_i_przeglad_65.gif

W Mathematice 8 i 9 ten kod może być przyspieszony jeszcze bardziej przez zastosowanie dla funkcji Compile opcji CompilationTarget"C". Żeby ta operacja była skuteczna, trzeba mieć jednak zainstalowany na komputerze odpowiedni kompilator języka C.  

Wyspecjalizowane funkcje matematyczne - przykłady ze statystyki i matematyki finansowej

Poza dość ogólnymi funkcjami matematycznymi, takimi jak Reduce, Mathematica posiada także wiele wyspecjalizowanych funkcji przydatnych w konkretnych działach matematyki, zarówno czystej, jak i stosowanej. Niektóre z nich znajdują się w osobnych pakietach, które przed użyciem trzeba oddzielnie wczytać do Mathematiki. Tak jest np. w przypadku funkcji do Analizy Wariancji (ANOVA), która jest w osobnym pakiecie ANOVA. Zauważmy, że w samej Mathematice nie ma takiej funkcji:

KN1_wstep_i_przeglad_66.gif

KN1_wstep_i_przeglad_67.gif

Wczytamy teraz pakiet ANOVA:

KN1_wstep_i_przeglad_68.gif

Zwróćmy uwagę na to, że ostatni symbol przed zamknięciem cudzysłowa to grawis: `.
Po wczytaniu pakietu funkcja ANOVA będzie już działać:

KN1_wstep_i_przeglad_69.gif

KN1_wstep_i_przeglad_70.gif

Funkcje zawarte w pakietach są tego samego typu, co te napisane przez użytkowników (faktycznie każdy może tworzyć własne pakiety złożone z napisanych przez siebie funkcji i następnie wczytywać je do Mathematiki). Funkcje z pakietów są więc powolniejsze od funkcji wbudowanych. W wielu przypadkach funkcje zawarte w pakietach automatycznie dołączonych do Mathematiki (http://reference.wolfram.com/mathematica/guide/StandardExtraPackages.html)
po dalszej optymalizacji pojawiają się w kolejnych wersjach Mathematiki już jako funkcje wbudowane.

Jedną z bardziej interesujących “niematematycznych” funkcji wbudowanych jest funkcja FinancialData, która pobiera dane bezpośrednio z giełd amerykańskich (do działania tej funkcji konieczne jest połączenie z internetem). Pobierzmy dla przykładu listę cen akcji firmy Apple od 1. stycznia 2007 roku:

KN1_wstep_i_przeglad_71.gif

Teraz możemy narysować wykres tych danych za pomocą wbudowanej funkcji DateListPlot:

KN1_wstep_i_przeglad_72.gif

Graphics:Apple

Zamiast samych cen często bada się zwroty (logarytmiczne). Można je oczywiście obliczyć, używając otrzymanych wcześniej cen, ale da się także pobrać je bezpośrednio przy pomocy funkcji FinancialData. Tym razem pobierzemy dane dla indeksu Standard & Poor 500:

KN1_wstep_i_przeglad_74.gif

Przyjrzyjmy się kilku pierwszym wyrazom z listy “returns”:

KN1_wstep_i_przeglad_75.gif

KN1_wstep_i_przeglad_76.gif

Widzimy, że “returns” jest listą par o formacie {data, zwrot}. Do dalszej analizy użyjemy tylko wartości zwrotów:

KN1_wstep_i_przeglad_77.gif

Użyjemy teraz wbudowanej funkcji SmoothKernelDistribution do estymacji rozkładu zwrotów, a następnie narysujemy wykres wyestymowanej gęstości zwrotów:

KN1_wstep_i_przeglad_78.gif

KN1_wstep_i_przeglad_79.gif

KN1_wstep_i_przeglad_80.gif

Jaki rozkład statystyczny najlepiej opisuje zachowanie się indeksu? Wypróbujmy najpierw rozkład normalny, który dominował w tego typu modelowaniu przed kryzysem finansowym w 2008 roku. W Mathematice takie obliczenia są bardzo łatwe do wykonania:

KN1_wstep_i_przeglad_81.gif

KN1_wstep_i_przeglad_82.gif

Sprawdźmy, jak dobrze rozkład normalny o powyższych parametrach pasuje do danych empirycznych:

KN1_wstep_i_przeglad_83.gif

KN1_wstep_i_przeglad_84.gif

Wynik naszego eksperymentu raczej nie jest satysfakcjonujący - dwa wykresy na rysunku powyżej wyraźnie się od siebie różnią. Sprawdźmy zatem inny rozkład. Skądinąd wiemy, że zwroty indeksu S&P 500 są dobrze opisywane przez rozkład Meixnera (który odpowiada modelowi cen akcji opartemu na pewnym procesie skokowym zwanym procesem Meixnera). Przetestujmy tę hipotezę:

KN1_wstep_i_przeglad_85.gif

KN1_wstep_i_przeglad_86.gif

KN1_wstep_i_przeglad_87.gif

KN1_wstep_i_przeglad_88.gif

Na powyższym rysunku wyraźnie widać, że rozkład Meixnera dużo lepiej modeluje zwroty S&P 500 niż rozkład normalny.

Grafika i interaktywna “Dynamika”

Mathematica nie była pierwszym programem do “matematyki komputerowej” (zwanej także algebrą komputerową), ale kiedy pojawiła się w roku 1988, odróżniała się od innych tego typu programów dużo większymi możliwościami graficznymi, szczególnie w grafice trójwymiarowej. Dwadzieścia pięć lat później Mathematica nadal wybija się pod względem możliwości w zakresie tradycyjnej grafiki, ale od wersji 6 posiada także inne funkcjonalności jeszcze lepiej odpowiadające “duchowi XXI wieku”. Najważniejszą z nich jest możliwość (łatwego) tworzenia interaktywnych programów wykonujących obliczenia, w których można zmieniać parametry za pomocą elementów interfejsu graficznego, takich jak menu, suwaki, przyciski itp. Programy dynamiczne nie muszą zawierać grafiki, ale najczęściej używane są do tworzenia “interaktywnych animacji graficznych”, różniących się od tradycyjnych animacji (w których Mathematica oczywiście także dobrze sobie radzi) większą kontrolą daną użytkownikowi. Cała ta funkcjonalność jest oparta na funkcji Dynamic:

KN1_wstep_i_przeglad_89.gif

KN1_wstep_i_przeglad_90.gif

Do większości celów wystarcza prostsza funkcja Manipulate (która sama jest skonstruowana za pomocą Dynamic). Obie te funkcje będą dokładnie omówione w osobnym rozdziale dotyczącym grafiki.

Format CDF , CDF Player i Projekt Demonstracji Wolframa.

Wraz z wersją 8 pojawił się nowy format plików Mathematiki: CDF, czyli Computable Document Format. To nie przypadek, że nazwa przypomina popularny PDF (Portable Document Format). Podobnie jak w przypadku PDF, pliki CDF można “odczytywać”, używając darmowego programu (CDF Playera, odgrywającego podobną rolę do Adobe Readera), ale do ich tworzenia potrzebna jest jedna z kilku istniejących komercyjnych wersji Mathematiki. Zasadniczą różnicą między CDF Playerem i Adobe Readerem jest to, że o ile ten drugi jest w zasadzie przeznaczony do posługiwania się statycznymi dokumentami, to w tym pierwszym możemy wykonać wszystko to, co potrafi wykonać Mathematica, czyli obliczenia symboliczne i numeryczne, interaktywną grafikę, dźwięk itp. Jedyną rzeczą, której CDF Player nie potrafi, jest niezależne programowanie. Innymi słowy, użytkownik CDF Playera ma dostęp tylko do tych funkcji, które wykorzystał w danym pliku CDF jego twórca, oraz może zmieniać argumenty i parametry tych funkcji tylko poprzez interfejs stworzony przez twórcę pliku.

Stąd można ściągnąć Wolfram CDF Player

CDF Player pozwala na proste używanie wszystkich zasobów Mathematiki przez osoby nie znające jej języka programistycznego i nawet nie posiadające Mathematiki. Jest on szczególnie pożyteczny w połączeniu z Projektem Demonstracji Wolframa: http://demonstrations.wolfram.com.
Na tej stronie można znaleźć tysiące interaktywnych programów ilustrujących twierdzenia, dowody, eksperymenty itp. z różnych dziedzin matematyki, nauk przyrodniczych i społecznych, a także można znaleźć sztukę, gry itp. Wszytkie pliki są w formacie CDF, a więc można ich w pełni używać przy pomocy tylko CDF Playera. Projekt zawiera także kod źródłowy wszystkich demonstracji, który można pobrać i swobodnie modyfikować. Dla osób mających dostęp do Mathematiki jest to doskonała metoda nauczenia się zaawansowanych technik programowania.

Wolfram Alpha i “swobodna forma”

Wolfram Alpha - Mathematica dla każdego!   

Pojawienie się Wolfram | Alpha skupiło na sobie sporo uwagi medialnej, ale stosunkowo niewiele osób zdaje sobie sprawę z tego, że Wolfram | Alpha jest oparty na Mathematice i, w rezultacie, dostarcza szerokiemu gronu użytkowników możliwość darmowego dostępu do dużej części funkcjonalności Mathematiki. Co więcej, ten sposób używania Mathematiki nie wymaga nauczenia się składni języka ani nawet znajomości istniejących funkcji i ich nazw. Najbardziej znaną zaletą Wolfram | Alpha jest możliwość używania “swobodnej formy” języka, włącznie z formułami matematycznymi. Zasada jest prosta: wpisz swoje pytanie, używając zwykłego języka angielskiego (w przyszłości planowana jest możliwość używania również innych języków), a Wolfram | Alpha spróbuje zgadnąć, o co chodzi i dostarczyć Tobie odpowiedzi przy pomocy Mathematiki (i nie tylko). Odpowiedzi dawane przez Wolfram | Alpha są dużo obszerniejsze niż te, które daje sama Mathematica, co oczywiście wynika z faktu, że “swobodna forma” Wolfram |Alpha jest o wiele mniej precyzyjna od form wejściowych Mathematiki.
Zobaczmy to na przykładzie obliczania funkcji pierwotnej (całki nieokreślonej)  ∫x log(x)dx. Zaczniemy od “normalnej” Mathematiki:

KN1_wstep_i_przeglad_91.gif

KN1_wstep_i_przeglad_92.gif

Teraz użyjemy Wolfram | Alpha. Większość osób robi to oczywiście online, wchodząc na stronę http://www.wolframalpha.com, ale użytkownicy Mathematiki mogą zrobić dokładnie to samo, bezpośrednio używając Mathematiki (oczywiście w tym wypadku konieczne jest połączenie z Internetem), za pomocą funkcji WolframAlpha:

KN1_wstep_i_przeglad_93.gif

Widzimy, że otrzymaliśmy dużo więcej informacji niż tylko te, o które nam chodziło. Intersującym i pożytecznym faktem jest to, że Wolfram | Alpha “rozumie” także normalną składnię Mathematiki. Na przykład ewaluując wyrażenie WolframAlpha[Integrate[x Log[x],x]], uzyskamy dokładnie taki sam wynik jak powyżej.

Na koniec tego rozdziału warto zauważyć, że sama Mathematica także pozwala używać “swobodnej formy” formuł wejściowych. Aby użyć tej funkcjonalności, zaczynamy formułę od symbolu “=”, po czym piszemy “swobodnie”, np.:

KN1_wstep_i_przeglad_95.gif

KN1_wstep_i_przeglad_96.gif

Jak widzimy, Mathematica skutecznie rozpoznała, o co nam chodziło i podała dokładne rozwiązanie bez zbytecznych dodatkowych informacji.

Podstawy Języka

Spis treści

Wstęp i przegląd

Podstawowe informacje o Mathematice

Czym jest Mathematica?

Portal Wolfram Research i związane z nim projekty

Mathworld

Wolfram Alpha

Wolfram Demonstrations Project

Program edukacyjny

The Mathematica Journal

Inne strony związane z Mathematicą

Mathics

Wybrane przykłady możliwości Mathematiki

Wbudowane funkcje

Programowanie

Wyspecjalizowane funkcje

Grafika i interaktywna “Dynamika”

Format CDF, CDF Player i Projekt Demonstracji Wolframa.

Wolfram Alpha i “swobodna forma”

1. Wstęp i przegląd

W XXI stuleciu komputery bardzo istotnie zmieniają wszystkie aspekty naszego życia. Zmieniają również matematykę - zarówno sposób jej uprawiania, jak i rodzaj problemów, które nas interesują. Dzięki możliwości wykonywania obliczeń o wiele bardziej skomplikowanych niż to było wyobrażalne bez pomocy współczesnego sprzętu, dla każdego człowieka wyposażonego w komputer, odpowiednie oprogramowanie i trochę wiedzy matematycznej otworzyły się dawniej nieosiągalne rejony badań. Powstały potężne programy, które wspierają badania we wszystkich dziedzinach matematyki obliczeniowej:  manipulacji symbolicznej, obliczeniach numerycznych i wizualizacji (włącznie z interaktywną wizualizacją). Jednym z czołowych programów tego typu jest Mathematica firmy Wolfram Research. Mathematica jest doskonałym narzędziem do studiowania nowych działów matematyki obliczeniowej, ale także może być bardzo pomocna w badaniu tych bardziej tradycyjnych działów. Celem wstępnego rozdziału jest zademonstrowanie niektórych możliwości tego niezwykłego programu jakim jest Mathematica. Aby go osiągnąć, użyliśmy szeregu przykładów, z których część przygotowaliśmy sami, niektóre są zapożyczone z oficjalnej dokumentacji Mathematiki, a jeszcze inne są zebrane z różnych ogólnodostępnych źródeł w internecie.

Podstawowe informacje o Mathematice

Czym jest Mathematica?

Mathematica jest jednym z najpotężniejszych i najbardziej zaawansowanych systemów do symbolicznych i numerycznych obliczeń oraz wizualizacji. Jest nawet czymś więcej. Początkowo Wolfram Research opisywał Mathematikę jako “system do matematyki komputerowej”, ale później rozwinął ten opis do “jedynej platformy deweloperskiej w pełni integrującej obliczenia w pełne przepływy pracy” (“the only development platform fully integrating computation into complete work-flows”). Innymi słowy, w wizji Wolfram Research Mathematica ma być uniwersalnym narzędziem programistycznym, w którym wszelkiego rodzaju obliczenia, także symboliczne, są integralną częścią systemu.

Przykładem tego jest fakt, że Mathematica jest bardzo zaawansowanym narzędziem typograficznym. Za jej pomocą można tworzyć dokumenty matematyczne o jakości porównywalnej zKN1_wstep_i_przeglad_1.gif-em. Dokumenty te mają jednak jeszcze dodatkową zaletę, której brak KN1_wstep_i_przeglad_2.gif-owi  - mogą zawierać “żywe” formuły matematyczne i “żywą” grafikę, które po zmianie parametrów czy innych danych automatycznie są przeliczane i obiekty wizualne są rerenderowane. Dokumenty zawierające interaktywne obliczenia mogą być wysłane do innej osoby - np. współpracownika, studenta lub profesora - która może zmieniać parametry i wykonywać własne obliczenia, nawet niekoniecznie posiadając program Mathematica lub umiejętność jego obsługiwania. W pewnym sensie jeszcze dalej idącym rozwinięciem tej idei jest działający online program Wolfram|Alpha, którego “motorem” jest Mathematica.

Pod względem całego spektrum możliwości nie istnieje dziś narzędzie, które mogłoby konkurować z Mathematiką. Jeśli jednak ograniczymy się tylko do obliczeń pewnego typu, np. z dziedzin teorii grup, algebry przemiennej czy numeryki, to trzeba przyznać, że istnieją specjalistyczne programy (np. MAGMA, Singular, Macauley2, MatLab) potrafiące wykonywać niektóre obliczenia, które w Mathematice nie są zaimplementowane i wymagają samodzielnego programowania (co zwykle wiąże się z tym, że poźniej wolniej się wykonują). Jako program matematyczny, Mathematica jest programem przeznaczonym do celów ogólnych. Jest przygotowana do wykonywania zarówno symbolicznych, jak i numerycznych obliczeń. Posiada bardzo wiele wyspecjalizowanych funkcji z różnych działów matematyki (np. algebry wielomianowej, teorii grafów, równań różniczkowych, teorii prawdopodobieństwa, statystyki, matematyki finansowej itp.) oraz pokrewnych nauk (np. cyfrowe przetwarzanie obrazów, cyfrowe przetwarzanie sygnałów itp.). Tym, co ją najbardziej odróżnia od innych programów matematycznych, jest niezwykle rozwinięty język programistyczny, który daleko wykracza zasięgiem poza zastosowania w obliczeniach.

Portal Wolfram Research i związane z nim projekty

Wolfram Research posiada wiele stron internetowych związanych z Mathematiką i spokrewnionymi projektami. Główna strona, z aktualnymi informacjami, pożytecznymi programami, dodatkami, centrum edukacji oraz dokumentacją to www.wolfram.com. Z tej strony można także pobrać darmowy CDF-Player, tysiące demonstracji z kodem źródłowym i edukacyjne filmy.

Mathworld  <http://mathworld.wolfram.com/>

MathWorld jest bardzo pożytecznym i obszernym źródłem informacji z różnych dziedzin matematyki, zawierającym definicje, twierdzenia, przykłady itp. Często są one ilustrowane w załączonych plikach w formacie Mathematiki.

Wolfram Alpha  <http://www.wolframalpha.com/>

Wolfram Alpha - Mathematica (i więcej!) dla każdego!

Wolfram Demonstrations Project <http://demonstrations.wolfram.com>

Projekt zawiera ogromną liczbę interaktywnych demonstracji z różnych dziedzin nauki i sztuki, w tym bardzo wiele z matematyki, a także gry itp. Każdą demonstrację można pobrać w formie interaktywnego pliku CDF, a następnie w pełni używać przy pomocy darmowego CDF Playera (oczywiście niepotrzebnego osobom posiadającym najnowszą wersję Mathematiki). Bardzo pożyteczną rzeczą jest również dostępność kodu źródłowego każdej demonstracji. Może on być pobrany i swobodnie modyfikowany przez każdego, kto ma dostęp do Mathematiki (sam CDF Player nie nadaje się już do tego celu). Uważne studiowanie i modyfikowanie kodu demonstracji jest jedną z najlepszych metod nauczenia się programowania w Mathematice.

Program edukacyjny

Wolfram Research prowadzi ekstensywny program edukacyjny. Aby się zarejestrować i uczestniczyć w seminariach online Wolfram Educational Group (WEG), należy wejść na stronę:
<http://www.wolfram.com/services/education/calendar.cgi>
Na świecie, w tym także w Polsce, jest organizowanych wiele konferencji różnego typu poświęconych Mathematice i jej zastosowaniom. ICM (Centrum Interdyscyplinarne) prowadzi kursy wprowadzające do Mathematiki na Uniwersytecie Warszawskim.

The Mathematica Journal

The Mathematica Journal <http://www.mathematica-journal.com/> jest publikacją online poświęconą zastosowaniom Mathematiki w pracy badawczej i dydaktycznej.

Inne strony związane z Mathematicą

Doskonałym i darmowym wstępem do programowania w Mathematice jest książka Leonida Shifrina:
http://www.mathprogramming-intro.org/

Także Mathematica Guidebooks <http://www.mathematicaguidebooks.org/index.shtml> dostarczają bogatego zbioru przykładów spektakularnych zastosowań Mathematiki, szczególnie w fizyce, ale również w innych dziedzinach. Niestety  “Guidebooks” nie są w pełni kompatybilne z nowszymi wersjami Mathematiki (późniejszymi niż 5), więc najlepiej nadają się dla doświadczonych użytkowników programu, którzy samodzielnie potrafią dokonać koniecznych zmian w kodzie programów.

Jednym z najlepszych sposobów na zostanie ekspertem w Mathematice jest udział w grupie dysusyjnej zwanej MathGroup:
http://groups.google.com/group/comp.soft-sys.math.mathematica/topics?pli=1
Można tu zadawać pytania dotyczące każdego aspektu Mathematiki i otrzymywać wiele, często bardzo różnorodnych, odpowiedzi od ekspertów, włącznie z pracownikami Wolfram Research. Chociaż to forum nie służy z założenia temu celowi, czasem można tu nawet dostać rozwiązanie zadania matematycznego.

Podobny cel, choć w nieco inny sposób, jest realizowany przez stronę Mathematiki na Stack Exchange:
http://mathematica.stackexchange.com
Tak jak inne strony Stack Exchange, ta również nie jest tradycyjną “grupą dyskusyjną” jak MathGroup. Tutaj użytkownicy zadając pytania i odpowiadając na pytania innych użytkowników, zdobywają za to “punkty statusowe” (można również otrzymać punkty ujemne), “przywileje” i “odznaki” (badges).

Wielu ekspertów w Mathematice, włącznie z pracownikami Wolfram Research, wypowiada się także na forum Stack Exchange. Główną jego przewagą nad MathGroup jest znacznie nowocześniejszy interfejs - na przykład można tu łatwo umieszczać grafikę i formuły matematyczne (MathGroup zezwala tylko na posty w formacie ASCII). Trzeba jednak pamiętać, że tematyka Stack Exchange jest bardziej ograniczona i dotyczy niemal wyłącznie aspektów programistycznych.

Mathics

Dla tych, którzy nie mają dostępu do Mathematiki, a dla których Wolfram|Alpha nie jest wystarczający - na przykład dla osób chcących samodzielnie programować - dobrą alternatywą jest:
http://www.mathics.org
Mathics jest darmowym systemem do obliczeń i programowania używającym tej samej składni co Mathematica. Zawiera on co prawda tylko bardzo niewielki podzbiór funkcji matematycznych dostępnych w Mathematice, ale dobrze nadaje się do ćwiczenia języka programistycznego. W pewnym sensie Mathics i Wolfram|Alpha uzupełniają się: Wolfram|Alpha ma dostęp do prawie wszystkich zaawansowanych funkcji matematycznych Mathematiki, ale nie można w nim programować - za to w Mathics można programować, używając tego samego języka co w Mathematice, ale liczba wbudowanych funkcji jest ograniczona (niektóre bardziej zaawansowane opierają się na innym darmowym programie Sage).

Oczywiście naszym celem nie było opisanie wszystkich zasobów wiedzy i materiałów związanych z Mathematiką dostępnych w internecie. Byłoby to zadanie niemożliwe do wykonania nie tylko z powodu wielkiej ilości już istniejących stron i portali, ale także dlatego, że ich liczba ciągle się zwiększa. Tym niemniej mamy nadzieję, że informacje zamieszczone powyżej będą pomocne dla każdego pragnącego zdobyć podstawową wiedzę o Mathematice, a także dla osób, które już taką wiedzę posiadają, ale chcą zwiększyć swoje umiejętności w zakresie używania tego programu.

Wybrane przykłady możliwości Mathematiki

Wbudowane funkcje

Wiele zadań, także tych wziętych “z życia”, można rozwiązać, używając funkcji, które są “wbudowane” w Mathematice (słowo “funkcja” użyte w tym kontekście ma nieco inne znaczenie niż to znane z matematyki). Takich funkcji jest do naszej dyspozycji ogromna liczba. Wśród nich jednymi z najpożyteczniejszych są Solve i Reduce - są to bardzo ogólne funkcje korzystające z dużej ilości zaawansowanych algorytmów do “rozwiązywania” i “redukowania” różnego typu równań i nierówności. Należy od razu zauważyć, że mówiąc o “rozwiązywaniu”, mamy tu na myśli poszukiwanie dokładnych rozwiązań, a nie rozwiązań przybliżonych. W tym sensie rozwiązaniami równania KN1_wstep_i_przeglad_3.gifKN1_wstep_i_przeglad_4.gif i KN1_wstep_i_przeglad_5.gif:

KN1_wstep_i_przeglad_6.gif

KN1_wstep_i_przeglad_7.gif

a nie ich wartości przybliżone. Mathematica zawiera oczywiście także funkcje służące do rowiązywania równań metodami numerycznymi, np.:

KN1_wstep_i_przeglad_8.gif

KN1_wstep_i_przeglad_9.gif

KN1_wstep_i_przeglad_10.gif

KN1_wstep_i_przeglad_11.gif

ale na razie nie będziemy się nimi zajmowali. Warto zauważyć, że fakt, iż Solve i Reduce dają “dokładne” rozwiązania nie oznacza, że używają one wyłącznie symbolicznych metod. Jednym z najbardziej interesujących zjawisk w nowoczesnej “algeberze komputerowej” jest integracja obliczeń symbolicznych i numerycznych, która doprowadziła do powstania tak zwanych metod symboliczno-numerycznych (symbolic-numeric computation). Tradycyjnie metody symboliczne prowadziły do dokładnych wyników, ale kosztem dużej złożoności czasowej oraz pamięciowej obliczeń, podczas gdy dużo szybsze metody numeryczne zwracały tylko przybliżone rozwiązania problemów. Nowe metody, łączące obie powyższe, są szybsze i wymagają mniej pamięci od metod czysto symbolicznych, a jednocześnie dają dokładne wyniki (w sensie, który będzie opisany ponizej). Odgrywają one kluczową rolę w niektórych najciekawszych i najbardziej zaskakujących możliwościach funkcji Reduce i Solve.

We wcześniejszych niż 8. wersjach Mathematiki funkcje Reduce i Solve różniły się od siebie zarówno formatem wyników, jak i rodzajem problemów, do których mogły być stosowane. Funkcja Solve rozwiązywała w zasadzie tylko równania algebraiczne (wielomianowe), natomiast funkcja Reduce “redukowała” równania i nierówności każdego typu, dla którego Mathematica potrafiła znaleźć rozwiązanie dokładne i pełne. W wersji 8. różnice między tymi funkcjami są już znacznie mniejsze, ponieważ Solve zaczęła używać wielu metod, które dawniej używane były tylko przez Reduce. W dalszej części tego przeglądu będziemy używali głównie funkcji Reduce, zwróćmy jednak uwagę na jedną przewagę funkcji Solve w stosunku do funkcji Reduce - może ona zwracać rozwiązania częściowe problemu, gdy tymczasem Reduce zwraca jedynie pełne rozwiązania. Aby zilustrować to, rozważmy skomplikowane równanie niealgebraiczne:

KN1_wstep_i_przeglad_12.gif

Widzimy od razu, że jeden pierwiastek (x1) można znaleźć bardzo łatwo i rzeczywiście funkcja Solve nie ma z tym problemu:

KN1_wstep_i_przeglad_13.gif

KN1_wstep_i_przeglad_14.gif

KN1_wstep_i_przeglad_15.gif

Funkcja Solve znalazła ten oczywisty pierwiastek oraz poinformowała nas, że rozwiązanie nie jest pełne, sugerując użycie funkcji Reduce w celu jego uzupełnienia. Niestety ta porada okazuje się tym razem nieskuteczna:

KN1_wstep_i_przeglad_16.gif

KN1_wstep_i_przeglad_17.gif

KN1_wstep_i_przeglad_18.gif

Funkcja Reduce zwróciła informację, że zadanego równania nie da się w pełni rozwiązać metodami używanymi przez Reduce. Nie ma w tym nic dziwnego, ponieważ to równanie ma nieskończenie wiele pierwiastków, a funkcja Reduce nie zwraca żadnych rozwiązań, jeśli nie może zwrócić wszystkich. Jeśli jednak ograniczymy się tylko do skończonego przedziału liczb rzeczywistych, to Reduce znajdzie wszystkie pierwiastki,np.

KN1_wstep_i_przeglad_19.gif

KN1_wstep_i_przeglad_20.gif

Nie będziemy w tym momencie próbowali tłumaczyć dokładnie, co oznacza powyższy zapis, ale zauważmy, że:
1. Funkcja Reduce znalazła 9 pierwiastków leżących pomiędzy liczbami -5 i 5.
2. Jest to pełne rozwiązanie problemu - można je traktować jako dowód, że istnieje dokładnie 9 takich pierwiastków.
3. Odpowiedź jest podana w formie sumy logicznej równań elementarnych (a nie listy reguł, jak w przypadku Solve) - to znaczy, że równanie zostało zredukowane, co jest zgodne z nazwą funkcji.

Wróćmy na razie do bardziej podstawowych równań - równań wielomianowych. Zacznijmy od równania trzeciego stopnia, które Mathematica potrafi rozwiązać przy pomocy sławnej formuły del Ferro z szesnastego wieku (często nazywanej formułą Tartaglii):

KN1_wstep_i_przeglad_21.gif

KN1_wstep_i_przeglad_22.gif

Możemy ograniczyć poszukiwania pierwiastków np. tylko do tych, które są rzeczywiste:

KN1_wstep_i_przeglad_23.gif

KN1_wstep_i_przeglad_24.gif

Tym razem otrzymaliśmy dokładnie jeden taki pierwiastek. Możemy zapisać go również w postaci dziesiętnej z dowolną precyzją, na przykład do 30. miejsca po przecinku:

KN1_wstep_i_przeglad_25.gif

KN1_wstep_i_przeglad_26.gif

Ze sławnych twierdzeń Abela i Galois wiadomo, że rowiązań tego typu (wyrażonych za pomocą pierwiastników - czyli wyrażeń skonstruowanych z wykorzystaniem operacji arytmetycznych dodawania, odejmowania, mnożenia, dzielenia oraz potęg wymiernych) nie można podać dla ogólnych równań stopnia co najmniej 5. Oczywiście Mathematica potrafi rozwiązać takie równania dokładnie:

KN1_wstep_i_przeglad_27.gif

KN1_wstep_i_przeglad_28.gif

Każdy z pierwiastków opisany jest powyżej przez dwa parametry: swój wielomian minimalny (wielomian najniższego stopnia o całkowitych współczynnikach, którego pierwiastkiem jest między innymi on sam) oraz liczbę naturalną pomiędzy jedynką a stopniem wielomianu, która odpowiada pewnemu uporządkowaniu pierwiastków. To uporządkowanie jest nietrywialnym rezultatem algorytmu zwanego “izolacją pierwiastków”. Po izolacji pierwiastków możemy obliczyć je z dokładnością do dowolnego miejsca po przecinku:

KN1_wstep_i_przeglad_29.gif

KN1_wstep_i_przeglad_30.gif

Reduce można używać też do rozwiązywania problemów całkowicie symbolicznych. Na przykład możemy łatwo uzyskać znany warunek na to, żeby równanie kwadratowe KN1_wstep_i_przeglad_31.gif miało dwa jednakowe pierwiastki:

KN1_wstep_i_przeglad_32.gif

KN1_wstep_i_przeglad_33.gif

Powyższe wzory zna prawie każdy jeszcze z algebry szkolnej, ale już dla równania 3. stopnia uzyskanie podobnego wyniku nie jest takie łatwe:

KN1_wstep_i_przeglad_34.gif

KN1_wstep_i_przeglad_35.gif

Spróbujmy teraz rozwiązać równanie trygonometryczne. Na początek ograniczmy się do skończonego przedziału, na którym to równanie ma skończenie wiele pierwiastków:

KN1_wstep_i_przeglad_36.gif

KN1_wstep_i_przeglad_37.gif

Dodana na końcu funkcja FullSimplify służy do upraszczania odpowiedzi. Proponujemy sprawdzić, co się stanie, jeśli nie wpiszemy tej komendy.

Następnie rozwiążmy (lub raczej zredukujmy) powyższe równanie trygonometryczne na całej osi rzeczywistej:

KN1_wstep_i_przeglad_38.gif

KN1_wstep_i_przeglad_39.gif

Spróbujemy teraz zająć się czymś dużo trudniejszym: równaniem, którego na pierwszy rzut oka nie da się rozwiązać. Ograniczymy się do rozwiązań leżących wewnątrz okręgu o promieniu 1 i środku w 0.

KN1_wstep_i_przeglad_40.gif

KN1_wstep_i_przeglad_41.gif

Powyższe rozwiązanie może sprawiać wrażenie rozwiązania przybliżonego, ale w rzeczywistości jest ono “dokładne”. Można je obliczyć z dowolną precyzją:

KN1_wstep_i_przeglad_42.gif

KN1_wstep_i_przeglad_43.gif

Możemy także udowodnić, że nasze równanie nie ma rozwiązań rzeczywistych:

KN1_wstep_i_przeglad_44.gif

KN1_wstep_i_przeglad_45.gif

Tak jak stwierdziliśmy na początku tej sekcji - funkcja Reduce potrafi rozwiązać wiele równań i  nierówności przeróżnego typu. Kolejnym przykładem jest równanie w dziedzinie liczb całkowitych:

KN1_wstep_i_przeglad_46.gif

KN1_wstep_i_przeglad_47.gif

Następne przykłady są zaczerpnięte z internetowego forum MathGroup. Najpierw zacytujemy pytanie wysłane w styczniu 2011 roku przez Iwana Smirnowa:

“Czy istnieją nietrywialne rozwiązania równania diofantycznego:

KN1_wstep_i_przeglad_48.gif

gdzie, jak zawsze w równaniach diofantycznych, rozwiązania powinny być liczbami całkowitymi?”

Odpowiedź na to pytanie nie jest znana i Mathematica także nie potrafi tego problemu rozwiązać. Bardzo łatwo można jednak za jej pomocą udowodnić, że nie istnieją rozwiązania dla KN1_wstep_i_przeglad_49.gif:

KN1_wstep_i_przeglad_50.gif

KN1_wstep_i_przeglad_51.gif

Dodana na końcu funkcja Timing powoduje, że wraz z rozwiązaniem problemu zwracany jest czas, który był potrzebny na jego obliczenie. Oczywiście ten czas jest zależny od szybkości danego komputera (poza jakością algorytmu).

Zmieniając niektóre domyślne parametry Mathematiki, można łatwo udowodnić, że nie istnieją rozwiązania nietrywialne również dla KN1_wstep_i_przeglad_52.gif.

Programowanie

W poprzedniej sekcji rozważaliśmy problemy, które można rozwiązać za pomocą jednej wbudowanej funkcji Mathematiki (Reduce). Oczywiście z wieloma napotykanymi przez nas problemami nie da się w ten sposób sobie poradzić. W takich sytuacjach często jedynym wyjściem jest samodzielne napisanie odpowiedniego programu. Poniższy przykład pochodzi znowu z forum MathGroup:

“Znajdź wszystkie trójki różnych dwucyfrowych liczb pierwszych takie, że
i) średnia każdej pary liczb w trójce jest liczbą pierwszą;
ii) średnia wszystkich trzech liczb jest liczbą pierwszą.”

Kod rozwiązujący ten problem można napisać w Mathematice na wiele sposobów. Oto jeden z nich:

KN1_wstep_i_przeglad_53.gif

KN1_wstep_i_przeglad_54.gif

Dokładne wytłumaczenie tego kodu wymaga znacznie większej wiedzy o programowaniu w Mathematice niż możemy zakładać w tym momencie. Na razie chcemy zwrócić uwagę na użycie całego szeregu wbudowanych funkcji, które w tradycyjnych językach programistycznych wymagałyby osobnego zakodowania. W pierwszej linii, za pomocą wbudowanych funkcji Select oraz PrimeQ, wybieramy wszystkie liczby pierwsze z listy liczb dwucyfrowych. W drugiej linii tworzymy listę wszyskich trójek dwucyfrowych liczb pierwszych. Następnie w trzeciej linii usuwamy z tej listy “powtórki”, ażeby wreszcie w ostatniej linii z trójek, które nam pozostały, wybrać te, które spełniają warunki zadania.
Oczywiście można wykonać tę sekwencję operacji bez używania pomocniczych list ls1, ls2 i ls3, zapisując wszystko w jednej linii. Jednak dla wielu osób
kod napisany w ten sposób jest mniej czytelny:

KN1_wstep_i_przeglad_55.gif

Jest to tzw. “jednoliniowiec”. Jednoliniowce mają również swoich wielbicieli - co roku odbywa się nawet konkurs na najbardziej intrygującego jednoliniowca (notatniki z konkursu w roku 2012 można znaleźć tutaj:  https://www.wolfram.com/training/special-event/mathematica-experts-live-one-liner-competition-2012/ ). Jakkolwiek dla zwykłych śmiertelników dłuższa wersja kodu, używająca zmiennych pomocniczych i operacji przypisywania, jest prawdopodobnie łatwiejsza do odczytania i zrozumienia.

Przeanalizujmy jeszcze jeden przykład zadania zaczerpnięty z forum MathGroup:

“Jaki jest najprostszy sposób znalezienia długości najkrótszego cyklu powtarzającego się w rozwinięciu dziesiętnym ułamka? Na przykład 1/7 = 0,14285714285714285714, zatem długość cyklu (142857) wynosi 6.”

I w tym przypadku, poza wiedzą matematyczną, bardzo przydaje się dobra znajomość wbudowanych funkcji, żeby napisać wydajny kod w Mathematice. Nie istnieje jedna wbudowana funkcja, która bezpośrednio dawałaby odpowiedź na nasz problem, ale znajdujemy dwie funkcje blisko z nim związane: IntegerExponent i MultiplicativeOrder. Używając ich obu jednocześnie, możemy obliczyć poszukiwaną długość cyklu:

KN1_wstep_i_przeglad_56.gif

Teraz widzimy, że:

KN1_wstep_i_przeglad_57.gif

KN1_wstep_i_przeglad_58.gif

napisana przez nas funkcja daje poprawną odpowiedź.

Jedną z przyczyn, dla których dobra znajomość wbudowanych funkcji jest tak bardzo ważna w programowaniu w Mathematice, jest fakt, że takie funkcje działają dużo szybciej niż równoważne im funkcje napisane samodzielnie przez użytkowników w Mathematice, a równie szybko lub nawet szybciej niż podobne funkcje napisane w kompilowanych językach, takich jak C. Na szczęście także napisane przez siebie funkcje w Mathematice możemy znacznie przyspieszyć, poprzez tak zwaną kompilację. Poniżej podajemy przykład programu, który bez kompilacji działa dosyć wolno, ale ta bardzo mocno go przyspiesza. Służy on do konstrukcji spirali Ulama <http://mathworld.wolfram.com/PrimeSpiral.html> i jest autorstwa Daniela Lichtblau z Wolfram Reseach:

KN1_wstep_i_przeglad_59.gif

Stworzenie spirali z 60.000 punktów zajmuje tylko ułamek sekundy:

KN1_wstep_i_przeglad_60.gif

KN1_wstep_i_przeglad_61.gif

Otrzymaną spiralę możemy przedstawić graficznie na kilka sposobów - np. jako zbiór punktów, używając funkcji ListPlot:

KN1_wstep_i_przeglad_62.gif

KN1_wstep_i_przeglad_63.gif

czy jako zbiór linii, używając funkcji ListLinePlot:

KN1_wstep_i_przeglad_64.gif

KN1_wstep_i_przeglad_65.gif

W Mathematice 8 i 9 ten kod może być przyspieszony jeszcze bardziej przez zastosowanie dla funkcji Compile opcji CompilationTarget"C". Żeby ta operacja była skuteczna, trzeba mieć jednak zainstalowany na komputerze odpowiedni kompilator języka C.  

Wyspecjalizowane funkcje matematyczne - przykłady ze statystyki i matematyki finansowej

Poza dość ogólnymi funkcjami matematycznymi, takimi jak Reduce, Mathematica posiada także wiele wyspecjalizowanych funkcji przydatnych w konkretnych działach matematyki, zarówno czystej, jak i stosowanej. Niektóre z nich znajdują się w osobnych pakietach, które przed użyciem trzeba oddzielnie wczytać do Mathematiki. Tak jest np. w przypadku funkcji do Analizy Wariancji (ANOVA), która jest w osobnym pakiecie ANOVA. Zauważmy, że w samej Mathematice nie ma takiej funkcji:

KN1_wstep_i_przeglad_66.gif

KN1_wstep_i_przeglad_67.gif

Wczytamy teraz pakiet ANOVA:

KN1_wstep_i_przeglad_68.gif

Zwróćmy uwagę na to, że ostatni symbol przed zamknięciem cudzysłowa to grawis: `.
Po wczytaniu pakietu funkcja ANOVA będzie już działać:

KN1_wstep_i_przeglad_69.gif

KN1_wstep_i_przeglad_70.gif

Funkcje zawarte w pakietach są tego samego typu, co te napisane przez użytkowników (faktycznie każdy może tworzyć własne pakiety złożone z napisanych przez siebie funkcji i następnie wczytywać je do Mathematiki). Funkcje z pakietów są więc powolniejsze od funkcji wbudowanych. W wielu przypadkach funkcje zawarte w pakietach automatycznie dołączonych do Mathematiki (http://reference.wolfram.com/mathematica/guide/StandardExtraPackages.html)
po dalszej optymalizacji pojawiają się w kolejnych wersjach Mathematiki już jako funkcje wbudowane.

Jedną z bardziej interesujących “niematematycznych” funkcji wbudowanych jest funkcja FinancialData, która pobiera dane bezpośrednio z giełd amerykańskich (do działania tej funkcji konieczne jest połączenie z internetem). Pobierzmy dla przykładu listę cen akcji firmy Apple od 1. stycznia 2007 roku:

KN1_wstep_i_przeglad_71.gif

Teraz możemy narysować wykres tych danych za pomocą wbudowanej funkcji DateListPlot:

KN1_wstep_i_przeglad_72.gif

Graphics:Apple

Zamiast samych cen często bada się zwroty (logarytmiczne). Można je oczywiście obliczyć, używając otrzymanych wcześniej cen, ale da się także pobrać je bezpośrednio przy pomocy funkcji FinancialData. Tym razem pobierzemy dane dla indeksu Standard & Poor 500:

KN1_wstep_i_przeglad_74.gif

Przyjrzyjmy się kilku pierwszym wyrazom z listy “returns”:

KN1_wstep_i_przeglad_75.gif

KN1_wstep_i_przeglad_76.gif

Widzimy, że “returns” jest listą par o formacie {data, zwrot}. Do dalszej analizy użyjemy tylko wartości zwrotów:

KN1_wstep_i_przeglad_77.gif

Użyjemy teraz wbudowanej funkcji SmoothKernelDistribution do estymacji rozkładu zwrotów, a następnie narysujemy wykres wyestymowanej gęstości zwrotów:

KN1_wstep_i_przeglad_78.gif

KN1_wstep_i_przeglad_79.gif

KN1_wstep_i_przeglad_80.gif

Jaki rozkład statystyczny najlepiej opisuje zachowanie się indeksu? Wypróbujmy najpierw rozkład normalny, który dominował w tego typu modelowaniu przed kryzysem finansowym w 2008 roku. W Mathematice takie obliczenia są bardzo łatwe do wykonania:

KN1_wstep_i_przeglad_81.gif

KN1_wstep_i_przeglad_82.gif

Sprawdźmy, jak dobrze rozkład normalny o powyższych parametrach pasuje do danych empirycznych:

KN1_wstep_i_przeglad_83.gif

KN1_wstep_i_przeglad_84.gif

Wynik naszego eksperymentu raczej nie jest satysfakcjonujący - dwa wykresy na rysunku powyżej wyraźnie się od siebie różnią. Sprawdźmy zatem inny rozkład. Skądinąd wiemy, że zwroty indeksu S&P 500 są dobrze opisywane przez rozkład Meixnera (który odpowiada modelowi cen akcji opartemu na pewnym procesie skokowym zwanym procesem Meixnera). Przetestujmy tę hipotezę:

KN1_wstep_i_przeglad_85.gif

KN1_wstep_i_przeglad_86.gif

KN1_wstep_i_przeglad_87.gif

KN1_wstep_i_przeglad_88.gif

Na powyższym rysunku wyraźnie widać, że rozkład Meixnera dużo lepiej modeluje zwroty S&P 500 niż rozkład normalny.

Grafika i interaktywna “Dynamika”

Mathematica nie była pierwszym programem do “matematyki komputerowej” (zwanej także algebrą komputerową), ale kiedy pojawiła się w roku 1988, odróżniała się od innych tego typu programów dużo większymi możliwościami graficznymi, szczególnie w grafice trójwymiarowej. Dwadzieścia pięć lat później Mathematica nadal wybija się pod względem możliwości w zakresie tradycyjnej grafiki, ale od wersji 6 posiada także inne funkcjonalności jeszcze lepiej odpowiadające “duchowi XXI wieku”. Najważniejszą z nich jest możliwość (łatwego) tworzenia interaktywnych programów wykonujących obliczenia, w których można zmieniać parametry za pomocą elementów interfejsu graficznego, takich jak menu, suwaki, przyciski itp. Programy dynamiczne nie muszą zawierać grafiki, ale najczęściej używane są do tworzenia “interaktywnych animacji graficznych”, różniących się od tradycyjnych animacji (w których Mathematica oczywiście także dobrze sobie radzi) większą kontrolą daną użytkownikowi. Cała ta funkcjonalność jest oparta na funkcji Dynamic:

KN1_wstep_i_przeglad_89.gif

KN1_wstep_i_przeglad_90.gif

Do większości celów wystarcza prostsza funkcja Manipulate (która sama jest skonstruowana za pomocą Dynamic). Obie te funkcje będą dokładnie omówione w osobnym rozdziale dotyczącym grafiki.

Format CDF , CDF Player i Projekt Demonstracji Wolframa.

Wraz z wersją 8 pojawił się nowy format plików Mathematiki: CDF, czyli Computable Document Format. To nie przypadek, że nazwa przypomina popularny PDF (Portable Document Format). Podobnie jak w przypadku PDF, pliki CDF można “odczytywać”, używając darmowego programu (CDF Playera, odgrywającego podobną rolę do Adobe Readera), ale do ich tworzenia potrzebna jest jedna z kilku istniejących komercyjnych wersji Mathematiki. Zasadniczą różnicą między CDF Playerem i Adobe Readerem jest to, że o ile ten drugi jest w zasadzie przeznaczony do posługiwania się statycznymi dokumentami, to w tym pierwszym możemy wykonać wszystko to, co potrafi wykonać Mathematica, czyli obliczenia symboliczne i numeryczne, interaktywną grafikę, dźwięk itp. Jedyną rzeczą, której CDF Player nie potrafi, jest niezależne programowanie. Innymi słowy, użytkownik CDF Playera ma dostęp tylko do tych funkcji, które wykorzystał w danym pliku CDF jego twórca, oraz może zmieniać argumenty i parametry tych funkcji tylko poprzez interfejs stworzony przez twórcę pliku.

Stąd można ściągnąć Wolfram CDF Player

CDF Player pozwala na proste używanie wszystkich zasobów Mathematiki przez osoby nie znające jej języka programistycznego i nawet nie posiadające Mathematiki. Jest on szczególnie pożyteczny w połączeniu z Projektem Demonstracji Wolframa: http://demonstrations.wolfram.com.
Na tej stronie można znaleźć tysiące interaktywnych programów ilustrujących twierdzenia, dowody, eksperymenty itp. z różnych dziedzin matematyki, nauk przyrodniczych i społecznych, a także można znaleźć sztukę, gry itp. Wszytkie pliki są w formacie CDF, a więc można ich w pełni używać przy pomocy tylko CDF Playera. Projekt zawiera także kod źródłowy wszystkich demonstracji, który można pobrać i swobodnie modyfikować. Dla osób mających dostęp do Mathematiki jest to doskonała metoda nauczenia się zaawansowanych technik programowania.

Wolfram Alpha i “swobodna forma”

Wolfram Alpha - Mathematica dla każdego!   

Pojawienie się Wolfram | Alpha skupiło na sobie sporo uwagi medialnej, ale stosunkowo niewiele osób zdaje sobie sprawę z tego, że Wolfram | Alpha jest oparty na Mathematice i, w rezultacie, dostarcza szerokiemu gronu użytkowników możliwość darmowego dostępu do dużej części funkcjonalności Mathematiki. Co więcej, ten sposób używania Mathematiki nie wymaga nauczenia się składni języka ani nawet znajomości istniejących funkcji i ich nazw. Najbardziej znaną zaletą Wolfram | Alpha jest możliwość używania “swobodnej formy” języka, włącznie z formułami matematycznymi. Zasada jest prosta: wpisz swoje pytanie, używając zwykłego języka angielskiego (w przyszłości planowana jest możliwość używania również innych języków), a Wolfram | Alpha spróbuje zgadnąć, o co chodzi i dostarczyć Tobie odpowiedzi przy pomocy Mathematiki (i nie tylko). Odpowiedzi dawane przez Wolfram | Alpha są dużo obszerniejsze niż te, które daje sama Mathematica, co oczywiście wynika z faktu, że “swobodna forma” Wolfram |Alpha jest o wiele mniej precyzyjna od form wejściowych Mathematiki.
Zobaczmy to na przykładzie obliczania funkcji pierwotnej (całki nieokreślonej)  ∫x log(x)dx. Zaczniemy od “normalnej” Mathematiki:

KN1_wstep_i_przeglad_91.gif

KN1_wstep_i_przeglad_92.gif

Teraz użyjemy Wolfram | Alpha. Większość osób robi to oczywiście online, wchodząc na stronę http://www.wolframalpha.com, ale użytkownicy Mathematiki mogą zrobić dokładnie to samo, bezpośrednio używając Mathematiki (oczywiście w tym wypadku konieczne jest połączenie z Internetem), za pomocą funkcji WolframAlpha:

KN1_wstep_i_przeglad_93.gif

Widzimy, że otrzymaliśmy dużo więcej informacji niż tylko te, o które nam chodziło. Intersującym i pożytecznym faktem jest to, że Wolfram | Alpha “rozumie” także normalną składnię Mathematiki. Na przykład ewaluując wyrażenie WolframAlpha[Integrate[x Log[x],x]], uzyskamy dokładnie taki sam wynik jak powyżej.

Na koniec tego rozdziału warto zauważyć, że sama Mathematica także pozwala używać “swobodnej formy” formuł wejściowych. Aby użyć tej funkcjonalności, zaczynamy formułę od symbolu “=”, po czym piszemy “swobodnie”, np.:

KN1_wstep_i_przeglad_95.gif

KN1_wstep_i_przeglad_96.gif

Jak widzimy, Mathematica skutecznie rozpoznała, o co nam chodziło i podała dokładne rozwiązanie bez zbytecznych dodatkowych informacji.

Grafika

III. Grafika

Mathematica jest bardzo zaawansowanym narzędziem do tworzenia grafiki 2D oraz 3D. Ten rozdział jest z jednej strony najprostszy, a z drugiej najbardziej skomplikowany w tym skrypcie. Jest on prosty, ponieważ informacje o wszystkich poniższych konstrukcjach i szczegółowe instrukcje dotyczące ich można znaleźć w Documentation Center. Jednak dosyć skomplikowanym zadaniem jest znalezienie potrzebnych cech wśrod setek podobnych. Poniżej podajemy tylko przykłady najczęściej używanych cech graficznych. Wszystkie poniższe ilustracje zostały stworzone w Mathematice 7. We wcześniejszych wersjach Mathematiki niektóre z nich nie będą działać lub będą działać inaczej. Większość obrazków tłumaczy się sama przez się, a z pytaniami o sposób korzystania z różnych funkcji graficznych odsyłamy czytelnika do dokumentacji. Chcemy zwrócić szeczególną uwagę czytalnika na użycie opcji. Przypominamy że dla każdej funkcji można sprawdzić jej zbiór opcji przez instrukcje Options:

KN3_grafika_1.gif

KN3_grafika_2.gif

Czytelnik powinien sam sprawdzić efekt zmiany wartości różnych opcji w poniższych przykładach. Umiejętność dobiernia odpowiednich wartości opcji jest jednym z najważniejszych elementów w sprawnym posługiwaniu się Mathematiką.

Spis treści

2D

3D

2D

KN3_grafika_3.gif

KN3_grafika_4.gif

KN3_grafika_5.gif

KN3_grafika_6.gif

KN3_grafika_7.gif

KN3_grafika_8.gif

KN3_grafika_9.gif

KN3_grafika_10.gif

KN3_grafika_11.gif

KN3_grafika_12.gif

KN3_grafika_13.gif

KN3_grafika_14.gif

KN3_grafika_15.gif

KN3_grafika_16.gif

KN3_grafika_17.gif

KN3_grafika_18.gif

KN3_grafika_19.gif

KN3_grafika_20.gif

KN3_grafika_21.gif

KN3_grafika_22.gif

KN3_grafika_23.gif

KN3_grafika_24.gif

KN3_grafika_25.gif

KN3_grafika_26.gif

KN3_grafika_27.gif

KN3_grafika_28.gif

KN3_grafika_29.gif

KN3_grafika_30.gif

KN3_grafika_31.gif

KN3_grafika_32.gif

KN3_grafika_33.gif

KN3_grafika_34.gif

KN3_grafika_35.gif

KN3_grafika_36.gif

KN3_grafika_37.gif

KN3_grafika_38.gif

KN3_grafika_39.gif

KN3_grafika_40.gif

KN3_grafika_41.gif

KN3_grafika_42.gif

KN3_grafika_43.gif

KN3_grafika_44.gif

KN3_grafika_45.gif

KN3_grafika_46.gif

KN3_grafika_47.gif

Graphics:circle

KN3_grafika_49.gif

KN3_grafika_50.gif

KN3_grafika_51.gif

Graphics:ellipse

KN3_grafika_53.gif

KN3_grafika_54.gif

KN3_grafika_55.gif

KN3_grafika_56.gif

KN3_grafika_57.gif

KN3_grafika_58.gif

KN3_grafika_59.gif

KN3_grafika_60.gif

KN3_grafika_61.gif

KN3_grafika_62.gif

KN3_grafika_63.gif

KN3_grafika_64.gif

KN3_grafika_65.gif

KN3_grafika_66.gif

KN3_grafika_67.gif

KN3_grafika_68.gif

KN3_grafika_69.gif

KN3_grafika_70.gif

KN3_grafika_71.gif

KN3_grafika_72.gif

KN3_grafika_73.gif

KN3_grafika_74.gif

KN3_grafika_75.gif

KN3_grafika_76.gif

KN3_grafika_77.gif

KN3_grafika_78.gif

KN3_grafika_79.gif

KN3_grafika_80.gif

Graphics[{Arrow[{{0, 0},{1, 1}}],
    Hue[0], Arrow[{{.75, .25},{.25, .75}}]}]

KN3_grafika_81.gif

Plot[Sin[x], {x, 0, 2Pi},
    Epilog -> {Arrow[{{4, .25}, {Pi/2, 1}}],
     Text["Here", {4, .15}, {0, -1}]}
]

KN3_grafika_82.gif

ContourPlot[x^2 + 2 y^2 == 3, {x, -2, 2},{y,-2,2}]

KN3_grafika_83.gif $ CellContext`x&nbsp;&nbsp;+ 2  $CellContext`y  == 3" nohref="" />

ContourPlot[{(x^2 + y^2)^2 == (x^2 - y^2),
(x^2 + y^2)^2 == 2 x y}, {x,-2,2},{y,-2,2}
]

KN3_grafika_84.gif $ CellContext`x&nbsp;&nbsp;+  $CellContext`y )  == 2 $ CellContext`x  $CellContext`y" nohref="" /> $ CellContext`x&nbsp;&nbsp;+  $CellContext`y )  == $ CellContext`x&nbsp;&nbsp;-  $CellContext`y" nohref="" />

KN3_grafika_85.gif

KN3_grafika_86.gif

KN3_grafika_87.gif

KN3_grafika_88.gif

Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 3, 1}]

KN3_grafika_90.gif

KN3_grafika_91.gif

KN3_grafika_92.gif

KN3_grafika_93.gif

KN3_grafika_94.gif

KN3_grafika_95.gif

KN3_grafika_96.gif

KN3_grafika_97.gif

KN3_grafika_98.gif

KN3_grafika_99.gif

KN3_grafika_100.gif

KN3_grafika_101.gif

3D

KN3_grafika_102.gif

KN3_grafika_103.gif

KN3_grafika_104.gif

KN3_grafika_105.gif

KN3_grafika_106.gif

KN3_grafika_107.gif

KN3_grafika_108.gif

KN3_grafika_109.gif

KN3_grafika_110.gif

KN3_grafika_111.gif

KN3_grafika_112.gif

KN3_grafika_113.gif

KN3_grafika_114.gif

g = ParametricPlot3D[
{x, Cos[t] Sin[x] , Sin[t] Sin[x]},
      {x, -Pi, Pi}, {t, 0, 2Pi},
      Axes -> False, Boxed -> False]

KN3_grafika_115.gif

KN3_grafika_116.gif

KN3_grafika_117.gif

KN3_grafika_118.gif

KN3_grafika_119.gif

RevolutionPlot3D[{1.1 Sin[u], u^2},
  {u, 0, 3 Pi/2}, BoxRatios -> {1, 1, 2}]

KN3_grafika_120.gif

RevolutionPlot3D[
          Sin[x], {x, 0, 2 Pi}]

KN3_grafika_121.gif

RevolutionPlot3D[x^2, {x, 0, 1},
    RevolutionAxis -> {1, 1, 1}]

KN3_grafika_122.gif

KN3_grafika_123.gif

KN3_grafika_124.gif

KN3_grafika_125.gif

KN3_grafika_126.gif

KN3_grafika_127.gif

KN3_grafika_128.gif

KN3_grafika_129.gif

KN3_grafika_130.gif

KN3_grafika_131.gif

KN3_grafika_132.gif

Wstęp do Interaktywności

IV. Interaktywność

Ten rozdział poświęcamy jednej z najbardziej nowatorskich cech Mathematiki. Interaktywna wizualizacja jest szczególnie pożyteczna w badaniu problemów, w których występuje kilka parametrów i interesuje nas zachowanie przy zmianie tych parametrów. Poniżej podajemy kilka przykładów wykorzystujących podstawową funkcję Dynamic, a taże funkcję Manipulate. Ta druga jest łatwiejsza w użyciu, ale nieco mniej elastyczna.

Spis treści

Przykład 1

Przykład 2

Inne przykłady

Opcje funkcji Manipulate

Przykład 1

KN4_wstep_do_interaktywnosci_1.gif

KN4_wstep_do_interaktywnosci_3.gif

KN4_wstep_do_interaktywnosci_4.gif

KN4_wstep_do_interaktywnosci_6.gif

KN4_wstep_do_interaktywnosci_7.gif

Przykład 2

KN4_wstep_do_interaktywnosci_9.gif

KN4_wstep_do_interaktywnosci_10.gif

KN4_wstep_do_interaktywnosci_11.gif

KN4_wstep_do_interaktywnosci_12.gif

KN4_wstep_do_interaktywnosci_13.gif

KN4_wstep_do_interaktywnosci_14.gif

KN4_wstep_do_interaktywnosci_15.gif

KN4_wstep_do_interaktywnosci_16.gif

Inne przykłady

KN4_wstep_do_interaktywnosci_17.gif

KN4_wstep_do_interaktywnosci_18.gif

KN4_wstep_do_interaktywnosci_19.gif

KN4_wstep_do_interaktywnosci_20.gif

KN4_wstep_do_interaktywnosci_21.gif

KN4_wstep_do_interaktywnosci_22.gif

KN4_wstep_do_interaktywnosci_23.gif

KN4_wstep_do_interaktywnosci_24.gif

KN4_wstep_do_interaktywnosci_25.gif

KN4_wstep_do_interaktywnosci_26.gif

KN4_wstep_do_interaktywnosci_27.gif

KN4_wstep_do_interaktywnosci_28.gif

KN4_wstep_do_interaktywnosci_29.gif

KN4_wstep_do_interaktywnosci_30.gif

KN4_wstep_do_interaktywnosci_31.gif

KN4_wstep_do_interaktywnosci_32.gif

KN4_wstep_do_interaktywnosci_33.gif

KN4_wstep_do_interaktywnosci_34.gif

KN4_wstep_do_interaktywnosci_35.gif

KN4_wstep_do_interaktywnosci_36.gif

KN4_wstep_do_interaktywnosci_37.gif

KN4_wstep_do_interaktywnosci_38.gif

KN4_wstep_do_interaktywnosci_40.gif

KN4_wstep_do_interaktywnosci_41.gif

KN4_wstep_do_interaktywnosci_42.gif

KN4_wstep_do_interaktywnosci_43.gif

KN4_wstep_do_interaktywnosci_44.gif

KN4_wstep_do_interaktywnosci_45.gif

KN4_wstep_do_interaktywnosci_46.gif

KN4_wstep_do_interaktywnosci_47.gif

KN4_wstep_do_interaktywnosci_48.gif

KN4_wstep_do_interaktywnosci_49.gif

KN4_wstep_do_interaktywnosci_50.gif

Opcje funkcji Manipulate

KN4_wstep_do_interaktywnosci_51.gif

KN4_wstep_do_interaktywnosci_52.gif

KN4_wstep_do_interaktywnosci_54.gif

KN4_wstep_do_interaktywnosci_56.gif

KN4_wstep_do_interaktywnosci_58.gif

KN4_wstep_do_interaktywnosci_60.gif

KN4_wstep_do_interaktywnosci_62.gif

KN4_wstep_do_interaktywnosci_64.gif

KN4_wstep_do_interaktywnosci_66.gif

KN4_wstep_do_interaktywnosci_69.gif

KN4_wstep_do_interaktywnosci_71.gif

KN4_wstep_do_interaktywnosci_73.gif

KN4_wstep_do_interaktywnosci_75.gif

KN4_wstep_do_interaktywnosci_77.gif

KN4_wstep_do_interaktywnosci_79.gif

KN4_wstep_do_interaktywnosci_81.gif

KN4_wstep_do_interaktywnosci_83.gif

KN4_wstep_do_interaktywnosci_84.gif

KN4_wstep_do_interaktywnosci_86.gif

KN4_wstep_do_interaktywnosci_88.gif

KN4_wstep_do_interaktywnosci_90.gif

Bardziej Zaawansowane Tematy

5. Bardziej zaawansowane tematy

Spis treści

Programowanie rekursywne i dynamiczne

Szybkie obliczanie liczb Fibonacciego

Imperatywne (proceduralne) i funkcyjne programowanie

Zmienne lokalne

Pętle i funkcja iteracji

Block i zmienne globalne.

Przykład: symulacja ruchu Browna

Jedna ścieżka

Wiele ścieżek

Programowanie rekursywne i dynamiczne

Programy rekursywne to programy, które "odwołują się do siebie samych". W Mathematice bardzo łatwo jest programować rekursywnie, choć w przeciwieństwie do języków programistycznych takich jak LISP (z którymi język Mathematiki ma pewne podobieństwa), Mathematica nie jest zoptymalizowana do tego celu i nieuważnie napisane programy rekursywne mogą być bardzo powolne. Jednym ze sposobów przyspieszenia programów rekursywnych jest skorzystanie z metody zwanej "programowaniem dynamicznym", lub, bardziej precyzyjnie, metody "funkcji, które zapamiętują swoje wartości". Jest to bardzo pożyteczna metoda, którą najłatwiej zrozumieć, przyglądając się przykładom jej użycia.

Szybkie obliczanie liczb Fibonacciego

Liczby Fibonacciego są rozwiązaniami następującego równania rekursywnego:

KN5_bardziej_zaawansowane_tematy1[2]_1.gif

Funkcja RSolve rozwiązuje wiele równań tego typu:

KN5_bardziej_zaawansowane_tematy1[2]_2.gif

KN5_bardziej_zaawansowane_tematy1[2]_3.gif

Fibonacci[n] to po prostu zakodowana n-ta liczba Fibonacciego. Aby zobaczyć jej definicję, użyjemy polecenia FunctionExpand:

KN5_bardziej_zaawansowane_tematy1[2]_4.gif

KN5_bardziej_zaawansowane_tematy1[2]_5.gif

Teraz spróbujemy sami zdefiniować liczby Fibonacciego. Zrobimy to na dwa sposoby. Pierwszym będzie "zwyczajna rekursja":

KN5_bardziej_zaawansowane_tematy1[2]_6.gif

KN5_bardziej_zaawansowane_tematy1[2]_7.gif

KN5_bardziej_zaawansowane_tematy1[2]_8.gif

KN5_bardziej_zaawansowane_tematy1[2]_9.gif

Niestety to podejście jest bardzo powolne i już obliczenie  liczby Fibonacciego Fib1[30] zabiera zauważalną ilość czasu. W drugim sposobie wykorzystamy "programowanie dynamiczne". Poniższa definicja na pierwszy rzut oka wygląda dziwnie. Należy zwrócić uwagę na równoczesne użycie “:=” i “=”  :

KN5_bardziej_zaawansowane_tematy1[2]_10.gif

KN5_bardziej_zaawansowane_tematy1[2]_11.gif

KN5_bardziej_zaawansowane_tematy1[2]_12.gif

KN5_bardziej_zaawansowane_tematy1[2]_13.gif

KN5_bardziej_zaawansowane_tematy1[2]_14.gif

Tym razem obliczenie  liczby Fibonacciego F2[30] trwało błyskawicznie (prawie 10 tysięcy razy szybciej niż to było przy wykorzystaniu pierwszego sposobu).

Za pomocą funkcji Trace możemy prześledzić dokładnie, co się dzieje podczas wykonywania tych dwóch definicji-programów. Rożnicę widać wyraźnie:

KN5_bardziej_zaawansowane_tematy1[2]_15.gif

KN5_bardziej_zaawansowane_tematy1[2]_16.gif

Łatwo zauważyć, że Fib1 wielokrotnie powtarza te same obliczenia.

W przypadku Fib2 kolejne obliczenia są zupełnie inne. Najpierw usuńmy jeszcze raz Fib2 i zdefiniujmy funkcję od początku:

KN5_bardziej_zaawansowane_tematy1[2]_17.gif

KN5_bardziej_zaawansowane_tematy1[2]_18.gif

KN5_bardziej_zaawansowane_tematy1[2]_19.gif

Teraz wywołajmy Fib2 jeszcze raz, tym razem dla n=6:

KN5_bardziej_zaawansowane_tematy1[2]_20.gif

KN5_bardziej_zaawansowane_tematy1[2]_21.gif

Widzimy wyraźnie, że Mathematica zapamiętała wartości Fib2[n] dla n5 i nie musiała ich ponownie obliczać.

Możemy także sprawdzić bezpośrednio, co Mathematica wie o funkcjach Fib1 i Fib2:

KN5_bardziej_zaawansowane_tematy1[2]_22.gif

Global`Fib1

Fib1[0]=0
Fib1[1]=1
Fib1[n_]:=Fib1[n-1]+Fib1[n-2]

KN5_bardziej_zaawansowane_tematy1[2]_23.gif

Global`Fib2

Fib2[0]=0
Fib2[1]=1
Fib2[2]=1
Fib2[3]=2
Fib2[4]=3
Fib2[5]=5
Fib2[n_]:=Fib2[n]=Fib2[n-1]+Fib2[n-2]

Oczywiście kosztem dużego zysku w szybkości obliczeń przy użyciu programowania dynamicznego jest nieco większa ilość zużytej pamięci. Pamięć tę możemy odzyskać przez:

KN5_bardziej_zaawansowane_tematy1[2]_24.gif

Imperatywne (proceduralne) i funkcyjne programowanie

Dotychczas rozważaliśmy dwa paradygmaty programowania używane w Mathematice: programowanie oparte na regułach oraz programowanie funkcyjne. Teraz skupimy się na programowaniu proceduralnym, zwanym także imperatywnym. Jest to oczywiście najbardziej powszechny paradygmat programowania, oddający dosyć wiernie sposób działania większości współczesnych komputerów. Typowe dla tego paradygmatu jest przypisywanie wartości zmiennym i używanie pętli w celu zmiany tych wartości. Zaczniemy od przykładu:

KN5_bardziej_zaawansowane_tematy1[2]_25.gif

KN5_bardziej_zaawansowane_tematy1[2]_26.gif

Zauważmy, że nie otrzymaliśmy żadnego wyniku. Tym niemniej x ma oczekiwaną wartość:

KN5_bardziej_zaawansowane_tematy1[2]_27.gif

KN5_bardziej_zaawansowane_tematy1[2]_28.gif

Przyjrzyjmy się reprezentacji wewnętrznej (FullForm) obliczanego wyrażenia:

KN5_bardziej_zaawansowane_tematy1[2]_29.gif

KN5_bardziej_zaawansowane_tematy1[2]_30.gif

Zauważmy, że Mathematica automatycznie daje nam wartość ostatniego wyrażenia w ComposedExpression. Jeśli więc nie chcemy tego wyrażenia otrzymać, używamy jako ostatniego argumentu Null.

W wielu proceduralnych językach wartości zmiennej x są zwracane, jeśli użyjemy funkcji Return[x] lub Print[x]. Ponieważ Mathematica zawsze zwraca wartość obliczanego wyrażenia, Return[x] służy tu do zupełnie innego celu. Jeśli pojawi się ono na końcu pętli (zamiast prostego x), możemy być prawie pewni, że autor nauczył się wcześniej programować w języku Fortran (lub C) i nadal pisze programy w tym języku. Nie jest to najbardziej wydajne i eleganckie podejście do programowania w Mathematice, ale działa! Teraz powtórzymy tę samą sekwencję instrukcji, używając pętli “Do”. Zauważmy, że sama pętla “Do” nic nie zwraca - dlatego na końcu kodu umieściliśmy x:

KN5_bardziej_zaawansowane_tematy1[2]_31.gif

KN5_bardziej_zaawansowane_tematy1[2]_32.gif

KN5_bardziej_zaawansowane_tematy1[2]_33.gif

To samo można zapisać nieco krócej:

KN5_bardziej_zaawansowane_tematy1[2]_34.gif

KN5_bardziej_zaawansowane_tematy1[2]_35.gif

W Mathematice można korzystać także z innych, znanych z popularnych języków programowania, pętli, takich jak “While” czy “For”. Zwykle jednak warto ich unikać - rozwiązania wykorzystujące funkcyjne konstrukcje Nest, Fold, FixedPoint i Accumulate zazwyczaj działają znacznie szybciej. Wynika to oczywiście z natury Mathematiki, nie jest to prawdą o programowaniu w ogólności. Nawet w Mathematice różnica w szybkości programów napisanych proceduralnie i funkcyjnie niweluje się w sytuacjach, w których udaje się użyć tzw. kompilacji.

Zmienne lokalne

Jak zawsze używając zmiennych w naszych programach, powinniśmy być czujni, żeby przypadkowo nie zmieniać tych wartości zmiennych, które chcielibyśmy zachować. Najprostszym sposobem zabezpieczenia się przed taką ewentualnością jest używanie zmiennych lokalnych. Mathematica posiada trzy podstawowe konstrukcje lokalizujące zmienne: Block, Module oraz With. Każda z nich działa inaczej oraz ma swoje silne i słabe strony.

KN5_bardziej_zaawansowane_tematy1[2]_36.gif

KN5_bardziej_zaawansowane_tematy1[2]_37.gif

Najpierw obejrzyjmy prosty przykład lokalizacji zmiennych za pomocą konstrukcji Block. Przypisujemy zmiennej x wartość 3, po czym wewnątrz Block zmieniamy jej wartość na 1. Jak widać, "na zewnątrz" bloku wartość x nie uległa zmianie.

KN5_bardziej_zaawansowane_tematy1[2]_38.gif

KN5_bardziej_zaawansowane_tematy1[2]_39.gif

KN5_bardziej_zaawansowane_tematy1[2]_40.gif

KN5_bardziej_zaawansowane_tematy1[2]_41.gif

Dokładnie tak samo w tego typu sytuacji zachowa się konstrukcja Module:

KN5_bardziej_zaawansowane_tematy1[2]_42.gif

KN5_bardziej_zaawansowane_tematy1[2]_43.gif

KN5_bardziej_zaawansowane_tematy1[2]_44.gif

KN5_bardziej_zaawansowane_tematy1[2]_45.gif

KN5_bardziej_zaawansowane_tematy1[2]_46.gif

KN5_bardziej_zaawansowane_tematy1[2]_47.gif

Jednak Block i Module działają zupełnie inaczej. Kiedy lokalizujemy zmienną, używając Block, jej wartość jest najpierw zapamiętana przed wejściem do bloku, potem tymczasowo odebrana wraz z wszystkimi atrybutami zmiennej, i na koniec, po wyjściu z Block, oryginalna wartość zostaje przywrócona zmiennej. W przypadku Module nazwy zmiennych są zmieniane w jego wnętrzu, tak że nie popadają w konflikt ze zmiennymi zewnętrznymi. W przeciwieństwie do Module i Block, kiedy używamy konstrukcji With, wszystkie zmienne lokalne muszą mieć przypisane wartości początkowe:

KN5_bardziej_zaawansowane_tematy1[2]_48.gif

KN5_bardziej_zaawansowane_tematy1[2]_49.gif

Zauważmy teraz pewną cechę, która odróżnia Module i With od Block. W tych dwóch pierwszych inicjalizacja (przypisanie wartości początkowych) wszystkich zmiennych odbywa się niezależnie:

KN5_bardziej_zaawansowane_tematy1[2]_50.gif

KN5_bardziej_zaawansowane_tematy1[2]_51.gif

KN5_bardziej_zaawansowane_tematy1[2]_52.gif

KN5_bardziej_zaawansowane_tematy1[2]_53.gif

KN5_bardziej_zaawansowane_tematy1[2]_54.gif

KN5_bardziej_zaawansowane_tematy1[2]_55.gif

KN5_bardziej_zaawansowane_tematy1[2]_56.gif

KN5_bardziej_zaawansowane_tematy1[2]_57.gif

Block zachowa się inaczej:

KN5_bardziej_zaawansowane_tematy1[2]_58.gif

KN5_bardziej_zaawansowane_tematy1[2]_59.gif

KN5_bardziej_zaawansowane_tematy1[2]_60.gif

A oto inny ważny przykład ilustrujący różnicę między Block i Module:

KN5_bardziej_zaawansowane_tematy1[2]_61.gif

KN5_bardziej_zaawansowane_tematy1[2]_62.gif

KN5_bardziej_zaawansowane_tematy1[2]_63.gif

KN5_bardziej_zaawansowane_tematy1[2]_64.gif

KN5_bardziej_zaawansowane_tematy1[2]_65.gif

Chociaż zmienna foo była zdefiniowana na zewnątrz struktury Block, jej wartość zmieniła się wewnątrz Block. Module zachowuje się inaczej:

KN5_bardziej_zaawansowane_tematy1[2]_66.gif

KN5_bardziej_zaawansowane_tematy1[2]_67.gif

KN5_bardziej_zaawansowane_tematy1[2]_68.gif

KN5_bardziej_zaawansowane_tematy1[2]_69.gif

Czyli ewaluacja wewnątrz Module zależna jest tylko od oryginalnej definicji zmiennej czy funkcji, co nie jest prawdą w przypadku Blocku.

Pętle i funkcja iteracji

Programy napisane zgodnie z paradygmatem imperatywnym zmieniają wartości przypisane jakiejś zmiennej, po czym aby otrzymać wartość zmiennej, należy ją jawnie ewaluować. Widać to w poniższym przykładzie. Sama pętla “Do” nie da nam żadnego wyniku, choć zmieni wartość x. Aby tę wartość otrzymać, musimy dodać x na końcu instrukcji:

KN5_bardziej_zaawansowane_tematy1[2]_70.gif

KN5_bardziej_zaawansowane_tematy1[2]_71.gif

Teraz zrobimy to samo zgodnie z paradygmatem funkcyjnym. Programując w tym stylu, używamy funkcji, które zwracają swoje wartości zamiast zmieniać wartość jakiejś zmiennej. Zamiast pętli używamy specjalnych funkcji które działają na funkcjach i wykonują pewne ich iteracje. Przykładem takiej funkcji jest Nest:

KN5_bardziej_zaawansowane_tematy1[2]_72.gif

KN5_bardziej_zaawansowane_tematy1[2]_73.gif

KN5_bardziej_zaawansowane_tematy1[2]_74.gif

KN5_bardziej_zaawansowane_tematy1[2]_75.gif

oraz spokrewniona z nią funkcja NestList:

KN5_bardziej_zaawansowane_tematy1[2]_76.gif

KN5_bardziej_zaawansowane_tematy1[2]_77.gif

KN5_bardziej_zaawansowane_tematy1[2]_78.gif

KN5_bardziej_zaawansowane_tematy1[2]_79.gif

Możemy teraz, zamiast używać pętli Do (jak w przykładzie powyżej, w którym 20.000 razy zwiększyliśmy o 1 wartość zmiennej x), uzyskać ten sam wynik, programując funkcyjnie:

KN5_bardziej_zaawansowane_tematy1[2]_80.gif

KN5_bardziej_zaawansowane_tematy1[2]_81.gif

Warta zwrócenia uwagi jest duża różnica w szybkości obu tych metod.

Kolejnym przykładem funkcji wykorzystywanej przy programowaniu funkcyjnym jest FoldList:

KN5_bardziej_zaawansowane_tematy1[2]_82.gif

KN5_bardziej_zaawansowane_tematy1[2]_83.gif

Pierwszy argument FoldList musi być dwuargumentową funkcją. Poniższe przykłady ilustrują działanie FoldList:

KN5_bardziej_zaawansowane_tematy1[2]_84.gif

KN5_bardziej_zaawansowane_tematy1[2]_85.gif

KN5_bardziej_zaawansowane_tematy1[2]_86.gif

KN5_bardziej_zaawansowane_tematy1[2]_87.gif

Zwróćmy uwagę na jeszcze jedną podobną funkcję:

KN5_bardziej_zaawansowane_tematy1[2]_88.gif

KN5_bardziej_zaawansowane_tematy1[2]_89.gif

KN5_bardziej_zaawansowane_tematy1[2]_90.gif

KN5_bardziej_zaawansowane_tematy1[2]_91.gif

Oczywiście ten sam wynik można uzyskać przy pomocy poznanej chwilę wcześniej, bardziej ogólnej funkcji FoldList:

KN5_bardziej_zaawansowane_tematy1[2]_92.gif

KN5_bardziej_zaawansowane_tematy1[2]_93.gif

Warto jednak wiedzieć, że bardziej wyspecjalizowana funkcja Accumulate działa szybciej, zatem lepiej używać jej, jeśli pracujemy na numerycznych argumentach:

KN5_bardziej_zaawansowane_tematy1[2]_94.gif

KN5_bardziej_zaawansowane_tematy1[2]_95.gif

KN5_bardziej_zaawansowane_tematy1[2]_96.gif

KN5_bardziej_zaawansowane_tematy1[2]_97.gif

KN5_bardziej_zaawansowane_tematy1[2]_98.gif

KN5_bardziej_zaawansowane_tematy1[2]_99.gif

KN5_bardziej_zaawansowane_tematy1[2]_100.gif

KN5_bardziej_zaawansowane_tematy1[2]_101.gif

KN5_bardziej_zaawansowane_tematy1[2]_102.gif

Programując w Mathematice, często wykorzystuje się fakt, że wyspecjalizowane funkcje są szybsze od swoich bardziej ogólnych odpowiedników.

Block i zmienne globalne.

Konstrukcji Block używamy najczęściej, gdy chcemy tylko na pewien czas zmienić wartości zmiennych globalnych. Na przykład zmienna globalna $ RecursionLimit ma nast&#281;puj&#261;c&#261; domy&#347;ln&#261; warto&#347;&#263;:  </p></p>
<p><p class="Input">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_103.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_103.gif" width="146" height="18" style="vertical-align:middle" /> </p></p>
<p><p class="Output">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_104.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_104.gif" width="29" height="18" style="vertical-align:middle" /> </p></p>
<p><p class="Text">  Oznacza to, &#380;e p&#281;tla, w kt&oacute;rej d&#322;ugo&#347;&#263; rekursji przekroczy 256 krok&oacute;w, zostanie automatycznie zatrzymana. Oczywi&#347;cie ma to u&#322;atwi&#263; wy&#322;apywanie b&#322;&#281;d&oacute;w programistycznych, kt&oacute;re bez tego ograniczenia prowadzi&#322;yby do niesko&#324;czonych p&#281;tli. Czasem jednak to ogranicznie jest niewygodne. Dla przyk&#322;adu wr&oacute;&#263;my jeszcze raz do dobrze nam znanej definicji: </p></p>
<p><p class="Input">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_105.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_105.gif" width="98" height="18" style="vertical-align:middle" /> </p></p>
<p><p class="Input">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_106.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_106.gif" width="588" height="40" style="vertical-align:middle" /> </p></p>
<p><p class="Text">  Spr&oacute;bujmy: </p></p>
<p><p class="Input">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_107.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_107.gif" width="88" height="18" style="vertical-align:middle" /> </p></p>
<p><p class="Message">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_108.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_108.gif" width="416" height="19" style="vertical-align:middle" /> </p></p>
<p><p class="Message">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_109.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_109.gif" width="416" height="19" style="vertical-align:middle" /> </p></p>
<p><p class="Output">  <img src="/sites/default/files/images/mpk-KN5_bardziej_zaawansowane_tematy1[2]_110.gif" alt="KN5_bardziej_zaawansowane_tematy1[2]_110.gif" width="894" height="40" style="vertical-align:middle" /> </p></p>
<p><p class="Text">  Ograniczenie zmiennej  $RecursionLimit do 256 powoduje, że nasz kod nie chce działać. Moglibyśmy zwiększyć wartość $ RecursionLimit albo wr&#281;cz ustali&#263; j&#261; na <span><em>&infin;</em></span>, tym samym ca&#322;kowicie usuwaj&#261;c to ograniczenie. Jednak post&#281;puj&#261;c w ten spos&oacute;b, nara&#380;amy si&#281; na nieprzyjemne konsekwencje w przysz&#322;o&#347;ci - zmienimy lub usuniemy domy&#347;lne ograniczenie na rozmiar p&#281;tli nie tylko w naszym programie obliczaj&#261;cym liczby Fibonacciego, ale r&oacute;wnie&#380; we wszystkich innych programach. Znacznie bezpieczniej jest zmieni&#263; tymczasowo warto&#347;&#263;  $RecursionLimit, np. używając konstrukcji Block. Zanim jednak to zrobimy, musimy usunąć wszystkie definicje Fib, ponieważ Mathematica zapamiętała “zatrzymane” wartości (wartości zawierające Hold, takie jak ta w ostatnim wyniku powyżej).

KN5_bardziej_zaawansowane_tematy1[2]_111.gif

KN5_bardziej_zaawansowane_tematy1[2]_112.gif

KN5_bardziej_zaawansowane_tematy1[2]_113.gif

KN5_bardziej_zaawansowane_tematy1[2]_114.gif

Zauważmy, że globalna wartość $RecursionLimit pozostała w tym przypadku niezmieniona:

KN5_bardziej_zaawansowane_tematy1[2]_115.gif

KN5_bardziej_zaawansowane_tematy1[2]_116.gif

Przykład: symulacja ruchu Browna

Jako przykład użycia funkcji FoldList, NestList oraz Accumulate podajemy konstrukcję symulacji ruchu Browna (procesu Wienera). W dziewiątej wersji Mathematiki ta konstrukcja stała się znacznie łatwiejsza dzięki nowym wbudowanym funkcjom RandomFunction oraz WienerProcess. Kod, który podajemy poniżej, działa w wersjach 6 i wyżej.

Jedna ścieżka

Ścieżkę ruchu Browna (przebytą w jednostce czasu) przybliżamy przez losowe błądzenie z n krokami, gdzie każdy krok jest liczbą rzeczywistą o rozkładzie normalnym ze średnią 0 i odchyleniem standardowym KN5_bardziej_zaawansowane_tematy1[2]_117.gif. Istnieje szereg sposobów zaprogramowania tego w Mathematice. Podajemy poniżej trzy  z nich.

Accumulate (najszybsza metoda):

KN5_bardziej_zaawansowane_tematy1[2]_118.gif

FoldList (nieco powolniejsza):

KN5_bardziej_zaawansowane_tematy1[2]_119.gif

NestList (najwolniejsza)

KN5_bardziej_zaawansowane_tematy1[2]_120.gif

KN5_bardziej_zaawansowane_tematy1[2]_121.gif

KN5_bardziej_zaawansowane_tematy1[2]_122.gif

Wiele ścieżek

KN5_bardziej_zaawansowane_tematy1[2]_123.gif

KN5_bardziej_zaawansowane_tematy1[2]_124.gif

KN5_bardziej_zaawansowane_tematy1[2]_125.gif

KN5_bardziej_zaawansowane_tematy1[2]_126.gif

KN5_bardziej_zaawansowane_tematy1[2]_127.gif

KN5_bardziej_zaawansowane_tematy1[2]_129.gif

Zadania

W skrypcie przedstawimy przykładowy plan wykładów oraz zestawy zada do laboratorium komputerowego do semestralnego wykładu z Matematyki przy komputerze.Wiele zada oraz przykładów jest zawarte w naszych wykładach.Polecamy przerobi je szczegółowo na ćwiczeniach. Na koniec najlepiej żeby studenci mogli zaimplementować własne projekty zaliczeniowe, które wykorzystują grafikę, oraz symboliczne i numeryczne funkcje Mathematica.

Ćwiczenia (z przykładami i częściowymi rozwiązaniami)

1.

KZadania_1.gif

Rozwiązanie

KZadania_2.gif

KZadania_3.gif

KZadania_4.gif

KZadania_5.gif

KZadania_6.gif

KZadania_7.gif

2.

Sprawdź prawdziwość następującego twierdzenia:

Niech det A będzie wyznacznikiem macierzy A rozmiaru n×n (n jest ustalone). Oznaczmy przez det A(j,k) wyznacznik macierzy otrzymanej przez usunięcie j-tego wiersza oraz k-tej kolumny z macierzy A. Podobnie możemy usuwać kolejne wiersze i kolumny. Wówczas prawdziwe jest równanie:

KZadania_8.gif.  

Przeanalizuj poniższy przykład dla n=5, [i,j,k,l]=[1,2,4,5]. Zilustruj twierdzenie przy pomocy funkcji Manipulate, dając użytkownikowi wybór, którą kolumnę lub wiersz usunąć.

Przykład

KZadania_9.gif

KZadania_10.gif

KZadania_11.gif

KZadania_12.gif

KZadania_13.gif

KZadania_14.gif

KZadania_15.gif

KZadania_16.gif

KZadania_17.gif

KZadania_18.gif

3.

Przeczytaj o twierdzeniu Sturma (http://en.wikipedia.org/wiki/Sturm%27s_theorem) i zaimplementuj algorytm, który znajduje liczbę różnych rzeczywistych pierwiastków wielomianu (bez podwójnych pierwiastków).

Przykład

Następujący wielomian ma dwa rzeczywiste pierwiastki:

KZadania_19.gif

KZadania_20.gif

Typowe podejście do programowania funkcyjnego składa się z implementacji algorytmu krok po kroku, a następnie połączeniu pojedyńczych kroków w jedną funkcję.
Definiujemy wielomian:

KZadania_21.gif

Sprawdzamy, że wielomian nie ma podwójnych pierwiastków:

KZadania_22.gif

KZadania_23.gif

KZadania_24.gif

KZadania_25.gif

KZadania_26.gif

KZadania_27.gif

KZadania_28.gif

KZadania_29.gif

KZadania_30.gif

KZadania_31.gif

KZadania_32.gif

KZadania_33.gif

KZadania_34.gif

KZadania_35.gif

KZadania_36.gif

KZadania_37.gif

Łączymy teraz wszystko w jedną funkcję. Tu wygodnie jest użyć funkcji NestWhileList:

KZadania_38.gif

KZadania_39.gif

KZadania_40.gif

KZadania_41.gif

KZadania_42.gif

Czołowe współczynniki łańcuchu Sturma:

KZadania_43.gif

KZadania_44.gif

To samo po zastąpieniu x→-x:

KZadania_45.gif

KZadania_46.gif

Inne pożyteczne funkcje: wielomiany z parametrem

1.

Sprawdzamy, dla jakich wartości parametru a wielomian nie ma pierwiastków rzeczywistych:

KZadania_47.gif

KZadania_48.gif

2.

Sprawdzamy, dla jakich wartości parametru a wielomian nie ma pierwiastków rzeczywistych:

KZadania_49.gif

KZadania_50.gif

Czyli dla a=4 wielomian jest nieujemny i ma pierwiastki rzeczywiste. Sprawdźmy, ile ich jest:

KZadania_51.gif

KZadania_52.gif

KZadania_53.gif

KZadania_54.gif

4.

KZadania_55.gif

KZadania_56.gif

o wymiarach (n+1) × (n+1), gdzie s(k) są śladami iloczynów macierzy KZadania_57.gif i s(0)=n.

2. Znajdź sygnaturę macierzy S (liczbę dodatnich i ujemnych wartości własnych). Zauważ, że ponieważ macierz jest symetryczna, jej wartości własne są rzeczywiste.
  

Przykład.

KZadania_58.gif

KZadania_59.gif

KZadania_60.gif

KZadania_61.gif

KZadania_62.gif

KZadania_63.gif

KZadania_64.gif

KZadania_65.gif

KZadania_66.gif

KZadania_67.gif

KZadania_68.gif

KZadania_69.gif

KZadania_70.gif

KZadania_71.gif

KZadania_72.gif

KZadania_73.gif

KZadania_74.gif

KZadania_75.gif

KZadania_76.gif

KZadania_77.gif

KZadania_78.gif

KZadania_79.gif

KZadania_80.gif

5. Równania różniczkowe zwyczajne [1].

1.

KZadania_81.gif

Rozwiązanie.

KZadania_82.gif

KZadania_83.gif

KZadania_84.gif

KZadania_85.gif

2.

KZadania_86.gif

Rozwiązanie.

KZadania_87.gif

KZadania_88.gif

KZadania_89.gif

KZadania_90.gif

KZadania_91.gif

KZadania_92.gif

KZadania_93.gif

KZadania_94.gif

6. Geometria różniczkowa [2].

1.

Oblicz parametr łukowy krzywej w KZadania_95.gif.

Rozwiązanie.

KZadania_96.gif

KZadania_97.gif

KZadania_98.gif

2.

Narysuj kilka stycznych do okręgu.

Rozwiązanie.

KZadania_99.gif

KZadania_100.gif

KZadania_101.gif

KZadania_102.gif

KZadania_103.gif

3.

Narysuj krzywą płaską sparametryzowaną parametrem łukowym z zadaną krzywizną κ.
Wskazówka: rozwiąż układ RRZ   x'[s] == Cos[θ[s]], y'[s] == Sin[θ[s]], θ'[s] == κ.

Rozwiązanie.

KZadania_104.gif

KZadania_105.gif

KZadania_106.gif

KZadania_107.gif

KZadania_108.gif

4.

Oblicz krzywiznę średnią oraz krzywiznę Gaussa krzywej w KZadania_109.gif.

7.

Narysuj obrazy rzutu stereograficznego punktów z KZadania_110.gif (lub płaszczyzny zespolonej C) na sferze Riemanna  (http://en.wikipedia.org/wiki/Stereographic_projection).

8.

Zaimplementuj metodę Frobeniusa dla RRZ (http://en.wikipedia.org/wiki/Frobenius_method, http://mathworld.wolfram.com/FrobeniusMethod.html).

9.

Zaimplementuj hipotezę ABC (http://en.wikipedia.org/wiki/Abc_conjecture).

Literatura.

KZadania_111.gif

[2] A. Gray, Modern Differential Geometry of Curves and Surfaces with Mathematica, CRC Press LLC, 1998. Pliki Mathematica można pobrać ze strony  http://library.wolfram.com/infocenter/Books/3759.

Introduction and Survey

In the 21st century computers are in the process of changing all aspects of our lives. That includes also mathematics - both the way we do it and even the kind of problems that interest us. The ability to make computations far beyond anything that was possible without the aid of computers has opened up previously inaccessible areas of research to anyone equipped with a computer,   suitable software and some mathematical knowledge.  This has lead to the creation of sophisticated programs intended for dealing with all aspects of computational mathematics - symbolic manipulation, numerical computation and visualization (including interactive one).  A leading program of this type is Mathematica produced by Wolfram Research. Mathematica is, of course, not only a tool of research and exploring new areas of computational mathematics but also an extremely effective aid in studying traditional ones. The aim of this essay is to give a brief introduction to some of the possibilities offered by this remarkable program. For this purpose we have made use of a number of exmaples, some of which are due to the authors of this text, some have been borrowed from Mathematica’s official  documentation and some from various sources on the Internet.

Basic information about Mathematica

The main web-page

The main website for current information, useful projects, plug-ins, learning center
and documentation is www.wolfram.com . At this website one can also find a free CDF-Player,  thousands of demonstrations with source files and educational videos.

Mathematica is  one of the most powerful and sophisticated systems for symbolic and numerical computation and visualization. But it is also more than that. Wolfram Research used to describe Mathematica as a “system for doing mathematics by computer” but it has since changed this to “ the only development platform fully integrating computation into complete work-flows”. In other words, Wolfram Research now conceives Mathematica as essentially a universal tool for almost every purpose - symbolic and numerical computation and programming being a central aspect (but this is not the whole story). For example, Mathematica is also an advanced technical typesetting tool, which can produce mathematical documents of quality comparable to 1. Introduction and a survey_1.gif and Latex but in a fully WYSIWYG (What You See is What You Get) way. At the same time, these documents can contain “live” mathematical formulas and graphics that can be send to another person (a collaborator, a student or a professor) who can use them to verify the correctness of results or to perform additional computations etc.

In terms of its overall abilities Mathematica currently has no comparable rival (except, perhaps, for suites of several applications). But if we restrict our attention only to computation, there are other programs (e.g. Maple, MatLab and others) that can do similar things. As a mathematical tool, Mathematica is a “general purpose” system. It is very strong in both symbolic and numeric computation. It has very many powerful specialized functions for subjects as different as polynomial algebra, graph theory, statistics of financial mathematics. However, in some areas (particularly in pure mathematics) there are specialized programs (such as MAGMA, Singular, Macaulay2 etc.) which can do some things that Mathematica cannot do without additional programming or can do them  faster (which in certain situations can be crucial).

The official distributor of Mathematica in Poland is the company Gambit <http://www.mathematica.pl>.

Wolfram Research sites and projects

Wolfram Research has a number of sites and projects of interest both  to Mathematica users and the general public:

Mathworld  <http://mathworld.wolfram.com/>

Mathworld is a very useful and extensive web  resource with definitions, examples and main theorems in mathematics (and often  - Mathematica files in the NB format, i.e., Mathematica notebooks .)

Wolfram Alpha  <http://www.wolframalpha.com/>

Wolfram Alpha - Mathematica (and more) for everyone!

Wolfram Demonstrations Project <http://demonstrations.wolfram.com>

Education

Wolfram Research has an extensive educational program. To register for on-line Wolfram Educational Group (WEG) seminars and classes, one can visit  
<http://www.wolfram.com/services/education/calendar.cgi>
The Wolfram Education Group (WEG)  offers a wide range of free on-line seminars featuring the latest version of Mathematica  (see http://www.wolfram.com/services/education/seminars/).

There are conferences/master classes/other events in Europe and in particular, in Poland. In Warsaw, ICM (the interdisciplinary center at UW) has Mathematica and  provides  some training.

 

The Mathematica Journal

The Mathematica Journal <http://www.mathematica-journal.com/> is an on-line journal with research and educational papers.

Other Mathematica related sites

There is an excellent and free introduction to Mathematica programming due to Leonid Shifrin:
http://www.mathprogramming-intro.org/
Also the Mathematica Guidebooks <http://www.mathematicaguidebooks.org/index.shtml> provide a wealth of applications and examples, particularly from physics but also from other areas. Unfortunately the guidebooks are still not fully compatible with Mathematica 6 and later versions so they are only suitable for users who are advanced enough to update the relevant parts themselves.

Finally there is an excellent Mathematica discussion group (known as the MathGroup)
http://groups.google.com/group/comp.soft-sys.math.mathematica/topics?pli=1
You can ask any questions about any aspect of Mathematica and get a variety of answers from Mathematica experts, including Wolfram Research employees. Sometimes you can even have your math problems solved for you.
This is really the best Mathematica centered resource on the Web, if you know how to make use of it.

The above is, of course, not intended to be a exhaustive account of Mathematica related resources on the Internet. Far from it, the number of  both general purpose and specialised sites intended for beginners as well as advanced users is huge and constantly increasing (e.g. blog.wolfram.com, Mathematica Tips on Twitter etc).

Selected examples od what Mathematica can do

Computational applications

Built-in functions

A large number of problems (even some “real life” ones)  can be solved by simply applying one of Mathematica’s built-in “functions” (the word “function” in connection with Mathematica is used in a somewhat different sense than in mathematics, closer to what in other programming languages is called a “procedure”).  Among the most useful of these functions are Solve and  Reduce. These are very general functions that use a large ensemble of advanced algorithms to solve all kinds of equations and inequalities, many of which would appear unsolvable even to people with good knowledge of mathematics. We will looks at some remarkable examples of the sort of  thing that can be accomplished with Reduce.
(In version 8 the functions Solve became very enhanced and can solve many of the problems that Reduce can, but it often uses somewhat different techniques. Probably the main difference between the two functions is that Reduce always attempts to return the complete solutions of a problem while Solve will in some situations return a partial solution.)

Perhaps the most basic and frequently performed task in mathematics is solving equations. Reduce can be used, of course, to solve equations (and systems of equations) far too complicated to solve by hand. We start by looking at a simple cubic equation, which Mathematica can solve using the famous formula of del Ferro (often attributed to Tartaglia):

1. Introduction and a survey_2.gif

1. Introduction and a survey_3.gif

We can also ask Mathematica to compute the real root only:

1. Introduction and a survey_4.gif

1. Introduction and a survey_5.gif

We can compute it’s numerical value to arbitrary precision:

1. Introduction and a survey_6.gif

1. Introduction and a survey_7.gif

From the work of Abel and Galois it is known that no solutions of the above kind (in terms of radicals) can be given for polynomial equations of degree higher than 5. However, this does not stop Mathematica :

1. Introduction and a survey_8.gif

1. Introduction and a survey_9.gif

Again the values can be computed to arbitrary precision:

1. Introduction and a survey_10.gif

1. Introduction and a survey_11.gif


Reduce can also deal with purely symbolic problems. For example, consider the quadratic equation 1. Introduction and a survey_12.gif.  Let’s obtain the well known condition for it to have two equal roots.

1. Introduction and a survey_13.gif

1. Introduction and a survey_14.gif

Let’s now try something non-polynomial. Here is a trigonometric equation.  We ask Reduce to solve it for a range of values  in an interval, where there is a finite number of solutions:

1. Introduction and a survey_15.gif

1. Introduction and a survey_16.gif

We can also obtain a complete solution without a restriction on the domain of solutions.

1. Introduction and a survey_17.gif

1. Introduction and a survey_18.gif


Here is an equation that seems impossible to solve by hand, but Reduce can do it:

1. Introduction and a survey_19.gif

1. Introduction and a survey_20.gif

1. Introduction and a survey_21.gif

1. Introduction and a survey_22.gif

All the solutions are complex numbers. Reduce can prove that there are no real solutions:

1. Introduction and a survey_23.gif

1. Introduction and a survey_24.gif

Here is a completely different kind of equation, this time over the integers.

1. Introduction and a survey_25.gif

1. Introduction and a survey_26.gif

Let’s now try something harder - a “real life” problem. There is an Internet forum, called the MathGroup,  where people post questions about Mathematica, including mathematical questions they try to solve with Mathematica. Solutions are posted by other users including some of the staff of Wolfram Research. One such question was posted by Ivan Smirnov in January 2011 (the whole thread can be found here: Smirnov’s problem


Are there any integer solutions of 1. Introduction and a survey_27.gif?


It is easy to find trivial solutions where two of the three variables x,y,z are zero, so let’s look for such solutions. Reduce cannot solve the complete problem but it can quickly verify that there are no solutions for 1. Introduction and a survey_28.gif.

1. Introduction and a survey_29.gif

1. Introduction and a survey_30.gif

In fact (after changing certain settings which limit the number of cases Reduce will consider, one can verify that there are no solutions for 1. Introduction and a survey_31.gif.

Reduce can be very useful in many undergraduate courses. For example, in Analysis 1 one often needs to prove that a certain integer sequence is monotonic. Consider, for example, the problem

1. Introduction and a survey_32.gif

1. Introduction and a survey_33.gif

Programming

Although many problems can be solved just by applying built-in functions, in many cases there is no built-in function that will do all the work by itself. In such cases we need to do our own programming. Here are some recent problems taken from the MathGroup.

Find three 2 - digit prime numbers such that :
(i)  The average of any two of the three is a prime number, and
(ii) The average of all three is also a prime number


There is no Mathematica function that will automatically answer a question like this, but the answer can be found with a few lines of Mathematica code:

1. Introduction and a survey_34.gif

1. Introduction and a survey_35.gif


Here is another question from the MathGroup:


What' s the easiest way to determine the length of the repeating cycle for decimal expansions of fractions? For example, 1/7 == 0.14285714285714285714. . .so the length of its repeating cycle
(142857) is 6. For 1/3 the length of the cycle is obviously 1. For some fractions, e.g., 1/4, the decimal expansion is not cyclical (in base 10).


We use programming to define a function lengthOfCycle. We make use of several built-in Mathematica functions, in particular, IntegerExponent and MultiplicativeOrder.  If we could not use these functions the program would have to be much longer, more complicated and less efficient.

1. Introduction and a survey_36.gif

1. Introduction and a survey_37.gif

1. Introduction and a survey_38.gif

In certain situations programs written in  Mathematica programming language can be much slower than programs written in typed and compiled languages such as C, Java, etc (although, of course, writing such programs in Mathematica is almost always much quicker). However, for many types of programs this difference can be greatly reduced by “compiling”. Not every kind of Mathematica program can be successfully compiled but when it can, this can make a very big difference to performance. Here is an example where a non-compiled Mathematica program performs rather poorly. We will give only a compiled version, that is very fast. The program constructs an Ulam spiral and is due to Daniel Lichtblau of Wolfram Research:

1. Introduction and a survey_39.gif


Making a spiral with 60 000 points takes only a fraction of a second:

1. Introduction and a survey_40.gif

1. Introduction and a survey_41.gif

We can view the spiral as a collection of points:

1. Introduction and a survey_42.gif

1. Introduction and a survey_43.gif

or of lines

1. Introduction and a survey_44.gif

1. Introduction and a survey_45.gif


In Mathematica version 8, this can be speeded up further by using the option CompilationTarget›C, which however, requires that a C-compiler be installed on the computer.

Specialized Mathematics

Mathematica contains a large number of specialized functions for various areas of mathematics, ranging from Group Theory and Number Theory to Statistics (a vast number of statistical distributions are available as built-in functions) and financial mathematics. A particularly interesting aspect is Mathematica’s ability to obtain live financial data from the Internet and analyze them by means of a variety of specific financial functions. As an example we compare the performance of the value of the index of the American NASDAQ stock exchange (on which most US technology companies are represented) and of Apple Computer Inc.

1. Introduction and a survey_46.gif

1. Introduction and a survey_47.gif

1. Introduction and a survey_48.gif

1. Introduction and a survey_49.gif

1. Introduction and a survey_50.gif

1. Introduction and a survey_51.gif

Graphics

Mathematica has remarkable graphic capabilities. Here is an example of a mathematical graphic related to the subject of iteration of functions in the complex plane and “fractals”.

1. Introduction and a survey_52.gif

Beyond Graphics - Interactive Dynamics


A completely new set of features, that have nothing quite similar in other programs, appeared in Mathematica 6.  These involve interactive “dynamic” abilities that are difficult to describe in a static format, but can be seen below.


Wolfram Demonstrations Project

It is difficult to describe on a static page how remarkably useful this functionality is in all kinds of situations, including both research and teaching. A single interactive Mathematica notebook can replace dozens of static pictures.

Here we see one example.  It shows the convergence of the power series 1. Introduction and a survey_53.gif on the unit disk {z}?1 for k=0,1,2….  Here we only see the case n=1, when the series converges in the unit disk and everywhere on the boundary except at the point z=1. The graphic on the left shows the complex values over the unit disk of a finite sum of terms of the series, on the right we see the values of the analytic function defined by the series. The modulus of the complex values of a function is represented by the height of the graph and the argument by colour. In the first graphic a shorter finite sum is used, in the second a longer. We can see the improvement in the approximation and the singular behaviour at z=1. We can also interactively choose any point on the unit disk and see the modulus of the difference between the values of the corresponding finite sum and the infinite series. Again, this is the sort of thing that would be very difficult to reproduce by other means.

1. Introduction and a survey_54.gif

The CDF Format and the CDF Player

With version 8 of Mathematica a new file format for Mathematica files was introduced.

The CDF player makes it easy to use Mathematica in class or at home even when students do not have Mathematica themselves. It is a free program that can be downloaded from Wolfram’s web site.
Wolfram CDF Player

Wolfram Alpha

Wolfram Alpha - Mathematica for everyone!


Wolfram Alpha received a great deal of publicity when it first appeared and it may even be better known than Mathematica, but not many people seem to realize that Wolfram Alpha is based on Mathematica and, in effect, provides the general public with free access to much of Mathematica’s functionality. Moreover, it does not require learning the Mathematica syntax. Indeed, the most famous aspect of Wolfram Alpha is its ability to use “free form” mathematical input - just type in what you want Wolfram Alpha to do for you in ordinary English (other language input is planned for the future) and Wolfram Alpha will attempt to guess what you want and then will use Mathematica to obtain the answer. In fact, the answers returned my Wolfram Alpha are generally more complete then Mathematica would normally return (they can all be obtained with Mathematica but it may require several commands or even some programming). Here is an example of computing the integral ?x log(x)dx with Wolfram Alpha. Just type: “indefinite integral of x log(x) “ and you will obtain the output shown below. In versions of Mathematica earlier than 8, a very precise syntax would be needed to obtain the same result (version 8 of Mathematica can also use “free form” input).

1. Introduction and a survey_55.gif

Language Basics

1. Overview of Mathematica Features. Mathematica as a Calculator.

You can get a lot of information from the Help Browser (to access it press F1 or use the Help menu).

One  can use Mathematica just like a calculator: one types in formulas and Mathematica returns back their values.  Just press SHIFT + ENTER (RETURN) to tell Mathematica to evaluate the input you have given it.

Example.

2. Language Basics_1.gif

( press SHIFT + ENTER after putting the cursor after 2 + 2 to see the output)

2. Language Basics_2.gif

2. Language Basics_3.gif

With a text - based interface, you interact with Mathematica just by typing successive lines of input, and getting back successive lines of output on your screen.

At each stage, Mathematica prints a prompt of the form In[n] := to tell you that it is ready to receive input. When you have entered your input, Mathematica processes it, and then displays the result with a label of the form Out[n] =.
Different text - based interfaces use slightly different schemes for letting Mathematica know when you have finished typing your input.With some interfaces you press Shift - Return, while in others Return alone is sufficient.

An important feature of Mathematica is its ability to handle formulas as well as numbers. Whenever you use Mathematica, you are accessing the world' s largest collection of computational algorithms. Mathematica knows about all the hundreds of special functions in pure and applied mathematics (e.g., Chebyshev polynomials, Bessel functions).

Example.  The following function computes the 10th degree Chebyshev polynomial and the next one  draws the function  on the interval [-1, 1].

2. Language Basics_4.gif

2. Language Basics_5.gif

2. Language Basics_6.gif

2. Language Basics_7.gif

Let's see what happens when we use the same input in WolframAlpha:

2. Language Basics_8.gif
Note the two links at the lower right hand corner: Download as PDF and Live Mathematica. The first one is obvious. The second one needs the CDF Player plug-in to be installed.

In general, Mathematica notebooks allow importing and exporting of many formats. One can prepare even a slide show in Mathematica.

Kernel and FrontEnd


Mathematica consists of two independent computational environments called the FrontEnd and the Kernel, which communicate by means of a protocol called MathLink. The Kernel does all the computations. The FrontEnd is what you see in front of you, including the window, menu, etc. You can use many FrontEnds with one Kernel but the usual FrontEnd is what is know a notebook FrontEnd (there are also ASCII front ends you can run using a terminal interface).

The Kernel is the basic programing environment and in fact it can be used to completely control the FrontEnd. We will give a few examples, but we will not use much of this. For example:

2. Language Basics_9.gif

2. Language Basics_10.gif

2. Language Basics_11.gif

2. Language Basics_12.gif

2. Language Basics_13.gif

2. Language Basics_14.gif

2. Language Basics_15.gif

2. Language Basics_16.gif

The FrontEnd itself can also be “programmed” independently of the Kernel. This will be more important for us later, in building interfaces.

Mathematica notebooks

Mathematica is one of the largest single application programs ever developed, and it contains a vast array of algorithms and important technical innovations. Among these innovations is the concept of platform - independent interactive documents known as notebooks.

Every Mathematica notebook is a complete interactive document combining text, tables, graphics, calculations, and other elements. A Mathematica notebook consists of a list of cells, which you can group (sections etc).

Exercise. Click on different brackets on the right  in this notebook with a right mouse button to find out the style being used.

Palettes and buttons provide a simple but fully customizable point - and - click interface to Mathematica (for Greek symbols, signs of integral, simple build - in functions, etc).
Recently Wolfram Research has expanded the concept of a notebook by introducing a new document format called CDF (“Computable Document Format”) which unlike traditional notebooks allows interactive “dynamic” content.

The Unifying Idea of Mathematica

Mathematica is built on the powerful unifying idea that everything can be represented as a symbolic expression.

Main Features of Mathematica

Once one starts experimenting in Mathematica, one  immediately notices some of its main features.
1. One important feature of Mathematica that differs from other computer languages, and from conventional mathematical notation, is that function arguments are enclosed in square brackets, not parentheses. Parentheses in Mathematica are reserved specifically for indicating the grouping of terms. There is obviously a need to  distinguish giving arguments to a function from grouping terms together.
2. Names of built-in functions start with a capital letter.
3. Multiplication is represented either by * or by a space.
4. Powers are denoted by ^.
5. Numbers in scientific notation are entered, for example, as 2.5*^-4 or 2.5 10^-4.
6. There is a general convention in Mathematica that all function names are spelled out as full English words, unless there is a standard mathematical abbreviation for them. The great advantage of this scheme is that it is predictable. Once you know what a function does, you will usually be able to guess exactly what its name is. If the names were abbreviated, you would always have to remember which shortening of the standard English words was used.
7. Another feature of built - in Mathematica names is that they all start with capital letters. The capital letter convention makes it easy to distinguish built - in objects. If Mathematica used max instead of Max to represent the operation of finding a maximum, then you would never be able to use max as the name of one of your variables. In addition, when you read programs written in Mathematica, the capitalization of built - in names makes them easier to pick out.
8. N is a function that turns exact numbers and certain symbols into approximate numbers. For example:

2. Language Basics_17.gif

2. Language Basics_18.gif

2. Language Basics_19.gif

2. Language Basics_20.gif

Hence N cannot be used for a function or a variable name. The same is true of some other symbols written with a capital letter (e.g. E,C). For that reason it is important to follow the convention that user defined symbols begin with a small letter.

A quick access to help information is achieved by typing the question mark :

2. Language Basics_21.gif

2. Language Basics_22.gif

2. Language Basics_23.gif

2. Language Basics_24.gif

The quick access to help is also by highlighting the word and then pressing F1.

To get help for the command/operator you know you need to type ? and the command/operator. If you do not know the operator, search the Help Browser.

2. Language Basics_25.gif

2. Language Basics_26.gif

Mathematica understands lists as {a, b, c} (in the full form it is  List[a, b, c]). One can learn later on that many objects in Mathematica are written by using lists. For instance, a matrix can be inserted in the following way: go to the main menu; insert; tables/matrices:

???
???
???

Next one just needs to put the brackets and fill in the matrix elements by clicking on each empty square :

2. Language Basics_27.gif

The result is :

2. Language Basics_28.gif

The same matrix can be entered like this :

2. Language Basics_29.gif

2. Language Basics_30.gif

2. Language Basics_31.gif

2. Language Basics_32.gif

Here % means the last expression.

2. Language Basics_33.gif

2. Language Basics_34.gif

2. Language Basics_35.gif

2. Language Basics_36.gif

2. Language Basics_37.gif

2. Language Basics_38.gif

Here %% means the last but one expression.

Example.

2. Language Basics_39.gif

2. Language Basics_40.gif

2. Language Basics_41.gif

One can type many symbols without using palettes. For instance, to type in ?, one needs to press esc then type in pi then press esc once again.   

Example.

The use of Ctrl+6:

2. Language Basics_42.gif

esc+i+i+esc

2. Language Basics_43.gif

esc+pi+esc

2. Language Basics_44.gif

Alt+7 (applying to the blue bracket on the right): gives text in the notebook.

A very useful trick is the formula completion feature. Suppose, for example, you wish to use a function whose name begins with Plot but you can’t quite remember the rest of it. Just type in the beginning of the name and press the Control key (Command key on the Macintosh) and the letter K. You will see a pop up menu of all functions whose name begins with Plot. If you decide you want to use the function Plot3D you can type the name Plot3D and press Control and Shift keys together with the K key. You will see a template:

2. Language Basics_45.gif

An overview of programming techniques

For most of the more complex problems that one wants to solve with Mathematica, one has to create Mathematica programs oneself. Mathematica supports several styles of programming, and one is free to choose the one, one is most comfortable with. However, it turns out that no single type of programming suits all cases equally. As a result, it is useful to learn several different types of programming.

Traditional programming language such as C or Fortran use  procedural programming (assignments and loops such as Do, For, While and so on). They also exist in Mathematica. But while any Mathematica program can, in principle, be written in a procedural way, this is rarely the best approach. In a symbolic system like Mathematica, functional and rule - based programming typically yields programs that are more efficient, and easier to understand.

Some types of programming :
Procedural Programming
List - based Programming (Many operations are automatically threaded over lists, a starting point to learn).
Functional Programming
Rule - Based Programming
Mixed Programming Paradigms

There are typically many different ways to formulate a given problem in Mathematica. In almost all cases, however, the most direct, precise and simple formulations will be best.

There are dozen of definitions of the factorial function (see later on).

 

Expressions


All objects in Mathematica programming language are expressions. For example

2. Language Basics_46.gif

2. Language Basics_47.gif

2. Language Basics_48.gif

2. Language Basics_49.gif

2. Language Basics_50.gif

2. Language Basics_51.gif

2. Language Basics_52.gif

2. Language Basics_53.gif

2. Language Basics_54.gif

2. Language Basics_55.gif

2. Language Basics_56.gif

2. Language Basics_57.gif

are all different kinds of expressions.  These expressions often look like mathematical formulas (more about that later on), which makes them more understandable and memorable to humans, but actually that have an internal form that is very simple and very consistent. It is called the “Full Form” of an expression and can be seen by applying the function FullForm to it (but there is a caveat, see below).

FullForm of expressions

Each expression is either an Atom or has the form

2. Language Basics_58.gif

where F is called the Head of the expression and a1, a2, are expressions. Examples of atoms are  2,a,3/4,3.2, "cat". Whether something is an atom can be tested with the function AtomQ:

2. Language Basics_59.gif

2. Language Basics_60.gif

2. Language Basics_61.gif

2. Language Basics_62.gif

Expressions often do not look like their FullForms, for example  a+b has FullForm:

2. Language Basics_63.gif

2. Language Basics_64.gif

2. Language Basics_65.gif

2. Language Basics_66.gif

2. Language Basics_67.gif

2. Language Basics_68.gif

2. Language Basics_69.gif

2. Language Basics_70.gif

2. Language Basics_71.gif

2. Language Basics_72.gif

2. Language Basics_73.gif

2. Language Basics_74.gif

Note that atoms also have Head:

2. Language Basics_75.gif

2. Language Basics_76.gif

2. Language Basics_77.gif

2. Language Basics_78.gif

2. Language Basics_79.gif

2. Language Basics_80.gif

Note also that :

2. Language Basics_81.gif

2. Language Basics_82.gif

2. Language Basics_83.gif

2. Language Basics_84.gif

2. Language Basics_85.gif

2. Language Basics_86.gif

2. Language Basics_87.gif

2. Language Basics_88.gif

Evaluation of x to 1 caused this to happen. You can see the original Head by preventing evaluating e.g.

2. Language Basics_89.gif

2. Language Basics_90.gif

2. Language Basics_91.gif

2. Language Basics_92.gif

2. Language Basics_93.gif

2. Language Basics_94.gif

2. Language Basics_95.gif

2. Language Basics_96.gif

The full form of  

2. Language Basics_97.gif

is

2. Language Basics_98.gif

2. Language Basics_99.gif

2. Language Basics_100.gif

It is important to distinguish the assignment Set from Equal, which is usually written as == and has

2. Language Basics_101.gif

2. Language Basics_102.gif

2. Language Basics_103.gif

2. Language Basics_104.gif

2. Language Basics_105.gif

2. Language Basics_106.gif

2. Language Basics_107.gif

2. Language Basics_108.gif

2. Language Basics_109.gif

Parts of Expressions

A very important skill is extracting parts of expressions. An expression is really a tree-like object, as can be seen using the function TreeForm:

2. Language Basics_110.gif

2. Language Basics_111.gif

2. Language Basics_112.gif

2. Language Basics_113.gif

2. Language Basics_114.gif

2. Language Basics_115.gif

2. Language Basics_116.gif

2. Language Basics_117.gif

2. Language Basics_118.gif

2. Language Basics_119.gif

2. Language Basics_120.gif

2. Language Basics_121.gif

2. Language Basics_122.gif

2. Language Basics_123.gif

2. Language Basics_124.gif

2. Language Basics_125.gif

2. Language Basics_126.gif

2. Language Basics_127.gif

2. Language Basics_128.gif

2. Language Basics_129.gif

2. Language Basics_130.gif

2. Language Basics_131.gif

2. Language Basics_132.gif

2. Language Basics_133.gif

2. Language Basics_134.gif

2. Language Basics_135.gif

2. Language Basics_136.gif


and so on.

You can also do this from the back :

2. Language Basics_137.gif

2. Language Basics_138.gif

2. Language Basics_139.gif

2. Language Basics_140.gif

2. Language Basics_141.gif

2. Language Basics_142.gif

2. Language Basics_143.gif

2. Language Basics_144.gif

2. Language Basics_145.gif

2. Language Basics_146.gif

Now, here comes a very nice and important fact: you can change an expression by an assignment to a part of it. For example;

2. Language Basics_147.gif

2. Language Basics_148.gif

2. Language Basics_149.gif

2. Language Basics_150.gif

2. Language Basics_151.gif

$

A very important thing to notice that in Mathematica lists are just expressions with Head List:

2. Language Basics_152.gif

2. Language Basics_153.gif

2. Language Basics_154.gif

2. Language Basics_155.gif

2. Language Basics_156.gif

A matrix is simply a list of lists of the same length:

2. Language Basics_157.gif

2. Language Basics_158.gif

2. Language Basics_159.gif

2. Language Basics_160.gif

2. Language Basics_161.gif

2. Language Basics_162.gif

2. Language Basics_163.gif

2. Language Basics_164.gif

2. Language Basics_165.gif

2. Language Basics_166.gif

2. Language Basics_167.gif

2. Language Basics_168.gif

2. Language Basics_169.gif

2. Language Basics_170.gif

We will later see how to easily create arbitrarily large matrices using the functions Table and Array.

2. Language Basics_171.gif

2. Language Basics_172.gif

2. Language Basics_173.gif

2. Language Basics_174.gif

A note on forms of expressions.

We already know that a Mathematica expression often looks different to human eyes than its internal form (FullForm). However, the situation is made more complicated, by the fact that traditional mathematical notation is not unambiguous. Because of this and for reasons of history Mathematica has several “forms” of input and output.  The first versions of Mathematica has only two forms: InputForm, which looked like a standard programming language (e.g. Fortran) way of writing mathematical formulas and OutputForm, which is a little more like usual mathematics and has become completely obsolete (it retained only for reasons of compatibility with very early Mathematica notebooks). Since then they have both been replaced by StandardForm and TraditionalForm. StandardForm retains the basic principles of InputForm but allows more usual mathematical expressions. TraditionalForm looks almost like the usual mathematical notation. One can convert between these forms using the Convert To sub menu in the Cell menu. One can also set the default forms for the Input and Output in the Preferences menu.

Basic principles of InputForm (and StandardForm)

1. All built in functions start with a capital letter.

2. Square brackets [] are used as function brackets.

3. (InputForm) The basic arithmetical operations are denoted by + (addition),* or space (multiplication) / (division), ^ (power).

4.  There are the following inclusions InputForm ? StandardForm ? TraditionalForm but not in the opposite direction.

Links

http://reference.wolfram.com/Mathematica/guide/Expressions.html

 

 

 

 

2. Working with Lists

One of the most common expressions in Mathematica are lists.

2. Language Basics_175.gif

2. Language Basics_176.gif

2. Language Basics_177.gif

2. Language Basics_178.gif

2. Language Basics_179.gif

2. Language Basics_180.gif

2. Language Basics_181.gif

2. Language Basics_182.gif

Let us also recall that the matrix is entered by using lists :

2. Language Basics_183.gif

2. Language Basics_184.gif

Let us learn  how to generate lists and what basic operations one can perform with them.  Another useful command is Table

2. Language Basics_185.gif

2. Language Basics_186.gif

2. Language Basics_187.gif

3
2
3
6

One can generate not only numbers but also other expressions :

2. Language Basics_188.gif

2. Language Basics_189.gif

Some commonly used objects are already defined in Mathematica. For instance, the identity matrix :

2. Language Basics_190.gif

2. Language Basics_191.gif

For the matrices Mathematica has a lot of build - in operations

2. Language Basics_192.gif

2. Language Basics_193.gif

2. Language Basics_194.gif

2. Language Basics_195.gif

Basic operations for the lists include the following :

2. Language Basics_196.gif

2. Language Basics_197.gif

2. Language Basics_198.gif

2. Language Basics_199.gif

A scalar product is given by a dot

2. Language Basics_200.gif

2. Language Basics_201.gif

However, one needs to be careful with length of the objects.

2. Language Basics_202.gif

2. Language Basics_203.gif

2. Language Basics_204.gif

Other useful operations include

2. Language Basics_205.gif

2. Language Basics_206.gif

2. Language Basics_207.gif

2. Language Basics_208.gif

2. Language Basics_209.gif

2. Language Basics_210.gif

2. Language Basics_211.gif

2. Language Basics_212.gif

2. Language Basics_213.gif

2. Language Basics_214.gif

Also have a look at commands Insert, Delete and many others in the help. The name of the command suggests unambiguously what it performs with a given list.

To get an element of the list one indicates its position.

2. Language Basics_215.gif

2. Language Basics_216.gif

2. Language Basics_217.gif

2. Language Basics_218.gif

Here - 1 means the first element counted from the end.

2. Language Basics_219.gif

2. Language Basics_220.gif

If you do not know how many elements are in the list, you can always verify this by using Length

2. Language Basics_221.gif

2. Language Basics_222.gif

2. Language Basics_223.gif

2. Language Basics_224.gif

A similar command for the dimension of the list is Dimensions

2. Language Basics_225.gif

2. Language Basics_226.gif

2. Language Basics_227.gif

2. Language Basics_228.gif

This counts the elements of the first level in the list.

In applications one often encounters the problem to verify whether a given element is in the list and if so, one might require further its position.

2. Language Basics_229.gif

2. Language Basics_230.gif

Here Position takes account of the nesting of lists.

Since the lists can be nested, it is useful to know that they can always be flattened.

2. Language Basics_231.gif

2. Language Basics_232.gif

2. Language Basics_233.gif

2. Language Basics_234.gif

To get rid of repeated elements one uses Union

2. Language Basics_235.gif

2. Language Basics_236.gif

From a given list one can get a list of permutations and other lists of a given length with all elements of the original list

2. Language Basics_237.gif

2. Language Basics_238.gif

2. Language Basics_239.gif

2. Language Basics_240.gif

2. Language Basics_241.gif

2. Language Basics_242.gif

Apply and Map

2. Language Basics_243.gif

2. Language Basics_244.gif

Let us form a new expression from the list and the other way round.

2. Language Basics_245.gif

2. Language Basics_246.gif

2. Language Basics_247.gif

2. Language Basics_248.gif

2. Language Basics_249.gif

2. Language Basics_250.gif

2. Language Basics_251.gif

2. Language Basics_252.gif

Another example is

2. Language Basics_253.gif

2. Language Basics_254.gif

A more complicated example is to generate a list of coefficients (maybe useful for polynomial expressions)

2. Language Basics_255.gif

2. Language Basics_256.gif

Here /@ means Map.  

2. Language Basics_257.gif

2. Language Basics_258.gif

Here there is a trivial example of forming a list.

2. Language Basics_259.gif

2. Language Basics_260.gif

2. Language Basics_261.gif

2. Language Basics_262.gif

Therefore, the command /@ works as follows. It applies the function 2. Language Basics_263.gif to every element of the list k.  (Here we  meet  an example of a pure function, the concept which will be discused below.)

Evaluation

A very important concept in Mathematica is that of evaluation. In Mathematica evaluation always takes place after you write some input and press Shift + Enter. The process of evaluation is quite complicated, and follows a definite sequence of steps. Understanding this process is important in advanced Mathematica programming and we will return to this in the future.  Often the evaluation process takes place even if nothing seems to happen. For example:

2. Language Basics_264.gif

2. Language Basics_265.gif

2. Language Basics_266.gif

2. Language Basics_267.gif

2. Language Basics_268.gif

2. Language Basics_269.gif

2. Language Basics_270.gif

2. Language Basics_271.gif

2. Language Basics_272.gif

FullForm[Hold[2 + 3*I]]

2. Language Basics_273.gif

2. Language Basics_274.gif

2. Language Basics_275.gif

2. Language Basics_276.gif

2. Language Basics_277.gif

2. Language Basics_278.gif

2. Language Basics_279.gif

2. Language Basics_280.gif

An interesting special case are graphics.

 

2. Language Basics_281.gif

2. Language Basics_282.gif

2. Language Basics_283.gif

2. Language Basics_284.gif

We  see that a plot of a function is also a Mathematica Graphics object.  One can therefore use the Mathematica programing language to control every detail of a graphic. Graphic programming in Mathematica is a whole big subject, but we will see a few examples later on.

It is possible to think of Mathematica as an algebraic object, somewhat like a ring, with partial addition and multiplication. This means that you can perform algebraic operations which are purely formal, for example, you can raise a number to the power of a graphic:

2. Language Basics_285.gif

2. Language Basics_286.gif

In some situations arithmetical operations on objecs of different kind are defined, for example, it is possible to add a number (or a symbol) to a list:

2. Language Basics_287.gif

2. Language Basics_288.gif

However, in certain cases, trying to perform such an operation on objects of different kind will cause a error message:

2. Language Basics_289.gif

2. Language Basics_290.gif

2. Language Basics_291.gif

Here is an example of abstract algebraic manipulation performed on strings:

2. Language Basics_292.gif

2. Language Basics_293.gif

The evaluation loop.

When you enter an input expression Mathematica’s Kernel evaluates in a very definite order. Understanding this order is important for Mathematica programming. The evaluation order will be described carefully later once we learn about rules and patterns. However, the basic idea is this: Mathematica evaluates each part of the expression by turn, starting with the Head.  It applies all rules it knows for the expression, first user defined then built in ones, until it can no longer find a rule. Then it stops and “returns” the result. (Sometimes this evaluation will not stop and we get into an infinite loop. Actually Mathematica will almost always detect such situations and will stop, unless we change the defaults to make it run for ever).

Programming using Patterns and Rules

Mathematica allows many different styles of programming. There is one style that, although not  unique to Mathematica, distinguishes it from most other similar systems. This is the possibility of using "patterns" and "re-write rules" or just "rules".
The basic concepts in this kind of programming are  "rule" and "pattern".  Rules can be local and global.

Local Rules

A local rule always has the form

2. Language Basics_294.gif

2. Language Basics_295.gif

or

2. Language Basics_296.gif

2. Language Basics_297.gif

Note that:

2. Language Basics_298.gif

2. Language Basics_299.gif

2. Language Basics_300.gif

2. Language Basics_301.gif

The difference between Rule and RuleDelayed will be explained below. Most often Rule is used together with the function ReplaceAll (see also Replace):

2. Language Basics_302.gif

2. Language Basics_303.gif

Here are some examples of using  rules (in some of these examples the output appears in TraditionalForm).

2. Language Basics_304.gif

2. Language Basics_305.gif

Now we use a more general rule. This time we use a "pattern"

2. Language Basics_306.gif

2. Language Basics_307.gif

2. Language Basics_308.gif

2. Language Basics_309.gif

The reason for the above result is that ReplaceAll starts looking for a match starting at the top level of the expression and when it finds a match it stops looking for more. If we want to find a match at a different level we can use the function Replace with a level specification. For example, here we replace everything on level 3 of the expression with ?.

2. Language Basics_310.gif

2. Language Basics_311.gif

2. Language Basics_312.gif

2. Language Basics_313.gif

2. Language Basics_314.gif

2. Language Basics_315.gif

2. Language Basics_316.gif

2. Language Basics_317.gif

2. Language Basics_318.gif

2. Language Basics_319.gif

2. Language Basics_320.gif

2. Language Basics_321.gif

2. Language Basics_322.gif

2. Language Basics_323.gif

2. Language Basics_324.gif

2. Language Basics_325.gif

2. Language Basics_326.gif

2. Language Basics_327.gif

2. Language Basics_328.gif

2. Language Basics_329.gif

These examples illustrate some of the very many ways of forming patterns in Mathematica. The most basic pattern is x_ which stands for anything that is (locally) assigned the name x.

Here is an example where Rule and RuleDelayed give different answers:

2. Language Basics_330.gif

2. Language Basics_331.gif

2. Language Basics_332.gif

2. Language Basics_333.gif

2. Language Basics_334.gif

Before using a rule it is a good idea to look at the FullForm of an expression. Here are some possible “traps”:

2. Language Basics_335.gif

2. Language Basics_336.gif

2. Language Basics_337.gif

2. Language Basics_338.gif

2. Language Basics_339.gif

2. Language Basics_340.gif

2. Language Basics_341.gif

2. Language Basics_342.gif

2. Language Basics_343.gif

2. Language Basics_344.gif

2. Language Basics_345.gif

Rule based programming is very convenient when dealing with graphics.

2. Language Basics_346.gif

2. Language Basics_347.gif

2. Language Basics_348.gif

2. Language Basics_349.gif

2. Language Basics_350.gif

2. Language Basics_351.gif

2. Language Basics_352.gif

2. Language Basics_353.gif

2. Language Basics_354.gif

2. Language Basics_355.gif

2. Language Basics_356.gif

2. Language Basics_357.gif

Many Mathematica functions return a list of rules as the output.

2. Language Basics_358.gif

2. Language Basics_359.gif

Note that this is actually a list of lists, each containing one rule.

This is very convenient, because we can use ReplaceAll to substitute these rules into other formulas. For example:

2. Language Basics_360.gif

2. Language Basics_361.gif

2. Language Basics_362.gif

2. Language Basics_363.gif

2. Language Basics_364.gif

2. Language Basics_365.gif

Here is a similar example with FindRoot instead of Solve

2. Language Basics_366.gif

2. Language Basics_367.gif

2. Language Basics_368.gif

2. Language Basics_369.gif

Links

http : // reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html

Global Rules ("Functions")

Here is one way to define  a "function" in Mathematica:

2. Language Basics_370.gif

2. Language Basics_371.gif

2. Language Basics_372.gif

2. Language Basics_373.gif

2. Language Basics_374.gif

2. Language Basics_375.gif

2. Language Basics_376.gif

2. Language Basics_377.gif

2. Language Basics_378.gif

2. Language Basics_379.gif

Global`f

2. Language Basics_380.gif

2. Language Basics_381.gif

2. Language Basics_382.gif

Although  people often call f defined in this way a function, actually it is only a "global rule". More precisely, when a definition of this kind is evaluated, Mathematica creates a rule for the symbol f, which it uses every time when f is used. The rule is stored as a DownValue of f:

2. Language Basics_383.gif

2. Language Basics_384.gif

2. Language Basics_385.gif

Here x_ is a "pattern", which stands for "anything", with a temporary name "x". The rule says "change f(anything) to 2. Language Basics_386.gif". HoldPattern prevents evaluation of f(x_) (which would otherwise be replaced by 2. Language Basics_387.gif but  f[x_] is treated as a pattern for matching purposes.

So what happens when we evaluate definitions of this kind is this:  Mathematica makes certain rules, stores them, and then applies them in a certain order. Here is an example:

2. Language Basics_388.gif

2. Language Basics_389.gif

2. Language Basics_390.gif

2. Language Basics_391.gif

2. Language Basics_392.gif

2. Language Basics_393.gif

2. Language Basics_394.gif

2. Language Basics_395.gif

2. Language Basics_396.gif

2. Language Basics_397.gif

2. Language Basics_398.gif

2. Language Basics_399.gif

2. Language Basics_400.gif

2. Language Basics_401.gif

2. Language Basics_402.gif

2. Language Basics_403.gif

2. Language Basics_404.gif

2. Language Basics_405.gif

2. Language Basics_406.gif

2. Language Basics_407.gif

2. Language Basics_408.gif

2. Language Basics_409.gif

2. Language Basics_410.gif

2. Language Basics_411.gif

2. Language Basics_412.gif

2. Language Basics_413.gif

2. Language Basics_414.gif

2. Language Basics_415.gif

2. Language Basics_416.gif

2. Language Basics_417.gif

2. Language Basics_418.gif

2. Language Basics_419.gif

2. Language Basics_420.gif

2. Language Basics_421.gif

2. Language Basics_422.gif

2. Language Basics_423.gif

The order in which rules are applied by Mathematica is roughly determined by two facts; more specific rules are applied before more general rules, and rules of equal generality are applied in the order they are entered.


In addition to DownValues there are also OwnValues and UpValues  (and some other Values) created as follows:

2. Language Basics_424.gif

2. Language Basics_425.gif

2. Language Basics_426.gif

2. Language Basics_427.gif

2. Language Basics_428.gif

2. Language Basics_429.gif

2. Language Basics_430.gif

2. Language Basics_431.gif

2. Language Basics_432.gif

2. Language Basics_433.gif

When an  expression is evaluated, Mathematica applies the rules contained in UpValues, DownValues, and so on in a certain order, after which it applies the built-in rules. It keeps evalutating the resulting expression until it stops changing. Note also that certain built in rules are applied by Mathematica automatically on evaluation but others require using a special function such as Simplify or FullSimplify. For example the transformation

2. Language Basics_434.gif

2. Language Basics_435.gif

2. Language Basics_436.gif

while

2. Language Basics_437.gif

2. Language Basics_438.gif

does not automatically simplify to 1 but

2. Language Basics_439.gif

2. Language Basics_440.gif

Some simplifications only work with specific assumptions:

2. Language Basics_441.gif

2. Language Basics_442.gif

2. Language Basics_443.gif

2. Language Basics_444.gif

2. Language Basics_445.gif

2. Language Basics_446.gif

Mathematica generally tries to apply any transformations it knows to an expression until it no longer changes.  However, this is not the case when we use ReplaceAll.  ReplaceAll looks for patterns in all the parts of an expression, but only looks for one match in each part. So, if we have only more than one rule, we may not obtain all the transformations we wish to get:

2. Language Basics_447.gif

2. Language Basics_448.gif

2. Language Basics_449.gif


In order to obtain all transformations we should use ReplaceRepeated (//.) instead of ReplaceAll (/.).

2. Language Basics_450.gif

2. Language Basics_451.gif

Another important thing: Options of Mathematica's functions are given as Rules.

2. Language Basics_452.gif

2. Language Basics_453.gif

2. Language Basics_454.gif

2. Language Basics_455.gif

2. Language Basics_456.gif

2. Language Basics_457.gif

The difference between := and =

The difference between :=and= is exactly the same as that between :› and ›. Note these FullForms:

2. Language Basics_458.gif

2. Language Basics_459.gif

2. Language Basics_460.gif

2. Language Basics_461.gif

Consider the following two definitions:

2. Language Basics_462.gif

2. Language Basics_463.gif

2. Language Basics_464.gif

2. Language Basics_465.gif

2. Language Basics_466.gif

2. Language Basics_467.gif

If we apply them to an expression like 2. Language Basics_468.gif we will get quite different results:

2. Language Basics_469.gif

2. Language Basics_470.gif

2. Language Basics_471.gif

2. Language Basics_472.gif

The reason is that = evaluates the right hand side before assigning the evaluated value to the left hand side, while := assigns the unevaluated right hand side to the left hand side.

Links

http : // reference.wolfram.com/mathematica/tutorial/ManipulatingValueLists.html

http : // reference.wolfram.com/mathematica/tutorial/ManipulatingOptions.html

Functions and Functional Programming

Pure Functions

In addition to functions defined by means of global rules Mathematica also has "genuine functions", defined as follows:

2. Language Basics_473.gif

2. Language Basics_474.gif

Note that such a function does not need to have a name (so it is called an anonymous function), although we can of course give it a name:

2. Language Basics_475.gif

2. Language Basics_476.gif

2. Language Basics_477.gif

2. Language Basics_478.gif

2. Language Basics_479.gif

2. Language Basics_480.gif

We can also, of course, in the same way, construct functions of several variables.

2. Language Basics_481.gif

2. Language Basics_482.gif

There are two problems with this approach. First, it is inconvenient to use letters for variable names. This problem is solved by using the notation #1, #2 ,... for the first, second, third etc., arguments. Thus:

2. Language Basics_483.gif

2. Language Basics_484.gif

Lastly, the word Function can be replaced by the shorthand & after the end of the function, as in

2. Language Basics_485.gif

2. Language Basics_486.gif

Predicates (Boolean Functions)

A common class of functions are functions whose value are the Boolean constants True and False. Such functions are called predicates. Most built in Mathematica predicates have names that end in Q:

2. Language Basics_487.gif

2. Language Basics_488.gif

2. Language Basics_489.gif

2. Language Basics_490.gif

2. Language Basics_491.gif

2. Language Basics_492.gif

Here are two ways of defining a predicate that test is a number is larger than 5:

2. Language Basics_493.gif

2. Language Basics_494.gif

2. Language Basics_495.gif

2. Language Basics_496.gif

2. Language Basics_497.gif

Here is the same thing done using a pure function

2. Language Basics_498.gif

2. Language Basics_499.gif

Such pure functions can be used in patterns:

2. Language Basics_500.gif

2. Language Basics_501.gif

2. Language Basics_502.gif

2. Language Basics_503.gif

2. Language Basics_504.gif

2. Language Basics_505.gif

2. Language Basics_506.gif

Functions that take Functions as arguments

In functional programming a very important role is played by functions that take functions as arguments. The most important of these are Map and Apply:

2. Language Basics_507.gif

2. Language Basics_508.gif

2. Language Basics_509.gif

2. Language Basics_510.gif

2. Language Basics_511.gif

2. Language Basics_512.gif

2. Language Basics_513.gif

2. Language Basics_514.gif

2. Language Basics_515.gif

2. Language Basics_516.gif

2. Language Basics_517.gif

2. Language Basics_518.gif

2. Language Basics_519.gif

2. Language Basics_520.gif

2. Language Basics_521.gif

2. Language Basics_522.gif

2. Language Basics_523.gif

2. Language Basics_524.gif

2. Language Basics_525.gif

Short notation:

2. Language Basics_526.gif

2. Language Basics_527.gif

2. Language Basics_528.gif

2. Language Basics_529.gif

Attributes and Listability

The behavior of Mathematica functions and global rules is affected by so called Attributes. Each built-in function has some attributes, for example

2. Language Basics_530.gif

2. Language Basics_531.gif

2. Language Basics_532.gif

2. Language Basics_533.gif

The most important attribute of functions is the attribute Listable. Let's explain briefly what it does.

2. Language Basics_534.gif

2. Language Basics_535.gif

2. Language Basics_536.gif

2. Language Basics_537.gif

2. Language Basics_538.gif

If we give f the Attribute Listable we will not need to use Map.

2. Language Basics_539.gif

2. Language Basics_540.gif

2. Language Basics_541.gif

In addition

2. Language Basics_542.gif

2. Language Basics_543.gif

2. Language Basics_544.gif

2. Language Basics_545.gif

The attribute Listable of Plus is the reason for the following behavior:

2. Language Basics_546.gif

2. Language Basics_547.gif

2. Language Basics_548.gif

2. Language Basics_549.gif

The attributes Orderless, Flat and OneIdentity are interesting, but complicated. Let’s  see an illustration

2. Language Basics_550.gif

2. Language Basics_551.gif

2. Language Basics_552.gif

2. Language Basics_553.gif

2. Language Basics_554.gif

2. Language Basics_555.gif

2. Language Basics_556.gif

2. Language Basics_557.gif

2. Language Basics_558.gif

2. Language Basics_559.gif

2. Language Basics_560.gif

2. Language Basics_561.gif


Another group of important attributes are HoldFirst, HoldAll, HoldRest

2. Language Basics_562.gif

2. Language Basics_563.gif

2. Language Basics_564.gif

2. Language Basics_565.gif

2. Language Basics_566.gif

2. Language Basics_567.gif

2. Language Basics_568.gif

2. Language Basics_569.gif

2. Language Basics_570.gif

2. Language Basics_571.gif

2. Language Basics_572.gif

Links

http : // reference.wolfram.com/mathematica/tutorial/PureFunctions.html

http : // reference.wolfram.com/mathematica/tutorial/ApplyingFunctionsToListsAndOtherExpressions.html

http : // reference.wolfram.com/mathematica/tutorial/Attributes.html

http : // reference.wolfram.com/mathematica/tutorial/SelectingPartsOfExpressionsWithFunctions.html

Graphics

One  can use Mathematica to make 2 D and 3 D graphics. It is perhaps the most straightforward and, at the same time, the most complicated section. It is straightforward since all the commands and properties one can find  in the Help Browser. However, the complicated part is to find the property  one needs among hundreds of similar ones.  Below there are only examples of some of the most commongly used graphic features. Moreover, the older versions of Mathematica might have different names and commands. The following pictures are drawn in Mathematica 7. The pictures are mostly self-explanatory and for the useage of unknown functions the reader is referred to the documentation center.

3. Graphics_1.gif

3. Graphics_2.gif

3. Graphics_3.gif

3. Graphics_4.gif

3. Graphics_5.gif

3. Graphics_6.gif

3. Graphics_7.gif

Graphics:circle

3. Graphics_9.gif

Graphics:ellipse

3. Graphics_11.gif

3. Graphics_12.gif

3. Graphics_13.gif

3. Graphics_14.gif

3. Graphics_15.gif

3. Graphics_16.gif

3. Graphics_17.gif

3. Graphics_18.gif

3. Graphics_19.gif

3. Graphics_20.gif

3. Graphics_21.gif

3. Graphics_22.gif

3. Graphics_23.gif

3. Graphics_24.gif

3. Graphics_25.gif

3. Graphics_26.gif

3. Graphics_27.gif

3. Graphics_28.gif

3. Graphics_29.gif

3. Graphics_30.gif

3. Graphics_31.gif

3. Graphics_32.gif

3. Graphics_33.gif

3. Graphics_34.gif

3. Graphics_35.gif

3. Graphics_36.gif

3. Graphics_37.gif

3. Graphics_38.gif

3. Graphics_39.gif

3. Graphics_40.gif

3. Graphics_41.gif

3. Graphics_42.gif

3. Graphics_43.gif

3. Graphics_44.gif

3. Graphics_45.gif

3. Graphics_46.gif

3. Graphics_47.gif

The function Show is used to combine several graphics togather.

3. Graphics_48.gif

3. Graphics_49.gif

3. Graphics_50.gif

3. Graphics_51.gif

3. Graphics_52.gif

Graphics[primitives, options]represents a two-dimensional graphical image (circle, disc, point, line, polygon, ... ).

3. Graphics_53.gif

3. Graphics_54.gif

3. Graphics_55.gif

3. Graphics_56.gif

3. Graphics_57.gif

3. Graphics_58.gif

3. Graphics_59.gif

3. Graphics_60.gif

3. Graphics_61.gif

3. Graphics_62.gif

3. Graphics_63.gif

3. Graphics_64.gif

3. Graphics_65.gif

3. Graphics_66.gif

3. Graphics_67.gif

3. Graphics_68.gif

3. Graphics_69.gif

3. Graphics_70.gif

3. Graphics_71.gif

3. Graphics_72.gif

3. Graphics_73.gif

3. Graphics_74.gif

3. Graphics_75.gif

3. Graphics_76.gif

3. Graphics_77.gif

3. Graphics_78.gif

3. Graphics_79.gif

3. Graphics_80.gif

3. Graphics_81.gif

3. Graphics_82.gif

3. Graphics_83.gif

3. Graphics_84.gif

3. Graphics_85.gif

3. Graphics_86.gif

3. Graphics_87.gif

3. Graphics_88.gif

Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 3, 1}]

3. Graphics_89.gif

g = ParametricPlot3D[
{x, Cos[t] Sin[x] , Sin[t] Sin[x]},
      {x, -Pi, Pi}, {t, 0, 2Pi},
      Axes -> False, Boxed -> False]

3. Graphics_90.gif

3. Graphics_91.gif

Graphics[{Arrow[{{0, 0},{1, 1}}],
    Hue[0], Arrow[{{.75, .25},{.25, .75}}]}]

3. Graphics_92.gif

Plot[Sin[x], {x, 0, 2Pi},
    Epilog -> {Arrow[{{4, .25}, {Pi/2, 1}}],
     Text["Here", {4, .15}, {0, -1}]}
]

3. Graphics_93.gif

ContourPlot[x^2 + 2 y^2 == 3, {x, -2, 2},{y,-2,2}]

3. Graphics_94.gif

ContourPlot[{(x^2 + y^2)^2 == (x^2 - y^2),
(x^2 + y^2)^2 == 2 x y}, {x,-2,2},{y,-2,2}
]

3. Graphics_95.gif

3. Graphics_96.gif

3. Graphics_97.gif

3. Graphics_98.gif

3. Graphics_99.gif

3. Graphics_100.gif

3. Graphics_101.gif

RevolutionPlot3D[
          Sin[x], {x, 0, 2 Pi}]

3. Graphics_102.gif

RevolutionPlot3D[{1.1 Sin[u], u^2},
  {u, 0, 3 Pi/2}, BoxRatios -> {1, 1, 2}]

3. Graphics_103.gif

RevolutionPlot3D[x^2, {x, 0, 1},
    RevolutionAxis -> {1, 1, 1}]

3. Graphics_104.gif

3. Graphics_105.gif

3. Graphics_106.gif

3. Graphics_107.gif

3. Graphics_108.gif

3. Graphics_109.gif

3. Graphics_110.gif

3. Graphics_111.gif

3. Graphics_112.gif

3. Graphics_113.gif

3. Graphics_114.gif

One can innsert a plot into a disk:

3. Graphics_115.gif

3. Graphics_116.gif

3. Graphics_117.gif

One can insert an expression in a graphic:

3. Graphics_118.gif

3. Graphics_119.gif

3. Graphics_120.gif

3. Graphics_121.gif

3. Graphics_122.gif

3. Graphics_123.gif

3. Graphics_124.gif

3. Graphics_125.gif

Introduction to Dynamic Interactivity

Mathematica has several  dynamic elements. It is very useful for visualization of the results if the problem contains some parameters and one wants to study it under the change of those parameters. You can study the following examples.

Example 1.

4. Intorduction-to-Dynamic-Interactivity_1.gif

4. Intorduction-to-Dynamic-Interactivity_2.gif

Example 2.

4. Intorduction-to-Dynamic-Interactivity_3.gif

4. Intorduction-to-Dynamic-Interactivity_4.gif

4. Intorduction-to-Dynamic-Interactivity_5.gif

4. Intorduction-to-Dynamic-Interactivity_6.gif

4. Intorduction-to-Dynamic-Interactivity_7.gif

4. Intorduction-to-Dynamic-Interactivity_8.gif

4. Intorduction-to-Dynamic-Interactivity_9.gif

4. Intorduction-to-Dynamic-Interactivity_10.gif

Other examples.

4. Intorduction-to-Dynamic-Interactivity_11.gif

4. Intorduction-to-Dynamic-Interactivity_12.gif

4. Intorduction-to-Dynamic-Interactivity_13.gif

4. Intorduction-to-Dynamic-Interactivity_14.gif

4. Intorduction-to-Dynamic-Interactivity_15.gif

4. Intorduction-to-Dynamic-Interactivity_16.gif

4. Intorduction-to-Dynamic-Interactivity_17.gif

4. Intorduction-to-Dynamic-Interactivity_18.gif

4. Intorduction-to-Dynamic-Interactivity_19.gif

4. Intorduction-to-Dynamic-Interactivity_20.gif

4. Intorduction-to-Dynamic-Interactivity_21.gif

4. Intorduction-to-Dynamic-Interactivity_22.gif

4. Intorduction-to-Dynamic-Interactivity_23.gif

4. Intorduction-to-Dynamic-Interactivity_24.gif

4. Intorduction-to-Dynamic-Interactivity_25.gif

4. Intorduction-to-Dynamic-Interactivity_26.gif

4. Intorduction-to-Dynamic-Interactivity_27.gif

4. Intorduction-to-Dynamic-Interactivity_28.gif

4. Intorduction-to-Dynamic-Interactivity_29.gif

4. Intorduction-to-Dynamic-Interactivity_30.gif

4. Intorduction-to-Dynamic-Interactivity_31.gif

4. Intorduction-to-Dynamic-Interactivity_32.gif

4. Intorduction-to-Dynamic-Interactivity_33.gif

4. Intorduction-to-Dynamic-Interactivity_34.gif

abc
xyz

4. Intorduction-to-Dynamic-Interactivity_35.gif

abc
x4. Intorduction-to-Dynamic-Interactivity_36.gif4. Intorduction-to-Dynamic-Interactivity_37.gif

4. Intorduction-to-Dynamic-Interactivity_38.gif

4. Intorduction-to-Dynamic-Interactivity_39.gif4. Intorduction-to-Dynamic-Interactivity_40.gif

4. Intorduction-to-Dynamic-Interactivity_41.gif

4. Intorduction-to-Dynamic-Interactivity_42.gif

4. Intorduction-to-Dynamic-Interactivity_43.gif

4. Intorduction-to-Dynamic-Interactivity_44.gif

4. Intorduction-to-Dynamic-Interactivity_45.gif

4. Intorduction-to-Dynamic-Interactivity_46.gif

4. Intorduction-to-Dynamic-Interactivity_47.gif

4. Intorduction-to-Dynamic-Interactivity_48.gif

4. Intorduction-to-Dynamic-Interactivity_49.gif

4. Intorduction-to-Dynamic-Interactivity_50.gif

4. Intorduction-to-Dynamic-Interactivity_51.gif

4. Intorduction-to-Dynamic-Interactivity_52.gif

4. Intorduction-to-Dynamic-Interactivity_53.gif

4. Intorduction-to-Dynamic-Interactivity_54.gif

4. Intorduction-to-Dynamic-Interactivity_55.gif

Manipulate options

4. Intorduction-to-Dynamic-Interactivity_56.gif

4. Intorduction-to-Dynamic-Interactivity_57.gif

4. Intorduction-to-Dynamic-Interactivity_58.gif

4. Intorduction-to-Dynamic-Interactivity_59.gif

4. Intorduction-to-Dynamic-Interactivity_60.gif

4. Intorduction-to-Dynamic-Interactivity_61.gif

4. Intorduction-to-Dynamic-Interactivity_62.gif

4. Intorduction-to-Dynamic-Interactivity_63.gif

4. Intorduction-to-Dynamic-Interactivity_64.gif

4. Intorduction-to-Dynamic-Interactivity_65.gif

4. Intorduction-to-Dynamic-Interactivity_66.gif

4. Intorduction-to-Dynamic-Interactivity_67.gif

4. Intorduction-to-Dynamic-Interactivity_68.gif

4. Intorduction-to-Dynamic-Interactivity_69.gif

4. Intorduction-to-Dynamic-Interactivity_70.gif

4. Intorduction-to-Dynamic-Interactivity_71.gif

4. Intorduction-to-Dynamic-Interactivity_72.gif

4. Intorduction-to-Dynamic-Interactivity_73.gif

4. Intorduction-to-Dynamic-Interactivity_74.gif

4. Intorduction-to-Dynamic-Interactivity_75.gif

4. Intorduction-to-Dynamic-Interactivity_76.gif

4. Intorduction-to-Dynamic-Interactivity_77.gif

4. Intorduction-to-Dynamic-Interactivity_78.gif

4. Intorduction-to-Dynamic-Interactivity_79.gif

4. Intorduction-to-Dynamic-Interactivity_80.gif

4. Intorduction-to-Dynamic-Interactivity_81.gif

4. Intorduction-to-Dynamic-Interactivity_82.gif

4. Intorduction-to-Dynamic-Interactivity_83.gif

4. Intorduction-to-Dynamic-Interactivity_84.gif

4. Intorduction-to-Dynamic-Interactivity_85.gif

4. Intorduction-to-Dynamic-Interactivity_86.gif

4. Intorduction-to-Dynamic-Interactivity_87.gif

4. Intorduction-to-Dynamic-Interactivity_88.gif

4. Intorduction-to-Dynamic-Interactivity_89.gif

4. Intorduction-to-Dynamic-Interactivity_90.gif

4. Intorduction-to-Dynamic-Interactivity_91.gif

4. Intorduction-to-Dynamic-Interactivity_92.gif

4. Intorduction-to-Dynamic-Interactivity_93.gif

4. Intorduction-to-Dynamic-Interactivity_94.gif

4. Intorduction-to-Dynamic-Interactivity_95.gif

4. Intorduction-to-Dynamic-Interactivity_96.gif

4. Intorduction-to-Dynamic-Interactivity_97.gif

More Advanced Topics

Some Other topics

Dynamic Programming

Recursive programs are programs that "refer to themselves". Such programs can be very slow because they use a lot of "stack memory".  One way to speed them up is by means of "dynamic programming" or "functions that remember their values".  The best way to understand this method is by means of an example.

Fast Fibonacci numbers.

5. More Advanced Topics_1.gif

5. More Advanced Topics_2.gif

5. More Advanced Topics_3.gif

5. More Advanced Topics_4.gif

Let's compare the following two definitions of the Fibonacci numbers. First we start with a usual recursive definition.

5. More Advanced Topics_5.gif

5. More Advanced Topics_6.gif

5. More Advanced Topics_7.gif

5. More Advanced Topics_8.gif

This is very slow and already the 30th Fibonacci number takes a noticeable time to compute. Next, we try "dynamic programing". The definition looks a little strange; note the use of := and = .

5. More Advanced Topics_9.gif

5. More Advanced Topics_10.gif

5. More Advanced Topics_11.gif

5. More Advanced Topics_12.gif

5. More Advanced Topics_13.gif

Computing even the 50th Fibonacci number takes virtually no time.

We can see the difference between the two definitions by using the function Trace:

5. More Advanced Topics_14.gif

5. More Advanced Topics_15.gif

5. More Advanced Topics_16.gif

5. More Advanced Topics_17.gif

The first function repeatedly performs the same computation (see Fib1[3] and Fib2[3] in the output of Trace above).

We can also check what Mathematica knows about the functions Fib1 and Fib2

5. More Advanced Topics_18.gif

Global`Fib1

Fib1[0]=0
 
Fib1[1]=1
 
Fib1[n_]:=Fib1[n-1]+Fib1[n-2]

5. More Advanced Topics_19.gif

5. More Advanced Topics_20.gif

5. More Advanced Topics_21.gif

Global`Fib2

Fib2[0]=0
 
Fib2[1]=1
 
Fib2[2]=1
 
Fib2[3]=2
 
Fib2[4]=3
 
Fib2[5]=5
 
Fib2[n_]:=Fib2[n]=Fib2[n-1]+Fib2[n-2]

The point is that the last definition makes Fib2 remember each value that it has once computed so it never has to compute it again. The result is much better performance at the cost of some memory consumption, of course. This can be recovered by using

5. More Advanced Topics_22.gif

5. More Advanced Topics_23.gif

5. More Advanced Topics_24.gif

5. More Advanced Topics_25.gif

5. More Advanced Topics_26.gif

5. More Advanced Topics_27.gif

5. More Advanced Topics_28.gif

Imperative (Procedural) and Functional programming

So far we have considered two programming styles that one can use in Mathematica - rule based and functional. There is also another style, called procedural or imperative.  This is the style used by most traditional programming languages, such as C.  The characteristic of this style is the use of explicit assignments to variables, and of loops that change the state of a variable. Here is an example of a procedural program which changes the state of a variable x by using assignments:

5. More Advanced Topics_29.gif

5. More Advanced Topics_30.gif

5. More Advanced Topics_31.gif

5. More Advanced Topics_32.gif

This can be also written as

5. More Advanced Topics_33.gif

5. More Advanced Topics_34.gif

Note that Mathematica automatically returns the value of the last argument of ComposedExpression. In most procedural languages no final value would be returned and you need an explicit Return or Print statement Return[x] or Print[x] at the end. In Mathematica you never need these statements for this purpose.
Below is  another way to do the same thing, using a Do loop. Note that the Do loop does not return anything, so we need x at the end if we wish to return the value of x.

5. More Advanced Topics_35.gif

5. More Advanced Topics_36.gif

5. More Advanced Topics_37.gif

5. More Advanced Topics_38.gif

5. More Advanced Topics_39.gif

5. More Advanced Topics_40.gif

5. More Advanced Topics_41.gif

Mathematica has other procedural loops: While and For. They should be used sparingly, particularly the last one which is very inefficient. In general you can get much better performance from Mathematica by using functional constructions: Nest, Fold and FixedPoint and in version 6, Accumulate.

$

Because in imperative programs assignments are used, one has to be careful not to accidentally use or redefine variables to which values may have been assigned earlier. The best way to protect oneself from this possibility is by means of local variables. Mathematica has three basic constructions for localizing variables: Block, Module and With.

5. More Advanced Topics_42.gif

5. More Advanced Topics_43.gif

5. More Advanced Topics_44.gif

5. More Advanced Topics_45.gif

5. More Advanced Topics_46.gif

5. More Advanced Topics_47.gif

Although inside Block we set the value of x to 1, outside it remained equal to 3. The same will happen if we use Module

5. More Advanced Topics_48.gif

5. More Advanced Topics_49.gif

5. More Advanced Topics_50.gif

5. More Advanced Topics_51.gif

5. More Advanced Topics_52.gif

5. More Advanced Topics_53.gif

5. More Advanced Topics_54.gif

Block and Module work in a quite different way. When you localize a variable in Block its value is first stored, then erased, than after Block is exited the old (stored) value is restored. In the case of Module the variables are renamed so that their names do not conflict with any other names. Another construction that localizes variables is With. Note that, unlike in Module and Block,   all local variables in With must be initialized so you can't use assignments to local variables in With.

5. More Advanced Topics_55.gif

5. More Advanced Topics_56.gif

5. More Advanced Topics_57.gif

5. More Advanced Topics_58.gif

5. More Advanced Topics_59.gif

5. More Advanced Topics_60.gif

5. More Advanced Topics_61.gif

5. More Advanced Topics_62.gif

5. More Advanced Topics_63.gif

5. More Advanced Topics_64.gif

5. More Advanced Topics_65.gif

5. More Advanced Topics_66.gif

5. More Advanced Topics_67.gif

5. More Advanced Topics_68.gif

5. More Advanced Topics_69.gif

5. More Advanced Topics_70.gif

5. More Advanced Topics_71.gif


Another important example:

5. More Advanced Topics_72.gif

5. More Advanced Topics_73.gif

5. More Advanced Topics_74.gif

5. More Advanced Topics_75.gif

5. More Advanced Topics_76.gif

Although foo was definied outside Block, its value inside Block is changed. This does not happen when we use Module:

5. More Advanced Topics_77.gif

5. More Advanced Topics_78.gif

5. More Advanced Topics_79.gif

5. More Advanced Topics_80.gif

Thus, Module depends only on the original definition, Block on the evaluation. (Lexical scoping vs dynamic scoping).

Loops and Functional Iteration


Programs written in this style change the values of some variable. In order to get the changed value one has to explicitly evaluate the variable. Here is a simple procedural program which uses the Do loop.

5. More Advanced Topics_81.gif

5. More Advanced Topics_82.gif

5. More Advanced Topics_83.gif

5. More Advanced Topics_84.gif

We can do the same thing by using the functional style. When programming in this style we use functions which return values rather then change states of variables. Instead of loops we use "higher functions", that is functions whose arguments are functions. One of such functions is Nest.

5. More Advanced Topics_85.gif

5. More Advanced Topics_86.gif

5. More Advanced Topics_87.gif

5. More Advanced Topics_88.gif


There is also a related function NestList

5. More Advanced Topics_89.gif

5. More Advanced Topics_90.gif

5. More Advanced Topics_91.gif

5. More Advanced Topics_92.gif

Instead of using the Do loop above we can obtain the same result using the functional approach as follows:

5. More Advanced Topics_93.gif

5. More Advanced Topics_94.gif

The program runs much faster.

5. More Advanced Topics_95.gif

5. More Advanced Topics_96.gif

Here f has to be a function of two arguments. Here is an example which shows the working of FoldList:

5. More Advanced Topics_97.gif

5. More Advanced Topics_98.gif

5. More Advanced Topics_99.gif

5. More Advanced Topics_100.gif


Finally there is one new and very useful function that appeared in Mathematica 6.

5. More Advanced Topics_101.gif

5. More Advanced Topics_102.gif

5. More Advanced Topics_103.gif

5. More Advanced Topics_104.gif

The same result can be achieved using FoldList, however, Accumulate, being a more specialised function, is considerably faster.

5. More Advanced Topics_105.gif

5. More Advanced Topics_106.gif

 

5. More Advanced Topics_107.gif

5. More Advanced Topics_108.gif

5. More Advanced Topics_109.gif

5. More Advanced Topics_110.gif

5. More Advanced Topics_111.gif

5. More Advanced Topics_112.gif

5. More Advanced Topics_113.gif

5. More Advanced Topics_114.gif

5. More Advanced Topics_115.gif


This much greater speed of a more specialized function compared with a more general one is typical of Mathematica programming.

 

 

 

Block and global variables.

One of the most common uses of Block is to change temporarily the value of a global variable. For example, the global variable $RecursionLimit has by defaul the value:

5. More Advanced Topics_116.gif

5. More Advanced Topics_117.gif

The reason for this is to stop accidental infinte recurssion from occuring as a result of programming errors. However, this can sometimes be inconvenient. Here is a familiar example.

5. More Advanced Topics_118.gif

5. More Advanced Topics_119.gif

5. More Advanced Topics_120.gif

5. More Advanced Topics_121.gif

The value of 256 for $RecursionLimit prevents the code from working. Using Block we can temporarily change this value:

5. More Advanced Topics_122.gif

5. More Advanced Topics_123.gif

5. More Advanced Topics_124.gif

5. More Advanced Topics_125.gif

However, note that the global value of $RecursionLimit remains unchanged:

5. More Advanced Topics_126.gif

5. More Advanced Topics_127.gif

Example 1: Simulating Brownian Motion

One Path

5. More Advanced Topics_128.gif

slower alternative

5. More Advanced Topics_129.gif

and even slower

5. More Advanced Topics_130.gif

5. More Advanced Topics_131.gif

5. More Advanced Topics_132.gif

5. More Advanced Topics_133.gif

5. More Advanced Topics_134.gif

Many Paths

5. More Advanced Topics_135.gif

5. More Advanced Topics_136.gif

5. More Advanced Topics_137.gif

5. More Advanced Topics_138.gif

5. More Advanced Topics_139.gif

5. More Advanced Topics_140.gif

5. More Advanced Topics_141.gif

5. More Advanced Topics_142.gif

5. More Advanced Topics_143.gif

5. More Advanced Topics_144.gif

5. More Advanced Topics_145.gif


A few words about Dynamic and Manipulate

In version 6 of Mathematica, new features appeared which made it possible to use the Front End in a new way.  The main idea is that expressions with head Dynamic are updated when their “displayed form” changes. The simplest case is:

Dynamic

5. More Advanced Topics_146.gif

5. More Advanced Topics_147.gif

5. More Advanced Topics_148.gif

5. More Advanced Topics_149.gif

5. More Advanced Topics_150.gif

5. More Advanced Topics_151.gif

5. More Advanced Topics_152.gif

5. More Advanced Topics_153.gif

5. More Advanced Topics_154.gif

5. More Advanced Topics_155.gif

5. More Advanced Topics_156.gif

5. More Advanced Topics_157.gif

5. More Advanced Topics_158.gif

5. More Advanced Topics_159.gif

5. More Advanced Topics_160.gif

5. More Advanced Topics_161.gif

5. More Advanced Topics_162.gif

5. More Advanced Topics_163.gif

5. More Advanced Topics_164.gif

5. More Advanced Topics_165.gif

5. More Advanced Topics_166.gif

5. More Advanced Topics_167.gif

5. More Advanced Topics_168.gif

5. More Advanced Topics_169.gif

5. More Advanced Topics_170.gif

5. More Advanced Topics_171.gif


Manipulate

5. More Advanced Topics_172.gif

5. More Advanced Topics_173.gif

5. More Advanced Topics_174.gif

5. More Advanced Topics_175.gif

5. More Advanced Topics_176.gif

5. More Advanced Topics_177.gif

5. More Advanced Topics_178.gif

5. More Advanced Topics_179.gif

5. More Advanced Topics_180.gif

5. More Advanced Topics_181.gif

5. More Advanced Topics_182.gif

5. More Advanced Topics_183.gif

5. More Advanced Topics_184.gif

5. More Advanced Topics_185.gif

5. More Advanced Topics_186.gif

5. More Advanced Topics_187.gif

5. More Advanced Topics_188.gif

5. More Advanced Topics_189.gif

5. More Advanced Topics_190.gif

5. More Advanced Topics_191.gif

5. More Advanced Topics_192.gif

Links

5. More Advanced Topics_193.gif

5. More Advanced Topics_194.gif