Informacje wstępne

Założenia, adresaci wykładu, reguły.
Pierwszy kontakt z Mathematicą, źródła i pomoc.
Przykłady Manipulate i format CDF

Punkt wyjścia

Możliwości

Pakiet Mathematica, to niezwykle mocne narzędzie obliczeniowe, które ma wszechstronne zastosowania. Pozwala na bardzo złożone obliczenia symboliczne, rachunki numeryczne z dowolnie dużą dokładnością, zaawansowaną analizę i prezentację obrazu, dźwięku, itp., itd. Możliwości pakietu ciągle rosną i wydają sie nieskończone. Ogromna liczba użytkowników wymienia doświadczenia na forach internetowych, oferując przykłady, inspiracje i pomoc.

Zastosowania

Pakiet Mathematica ma bardzo szeroki zakres zastosowań, od prostych rachunków, do zaawansowanego modelowania i złożonej analizy danych. Można go traktować jako rodzaj Ostatecznego (Ultimate) Kalkulatora Programowalnego.

Pomoc naukowa i dydaktyczna

Możliwości pakietu sprawiają, że jest on doskonałym narzędziem wspomagającym pracę naukową i dydaktyczną. Wykład będzie obejmował oba aspekty, ale nacisk kładziemy na ten drugi.

Cel wykładu i jego adresaci

Dla wszystkich

Poznanie programu Mathematica lub pogłębienie wiedzy o nim i o jego możliwościach. Dla początkujących, będzie to raczej intensywny crash course. Średnio zaawansowani słuchacze nauczą się być może czegoś nowego. Od słuchaczy zaawansowanych w programie Mathematica i/lub w programowaniu, jeśli wytrwają, autor oczekuje sugestii, poprawek i komentarzy.

Dla młodszych adeptów fizyki jądrowej

Tematy wszystkich wykładów i rozważane przykłady będą zasadniczo dotyczyć fizyki jądra atomowego, opisu jego własności i struktury. Wiekszość z nich powinna być omawiana na wykładach specjalistycznych z fizyki jądrowej. Tu proponujemy spojrzenie na te zagadnienia z innego punktu widzenia i próbę pogłębienia wiedzy o nich.

Dla starszych, parających się dydaktyką

Wydaje się, że wykorzystanie pakietu Mathematica może ułatwić nauczanie fizyki. Szczególnie dotyczy to tych zagadnień, w których prezentuje się tylko wyniki złożonych obliczeń i modeli, które student musi przyjąć “na wiarę”. Możliwość sprawdzenia niektórych obliczeń, nawet znacznie uproszczonych do poziomu zabawki (toy model), pomaga zrozumieć istotę podejścia zaawansowanego i wspiera intuicję. Omawiane przykłady z fizyki jądrowej łatwo będzie przenieść na inne działy fizyki (np. r-nie Schrödingera).

W istocie podejmujemy eksperyment dydaktyczny!

Software

Pakiet Mathematica jest bardzo kosztowny, ale od niedawna Wydział Fizyki UW zakupił licencję “MATHEMATICA Unlimited Academic Site License”, która umożliwia korzystanie z tego programu pracownikom i studentom Wydziału. Licencja obejmuje też komputery domowe.

Aby w pełni skorzytać z tego wykładu należy zainstalować pakiet Mathematica na swoim komputerze osobistym. Stosowne informacje oraz instrukcje są na stronie Wydziału Fizyki, patrz tutaj.

Najnowsza wersja Mathematica ma numer 11. Do przygotowania wykładu i do jego prezentacji wykorzystałem wersję 10.  Zalecam jednak instalację najnowszej wersji. W przypadku problemów z odtwarzaniem plików wykładowych proszę o informacje!

Zaliczenie

Osoby, które będą chciały zaliczyć ten przedmiot, proszę o wpisanie się na listę z podaniem adresu e-mail.

Warunkiem wstępnym zaliczenia będzie wykonanie jednej (łatwej) pracy domowej. Szczegóły podamy w stosownym czasie.

