# Pierwsze kroki w (wx)Maximie

Janusz Szwabiński, 4.02.2014

Maxima to darmowy system algebry komputerowej, wspomagający obliczenia symboliczne 
i (w mniejszym stopniu) numeryczne. 

WxMaxima to rozwijana niezależnie nakładka graficzna na Maximę, dzięki której 
środowisko do obliczeń staje się bardziej przyjazne dla użytkownika. Nakładka ta
oferuje wygodne okna dialogowe do większości poleceń i pozwala m.in. na tworzenie 
dokumentów, w których obliczenia przeplatają się z tekstem.

Niniejszy notatnik, to przykład takiego dokumentu.

Sesja w wxMaximie podzielona jest na komórki. Rozróżniamy kilka ich typów:
- komórki wejściowe (do wprowadzania działań do wykonania),
- komórki tekstowe (do wprowadzania komentarzy - niniejsza komórka jest właśnie tego typu),
- komórki tytułowe, rozdziałów i podrozdziałów (do nadania struktury notatnikowi).
Wszystkie komórki można wstawić poprzez menu "Komórka" znajdujące się  w pasku menu programu.
Dodatkowo, komórki tekstowe, tytułowe, rozdziałów i podrozdziałów można wstawiać przy pomocy
kombinacji klawiszy Ctrl+1, Ctrl+2, Ctrl+3 i Ctrl+4. Natomiast komórkę wejściową wstawimy, 
próbując po prostu wpisać coś z klawiatury, o ile tylko kursor będzie znajdował się w 
(białej) przestrzeni roboczej

## (wx)Maxima jako kalkulator

### Działania na liczbach

Pracę z Maximą rozpoczniemy od kilku prostych obliczeń.

Poniżej znajduje się komórka wejściowa z dodawaniem dwóch liczb.
Aby wykonać działanie zdefiniowane w komórce, umieszczamy w niej
kursor, a następnie wciskamy kombinację klawiszy SHIFT+ENTER.

1 + 1;

Inna możliwość wykonania działania to zaznaczenie komórki kursorem (wystarczy kliknąć w dowolny
punkt jej obszaru), a następnie wybranie polecenia "Wykonaj komórki" z menu "Komórka".

Pracując bezpośrednio w Maximie w linii poleceń (konsoli), każde działanie przed wykonaniem
musimy zakończyć znakiem ";" (jeśli chcemy zobaczyć wynik na ekranie) lub znakiem "$" 
(jeśli wynik ma być niewyświetlony). W wxMaximie nie jest to konieczne, program sam 
dodaje ";" do naszego polecenia w momencie wciśnięcia SHIFT+ENTER.

Wykonajmy teraz działania zdefiniowane w komórce wejściowej poniżej
(podobnie, jak poprzednim razem, umieszczamy w komórce kursor i wciskamy
SHIFT+ENTER):

5!;
% * 10;
%o1 * 100;
1 / 3;
1.0 / 3.0;

Jak widać w powyższych przykładach, Maxima numeruje poszczególne działania wprowadzane przez
użytkownika przy pomocy "(%iN)", gdzie N to bieżący numer wiersza. Linie z wynikami oznaczane są 
etykietami "(%oN)". Korzystając z tych etykiet, możemy odwoływać się do wyników wcześniejszych
obliczeń w kolejnych działaniach. Jeżeli chcemy uwzględnić tylko ostatni wynik, wówczas wystarczy sam znak "%".

Warto zauważyć, że wyniki działań "1/3" i "1.0/3.0" różnią się między sobą. W pierwszym przypadku działanie nie 
jest wykonane, bo program stara się utrzymać największą możliwą precyzję. W drugim przypadku wprowadzając 
działanie użyliśmy liczb w reprezentacji zmiennopozycyjnej o określonej precyzji, w ramach której możliwe
było wykonanie działania.

Obliczenie działań z utratą precyzji możemy oczywiście w każdej chwili wymusić:

sqrt(2 * %pi);
float(%);

### Zmienne

W zmiennych możemy przechowywać nie tylko liczby, ale również całe wyrażenia:

radius: 10 $
height: 100 $
area: %pi * radius^2;
volume: area * height;

Zwróćmy uwagę, że operatorem przypisania wartości do zmiennej w Maximie jest ":". 

Wartość numeryczną ostatniego wyrażenia obliczymy przy pomocy znanej już funkcji float:

float(%);

Inna możliwość to skorzystanie z flagi "numer":

radius: 10 $
height: 100 $
area: %pi * radius^2;
volume: area * height;
%, numer;

### Funkcje

Definiując funkcje, używamy operatora ":="

f(x) := x^2 + a$
f(5);
f(5), a = -5;

## Więcej niż kalkulator

### Różniczkowanie

