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.