Końcowe zaliczenie na ocenę odbędzie się na podstawie projektu wykonanego samodzielnie przez studenta, w którym Mathematica zostanie wykorzystana do rozwiązania lub ilustracji jakiegoś zjawiska/problemu fizycznego. Tematy przykładowych projektów będą sugerowane w trakcie wykładów, ale inicjatywa studentów będzie mile widziana.

Wyniki prac domowych oraz najciekawsze projekty zaliczeniowe wejdą w skład końcowych materiałów wykładowych, które będą dostępne w wersji cyfrowej w internecie i zostaną wydrukowane w postaci skryptu.

Strona internetowa

Materiały wykładowe będą na bieżąco umieszczane na stronie internetowej autora, czyli tutaj.

Pełny tekst źródłowy wykładu, w formacie .nb, będzie publikowany po każdym wykładzie. Zaleca się sciągnięcie takiego pliku i samodzielne wykonanie wszystkich instrukcji oraz sprawdzenie wszystkich prezentacji interaktywnych. 
W przypadku problemów proszę o informacje!

Literatura i pomoce naukowe

Wszystko co ważne i potrzebne znajdziemy w internecie!

Najważniejsze źródło to oczywiście

A tam bardzo dobre wprowadzenie: An Elementary Introduction, które można czytać on-line.

Polecam, szczególnie początkującym, przerobienie przynajmniej kilku pierwszych rozdziałów.

Alternatywne wprowadzenie dla bardziej zaawansowanych w programowaniu (też on-line): Fast Introduction for Programmers.

Witryna Wolfram’a zawiera oprócz tego całą masę innych informacji i odsyłaczy. Warto w niej poszperać.

Dla bardziej zaawansowanych: strona Mathematica Stack Exchange.

Niezła książka, od podstaw języka do zaawansowanych “tricków”: Leonid Shifrin, “Mathematica® programming: an advanced introduction” .

Oczywiście stale korzystamy z pomocy dostępnej w menu: 
Help > Wolfram Documentation

Pierwszy kontakt

Omówimy tu tylko wybrane elementy jezyka Wolframa, żeby się trochę z nim oswoić.

x=5

x^23

y=2/3

y*3/5

y*3./5

Wartość numeryczną możemy wyświetlić z dowolną precyzją (jedynym ograniczeniem jest pojemność pamięci komputera)

N[1/7]

N[1/7,20]

N[Pi,769]

Miejsca od 762 do 767 po przecinku to tzw. punkt Feynmana. To wiem z książki Daniela Tammeta “Urodziłem się pewnego błękitnego dnia”. Tammet nauczył się na pamięć i publicznie wyrecytował pierwsze 22 500 cyfr liczby π, aby zebrać fundusze dla stowarzyszenia na rzecz epilepsji (NSE).

Kilka ważnych detali

Ważna niepisana zasada: wszystkie zmienne zaczynamy małą literą, żeby uniknąć przypadkowej pomyłki z nazwami funkcji wbudowanych.

Nazwy muszą się zaczynać od litery (małej!) i mogą zawierać tylko litery i cyfry. System odróżnia litery małe i duże!

Specjalna rola nawiasów: [] - argumenty funkcji, {} - lista, w arytmetyce tylko ().

Można łączyć wyrażenia w jednym polu Input, oddzielając je średnikiem. Wynik wyrażenia zakończonego średnikiem nie będzie wyświetlony.

y=x^2 ;

y=y-2;
y*2

Różnica między ‘=’ a ‘:=’

Znak równości (Set) powoduje, że obliczana jest prawa strona i przypisywana do symbolu po lewej. Zawsze, gdy pojawia się ten symbol, ma on tę samą wartość.

Clear[x,y]

x=55.5

y+x

x=Random[]

x

Znak ‘:=’ (SetDelayed) powoduje, że prawa strona jest obliczana za każdym razem od nowa, gdy pojawia się symbol ze strony lewej:

y:=Random[]

y

x

Definicja funkcji

mojaF[x_]:=x^2+5

mojaF[3]

Zmienna x jest globalna, co może prowadzić do problemów jeśli o niej zapomnimy

x

Dlatego bezpieczniej “chować” zmienne pomocnicze w otoczeniu Module

mojaF2[x_]:=Module[{a},
a=x^2;
a+5
]

mojaF2[3]

a

x

Clear[x]

x