Do obliczania pochodnych służy polecenie "diff". Jeżeli nie znamy jego składni,
z paska menu wybieramy "Analiza->Pochodna". Pojawi się okno dialogowe, w którym 
można zdefiniować różniczkowaną funkcję oraz określić rząd pochodnej i zmienną,
po której różniczkujemy.

f(x) := x^2 $
diff(f(x), x);
g(y) := sin(y)$
g(f(x));
diff( g(f(x)) , x);

### Całkowanie

Całki nieoznaczone i oznaczone wyliczymy przy pomocy polecenia "integrate":

integrate( sin(x), x);
integrate( sin(x), x, 0, %pi);

W menu "Analiza -> Całkowanie" znajduje się okno dialogowe, w którym 
możemy zdefiniować funkcję podcałkową, określić zmienną całkowania i (opcjonalnie)
granice całkowania.

Funkcję podcałkową możemy zdefiniować wcześniej:

f(x) := x^2 + a$
f(5);
f(5), a = -5;
integrate( f(var), var );

Czasami Maxima potrzebuje dodatkowej informacji do wykonania działania.

W przykładzie poniżej wynik całkowania zależy od tego, czy zmienna "a" ma wartość 
dodatnią czy ujemną. Dlatego po uruchomieniu obliczeń (SHIFT+ENTER) Maxima zapyta 
nas o parametr "a". Wpisujemy "p" dla parametru dodatniego lub "n" dla ujemnego i 
ponownie wciskamy SHIFT+ENTER:

integrate( 1 / (x^2 + a), x);

Znak parametru możemy określić wcześniej:

assume(a > 0)$
integrate( 1 / (x^2 + a), x);
forget(a > 0)$
assume(a < 0)$
integrate( 1 / (x^2 + a), x);
forget(a < 0)$

### Równania

Do rozwiązywania równań służy polecenie "solve":

solve(a*x^2 + b*x + c = 0, x);

Zwróćmy uwagę, że równanie definiowane jest przy pomocy operatora "=".

### Równania różniczkowe zwyczajne

Rozwiążmy równanie y''(t) + omega^2 * y(t) = 0 z warunkiem 
początkowym y(0) = amp, y'(0) = 0

assume(omega > 0);
ode2( 'diff(y, t, 2) + omega^2 * y = 0, y, t );
ic2(%, t = 0, y = amp, 'diff(y,t) = 0 );

Apostrof przed poleceniem "diff" w definicji równania powoduje, że Maxima interpretuje je
dosłownie (tzn. jako d^y/dt^2), zamiast wstawić w to miejsce wynik różniczkowania.

Narzędzia do rozwiązywania równań i równań różniczkowych zebrane są w menu "Równania".

### Macierze i wektory

Do tworzenia macierzy służy polecenie "matrix". Macierze mogą zawierać wyrażenia
symboliczne. Macierz odwrotną wyznaczymy przy pomocy "invert". Natomiast operator
"." oznacza mnożenie macierzowe:

A: matrix([1,-1],
          [1,sin(c)]);
B: invert(A);

A.B;
ratsimp(A.B);

Zadaniem funkcji "ratsimp" w ostatnim poleceniu jest uproszczenie wcześniejszego wyniku.

### Wykresy funkcji

Jeżeli wykres ma się pojawić w komórce wyjściowej w wxMaximie, korzystamy z poleceń "wxplot":

wxplot2d([sin(x), cos(x)], [x,0, 2*%pi]);
wxplot3d( exp(-x^2 - y^2), [x,-2,2],[y,-2,2]);

Natomiast w przypadku, kiedy chcemy, aby wykres pojawił się w odrębnym oknie, albo pracujemy w Maximie w trybie tekstowym,
używamy funkcji "plot":

plot2d([sin(x), cos(x)], [x,0, 2*%pi]);

plot3d( exp(-x^2 - y^2), [x,-2,2],[y,-2,2]);

W menu "Wykres" znajdują się narzędzia, które pozwalają tworzyć, formatować i zapisywać wykresy bez znajomości poleceń "(wx)plot" 

## Warto wiedzieć

### Czyszczenie przestrzeni roboczej

Czasami konieczny jest powrót do domyślnych ustawień globalnych oraz wyczyszczenie przestrzeni roboczej 
(zmiennych, funkcji i etykiet wejścia/wyjścia): 

reset()$
kill(all)$

### Pomoc

Pomoc na temat danego polecenia:

? sqrt;

Spacja jest ważna!

?sqrt;

Pomoc na temat wszystkich poleceń zawierających "sqrt" w nazwie:

?? sqrt;

Nazwy poleceń zawierających "sqrt" w nazwie:

apropos("sqrt");

Przykład zastosowania polecenia (nie zawsze zadziała):

example(sqrt);

example(diff);