Wykres funkcji

Plot[mojaF2[z],{z,1,4}]

Wiele funkcji, w tym Plot, pozwala na precyzowanie różnych opcji formatujących.
Ich definicji, znaczenia i przykładów należy szukać w dokumentacji (Help).
Szybką pomoc dostaniemy pisząc:

??Plot

Plot[mojaF2[z],{z,1,4},
Frame->True,
ImageSize->500]

Listy

Lista, jako zbiór dowolnych elementów, jest bardzo ważnym obiektem. Będziemy ja spotykać na każdym kroku.

l={1,4,6}

Range[10]

l2=Range[7,10]

l3=Join[l,l2]

Wiekszość funkcji w działaniu na listę, działa na każdy element listy (ma atrybut Listable):

l3^2

2^l3

l3*4

Log[l3]

Attributes[Log]

Nasza własna funkcja domyślnie nie ma tego atrybutu:

Attributes[mojaF2]

Ale i tak dobrze działa na listy, bo składa się z operacji, które są Listable.

mojaF2[{2,5,7}]

Może się jednak zdarzyć funkcja bez tej własności, np.:

?If

mojaF3[x_]:=If[x>0,x*5.,-x/5.]

mojaF3[{2,3,-4}]

co możemy łatwo naprawić:

SetAttributes[mojaF3,Listable]

Attributes[mojaF3]

mojaF3[{2,3,-4}]

5>7-2

Często wykreślamy wartości funkcji w zadanych punktach, które tworzą listę

tab0=mojaF2[Range[0,5,0.5]]

Inna wersja tego samego, troche bardziej czytelna:

tab=Table[mojaF2[x],{x,0,5,0.5}]

ListPlot[tab]

Nie całkiem o to nam chodziło.

Ale lista może być zagnieżdżona!

tab2=Table[{x,mojaF2[x]},{x,0,5,0.5}]

ListPlot[tab2]

Manipulate

Najważniejsza konstrukcja dla tego cyklu wykładów: funkcja Manipulate :

Manipulate[
(*Wyrażenie którym manipulujemy*)
Plot[Sin[n*x],{x,0,2 Pi}],
(* Kontrolki *)
{n,1,5},
(* Opcje formatowania *)
FrameLabel->"Funkcja Sinus"
]

Manipulować można wszystkim:

Manipulate[
(*Wyrażenie którym manipulujemy*)
Expand[(a+b)^k],
(* Kontrolki *)
{{k,2},1,10,1/2},
(* Opcje formatowania *)
FrameLabel->{label1,label 2,"Dwumian Newtona, (a+b)^k",label4}
]

Użyteczne przykłady: wybór koloru

Mathematica oferuje rozbudowane metody obsługi koloru i przetwarzania obrazów. Graficzny wygląd obiektów matematycznych był od początku dźwignią reklamową pakietu. Tworząc wykresy, widma, histogramy, itp. możemy korzystać z tej obfitości. W kilku przykładach tworzenia obiektu Manipulate omówimy najważniejsze sposoby “kolorowania”.

Zobaczymy tylko czubek "góry lodowej". Zainteresowanych zachęcam do eksplorowania innych możliwości opisanych w dokumentacji.

Kolory nazwane (Named Colors)

Najłatwiej użyć jednego z 13 kolorów zdefiniowanych (nazwanych), które przywołujemy poprzez angielską nazwę.

Red

Blue

Dodatkowo można rozjaśnić lub pociemnić kolor funkcjami Lighter i Darker:

Lighter[Red]

Lighter[Blue]

Darker[Red]

Darker[Blue]

Stopień rozjaśnienia i przyciemnienia można kontrolować opcjonalnym parametrem o wartościach między 0 i 1 (wartość domyślna = 1/3):

Lighter[Red,0.9]

Ale zamiast sprawdzać ręcznie wszystkie możliwości, możemy zbudować interaktywną manipulację, która pozwoli łatwiej je eksplorować

Manipulate[
(*Wyrażenie którym manipulujemy*)
fcolor=color;
If[modify,
If[cor==1,fcolor=Lighter[fcolor,f],
If[cor==-1,fcolor=Darker[fcolor,f]],],
];
Graphics[{fcolor,Disk[{0,0}]},ImageSize->200],
(* Kontrolki *)
{{color,Red,Style["Kolor",20]},
{Red->"Red",
Green->"Green",
Blue->"Blue",
Black->"Black",
White->"White",
Gray->"Gray",
Cyan->"Cyan",
Magenta->"Magenta",
Yellow->"Yellow",
Brown->"Brown",
Orange->"Orange",
Pink->"Pink",
Purple->"Purple"},
ControlType->PopupMenu},
Delimiter,
{{modify,False,Style["Korekta",20]},{False,True},ControlType->Checkbox},
{{cor,1,Style["",18]},{1->Style[" Lighter ",Gray,16],-1->Style[" Darker ",Black,16]},Enabled->If[modify,True,False]},
{{f,0.33,Style["Frakcja, f",20]},0,1,Appearance->"Labeled",LabelStyle->20,Enabled->modify},
(* Opcje i formatowania *)
FrameLabel->{None, None,Style["Named Colors", Black,26], None},
TrackedSymbols:>{color,modify,cor,f},Alignment->Center
]

Funkcja RGBColor

Domyślnym sposobem określania dowolnej barwy jest funkcja RGBColor, która ma trzy oczywiste parametry:

RGBColor[1,0,0]

Ale jest jeszcze czwarty, opcjonalny parametr określający przezroczystość (Opacity)

RGBColor[1,0,0,0.5]

Wpływ parametrów r, g, b na końcowy kolor zbadamy też interaktywnie

Manipulate[
(*Wyrażenie którym manipulujemy*)
Graphics[{RGBColor[r,g,b],Disk[{0,0}]},ImageSize->200],
(* Kontrolki *)
{{r,0,Style["R ",Red,24]},0,1,Appearance->"Labeled",LabelStyle->Directive[RGBColor[r,g,b],24]},
{{g,0,Style["G ",Green,24]},0,1,Appearance->"Labeled",LabelStyle->Directive[RGBColor[r,g,b],24]},
{{b,0,Style["B ",Blue,24]},0,1,Appearance->"Labeled",LabelStyle->Directive[RGBColor[r,g,b],24]},
(* Opcje formatowania *)
FrameLabel->{None, None,Style["Wybór koloru funkcją RGBColor[r, g, b]", Black,28], None},
TrackedSymbols:>{r,g,b},Alignment->Center
]

Funkcja Hue

Czasem do wyboru koloru wygodna jest funkcja Hue, która ma trzy parametry. Ich znaczenie i wartości trudno zapamiętać. Poniższa funkcja ukazuje jak parametry te wpływają na kolor obiektu graficznego.

Manipulate[
(*Wyrażenie którym manipulujemy*)
Graphics[{Hue[h,s,b],Disk[{0,0}]},ImageSize->200],
(* Kontrolki *)
{{h,0,Style["Hue ",Black,24]},0,1,Appearance->"Labeled",LabelStyle->Directive[Hue[h,s,b],24]},
{{s,1,Style["Saturation ",Black,24]},0,1,Appearance->"Labeled",LabelStyle->Directive[Hue[h,s,b],24]},
{{b,1,Style["Brightness ",Black,24]},0,1,Appearance->"Labeled",LabelStyle->Directive[Hue[h,s,b],24]},
(* Opcje formatowania *)
FrameLabel->{None, None,Style["Wybór koloru funkcją Hue[h, s, b]", Blue,28], None},
TrackedSymbols:>{h,s,b},Alignment->Center
]

Funkcja Blend

Kolory można mieszać, a stopień zmieszania kontrolować parametrem. To bywa bardzo przydatne, gdy chcemy przedstawić graficznie jakąś informację za pomocą koloru. Do mieszania służy funkcja Blend :

?Blend

Sprawdzamy jak to działa, poznając przy okazji ColorSlider

Manipulate[
(*Wyrażenie którym manipulujemy*)
Graphics[{Blend[{c1,c2},f],Disk[{0,0}]},ImageSize->200],
(* Kontrolki *)
{{c1,Black,Style["Kolor 1",24]},ColorSlider,ImageSize->{250,80}},
{{c2,White,Style["Kolor 2",24]}, ColorSlider,ImageSize->{250,80}},
Delimiter,
{{f,0,Style["Frakcja, f",24]},0,1,Appearance->"Labeled",LabelStyle->24},
(* Opcje formatowania *)
FrameLabel->{None, None,Style["Mieszanie (Blend): (1-f)*K1 + f*K2", Black,28], None},
TrackedSymbols:>{c1,c2,f},Alignment->Center
]

Cztery w jednym

Wszystkie cztery manipulacje możemy zebrać w jedną korzystając z opcji TabView.

Dodatkowo wprowadzamy przycisk “Insert Color”, którego kliknięcie powoduje, że w miejscu kursora w poprzednio aktywnym noetebooku wstawia się aktualnie wybrana funkcja koloru.

TabView[{
Style[" NamedColors ",Black,22]->
Manipulate[
(*Wyrażenie którym manipulujemy*)
fcolor=color;
If[modify,
If[cor==1,fcolor=Lighter[fcolor,f],
If[cor==-1,fcolor=Darker[fcolor,f]],],
];
Column[{
Graphics[{fcolor,Disk[{0,0}]},ImageSize->300],
Button[" Insert Color ",
NotebookWrite[Notebooks[][[2]],fcolor],
BaseStyle->{Bold,22},
ImageMargins->5]},Center],
(* Kontrolki *)
{{color,Red,Style["Kolor",20]},
{Red->"Red",
Green->"Green",
Blue->"Blue",
Black->"Black",
White->"White",
Gray->"Gray",
Cyan->"Cyan",
Magenta->"Magenta",
Yellow->"Yellow",
Brown->"Brown",
Orange->"Orange",
Pink->"Pink",
Purple->"Purple"},
ControlType->PopupMenu},
Delimiter,
{{modify,False,Style["Korekta",20]},{False,True},ControlType->Checkbox},
{{cor,1,Style["",18]},{1->Style[" Lighter ",Gray,16],-1->Style[" Darker ",Black,16]},Enabled->If[modify,True,False]},
{{f,0.33,Style["Frakcja, f",20]},0,1,Appearance->"Labeled",LabelStyle->20,Enabled->modify},
(* Opcje i formatowania *)
FrameLabel->{None,None,Column[{Style[" Color, ","Output",24],Style["Lighter[Color,f], Darker[Color,f]","Output",24]},Center,Spacings->1],None},
TrackedSymbols:>{color,modify,cor,f}, Alignment->Center
],
Style["  RGBColor ",Black,22]->
Manipulate[
(*Wyrażenie którym manipulujemy*)
Column[{
Graphics[{RGBColor[r,g,b],Disk[{0,0}]},ImageSize->300],
Button[" Insert Color ",
NotebookWrite[Notebooks[][[2]],RGBColor[r,g,b]],
BaseStyle->{Bold,22},
ImageMargins->5]},Center],
(* Kontrolki *)
{{r,1,Style["R ",Red,22]},0,1,Appearance->"Labeled",LabelStyle->Directive[RGBColor[r,g,b],24]},
{{g,0,Style["G ",Green,22]},0,1,Appearance->"Labeled",LabelStyle->Directive[RGBColor[r,g,b],24]},
{{b,0,Style["B ",Blue,22]},0,1,Appearance->"Labeled",LabelStyle->Directive[RGBColor[r,g,b],24]},
(* Opcje i formatowania *)
FrameLabel->{None,None,Style["RGBColor[r, g, b]       ","Output",24],None},
TrackedSymbols:>{r,g,b},
ContentSize->{400,400},
Alignment->Center
],
Style["   Hue   ",Black,22]->
Manipulate[
(*Wyrażenie którym manipulujemy*)
Column[{
Graphics[{Hue[h,s,b],Disk[{0,0}]},ImageSize->300],
Button[" Insert Color ",
NotebookWrite[Notebooks[][[2]],Hue[h,s,b]],
BaseStyle->{Bold,22},
ImageMargins->5]},Center],
(* Kontrolki *)
{{h,0,Style["Hue ",Black,22]},0,1,Appearance->"Labeled",LabelStyle->Directive[Hue[h,s,b],22]},
{{s,1,Style["Saturation ",Black,22]},0,1,Appearance->"Labeled",LabelStyle->Directive[Hue[h,s,b],22]},
{{b,1,Style["Brightness ",Black,22]},0,1,Appearance->"Labeled",LabelStyle->Directive[Hue[h,s,b],22]},
(* Opcje i formatowania *)
FrameLabel->{None,None,Style["Hue[h, s, b]       ","Output",24],None},
TrackedSymbols:>{h,s,b},
Alignment->Center
],
Style["  Blend  ",Black,22]->
Manipulate[
(*Wyrażenie którym manipulujemy*)
Column[{
Graphics[{Blend[{c1,c2},f],Disk[{0,0}]},ImageSize->200],
Button[" Insert Color ",
NotebookWrite[Notebooks[][[2]],Blend[{c1,c2},f]],
BaseStyle->{Bold,22},
ImageMargins->5]},Center],
(* Kontrolki *)
{{c1,Red,Style["Kolor 1",22]},ColorSlider,ImageSize->{330,80}},
{{c2,Blue,Style["Kolor 2",22]}, ColorSlider,ImageSize->{330,80}},
Delimiter,
{{f,0,Style["Frakcja, f",22]},0,1,Appearance->"Labeled",LabelStyle->22},
(* Opcje i formatowania *)
FrameLabel->{None,None,Style["  Blend[k1,k2,f] = (1-f)*k1 + f*k2","Output",24],None},
TrackedSymbols:>{c1,c2,f},
Alignment->Center
]
}]

Computable Data Format (CFD)

Firma Wolfram stworzyla specjalną platformę, która pozwala kreować interaktywne “manipulacje”, które z kolei dają się odtwarzać bez konieczności posiadania pakietu Mathematica. Ta platforma to Computable Data Format (CDF). Plik formatu cdf można oczywiście otwierać i edytować w programie Mathematica, ale do samego oglądania (bez możliwości edycji) wystarczy darmowy Wolfram CDF Player.

Jako przykład utworzymy plik cdf zawierający ilustrację funkcji Blend (poprzednia manipulacja).

Zanaczamy komórki, które chcemy włączyć do pliku.

Wybieramy z Menu: File > CDF Export > Standalone.

Następnie postepujemy wg wskazówek.

Na specjalnej stronie firmy Wolfram - Wolfram Demonstration Project -  zebrane są tysiące interaktywnych manipulacji z rozmaitych dziedzin. Są one poklasyfikowane wg dziedzin tematycznych, co ułatwia eksplorowanie. Bardzo polecam!

Dwa ładne przykłady dotyczące koloru znalezione na WDP: NamedColors i HSBExplorer.

Inne przykłady na stronie autora.

Notebook z paskiem graficznym

Wszystkie prezentacje wykładowe będą stworzone w programie Mathematica  i wyświetlane w środowisku SlideShow.

Aby żaden zastosowany efekt nie został bez wyjaśnienia, na koniec informacja jak stworzyć zeszyt (Notebook) z własnym paskiem graficznym na górze (banner).

Najpierw tworzymy własny obrazek w dowolnym programie graficznym i zapisujemy w formacie graficznym (jpg, png, ...) w stosownym folderze.

Wyszukujemy go i wczytujemy:

SetDirectory["d:\\Pfutzner\\Teach\\Mathematica4Nuclear\\Style"]

FileNames["*.png"]

g1=Import["Banner2.png"]

Nastepnie tworzymy komórkę “zadokowaną” (docked cell) i dopasowujemy kolor tła do koloru bannera:

banner=Cell[BoxData[ToBoxes[g1]/.ImageSize->{1000,70}],"DockedCell",Background->Hue[0,1,0.6],ImageMargins->0,CellMargins->{{0,0},{0,0}},CellFrameMargins->{{0,0},{0,0}}];

banner//CellPrint

Nowy zeszyt z bannerem tworzymy komendą:

CreateWindow[DockedCells->banner];

Możemy też od razu stworzyć plik do pokazu slajdów:

nbslide=CreateDocument[];
SetOptions[nbslide,DockedCells->{FEPrivate`FrontEndResource["FEExpressions","SlideshowToolbar"],banner}];