Tematy: uruchamianie | rozwiązywanie równań | rysowanie krzywych | programowanie | zadania

Program Maxima

Program Maxima jest darmowy. Można go pobrać ze strony https://sourceforge.net/projects/maxima/files/.

Uruchamianie

Aby uruchomić program wyszukujemy ikonę na pulpicie lub odpowiednią pozycję w menu programów. Ważne jest by wybrać pozycję o nazwie wxMaxima. Pojawi się okno interfejsu graficznego:

W tym oknie możemy wpisywać polecenia, korzystać z kreatorów poleceń, korzystać z dokumentacji (po angielsku) i tutoriali (kilka języków).

Jeśli z menu programów wybierzemy pozycję o nazwie maxima, to pojawi sie okno konsoli tekstowej:

Jesteśmy wówczas skazani na wpisywanie poleceń.
Załóżmy, że chcemy policzyć granicę $\lim_{x\to 0} \frac{sin(x)}{x}$.

Jeśli interfejs jest graficzny, to wybieramy Analiza ⇒ Znajdź granicę i wypełniamy okienko kreatora:

W głównym oknie pojawi się wygenerowane pytanie i odpowiedź:

Jeśli korzystamy z konsoli tekstowej, to musimy polecenie wpisać samodzielnie. Musimy przy tym pamiętać, że polecenie zaczyna się słowem limit (a nie lim ani limes) i kończy średnikiem.

Także gdy korzystamy z interfejsu graficznego bywa konieczne (wygodne) wpisanie polecenia. By wykonać wpisane polecenie trzeba nacisnąć Shift + Enter lub kliknąć w odpowiedni przycisk.

Rozwiązywanie równań

Równania można rozwiązywać dwoma sposobami:
Każdy pakiet matematyczny potrafi rozwiązywać równania numerycznie. Maxima potrafi wykonywać przekształcenia symboliczne – mówimy, że Maxima ma własność CAS (Computer Algebra System).
Metody numeryczne są uniwersalne, można nimi rozwiązać każde równanie, za pomocą przekształceń symbolicznych tylko niektóre. Rozwiążmy równanie $cos(x)=x$. Z wykresu widać, że równanie ma rozwiązanie.
Rozwiązywanie symboliczne w Maximie Równania ⇒ Rozwiąż
daje mało przydatną odpowiedź:
Rozwiązywanie numeryczne Równania ⇒ Znajdź pierwiastek
wymaga co prawda podania przedziału, w którym szukamy rozwiązania, ale znajduje to rozwiązanie:

Metody symboliczne

Maxima ma kilka poleceń do symbolicznego rozwiązywania równań. Polecenia te znajdują się w pozycji Równania głównego menu.

Metody numeryczne

Maxima ma też kilka poleceń do numerycznego rozwiązywania równań. Polecenia te znajdują się w pozycji Równania głównego menu.

Zadania

Zadania można rozwiązać na wiele sposobów. Kliknięcie w przycisk Rozwiązanie pozwala zobaczyć jeden z tych sposobów.

Poniżej – na jednym rysunku – znajdują się wykresy funkcji $y=\cos(x)$ i $y=\frac{1}{40}\cdot x$. Znajdź dwa różne rozwiązania równania $\frac{x}{40}=\cos(x)$.

Rozwiązanie
Musimy wybrać rozwiązywanie numeryczne. Kierując sie wykresem, wyznaczamy dwa przedziały $[a,b]$ oraz $[c,d]$ takie, że $f(a)\cdot f(b)\le 0$ oraz $f(c)\cdot f(d)\le 0$, gdzie $f(x)=cos(x)-\frac{x}{40}$. Np. $a = 0,\, b = 3,\, c = 16,\, d = 19$. Wykonujemy dwukrotnie polecenie Równania ⇒ Znajdź pierwiastek:
Dostajemy rozwiązania $1.532475071451161$ i $17.7382096279117$.
Ukryj

Poniżej znajduje sie wykres funkcji $f(x)=e^{-x^2}$.

Czy $f(4)\lt 0,000001$?
Rozwiązanie
Niech $g(x)=f(x)-0,000001$. Poszukajmy rozwiązań równania $g(x) = 0$ na przedziale $[0,6]$.
Rozwiązanie istnieje i jest równe $3.716922188849838\lt 4$. Funkcja $g$ jest dla $x\ge 0$ malejąca, zatem $g(4) \lt 0$ ⇒ $f(4)\lt 0,000001$.
Ukryj

Krzywe dwuwymiarowe

Krzywe o równaniu $y = f(x)$

Najprostszy sposób rysowania krzywych dwuwymiarowych, to wybranie z menu pozycji: Wykres ⇒ Wykres2D

Kreator wygeneruje takie polecenie:

plot2d([sin(x)^2+cos(x)],[x,-5,5],[plot_format,gnuplot])$

Warto wybrać format gnuplot i nie podawać zakresu zmiennej $y$.

Program rysujący sam ustalił zakres zmiennej $y$, użytkownik programu mógłby wybrać zupełnie źle.
Przykłady złych wyborów

Wykres funkcji $y={sin(x)}^2+cos(x)$.
$-100\le y\le 100$

$-0,5\le y\le 0,5$
Ukryj

Użycie kreatora ma jedną poważną wadę – nie można umieścić wykresów kilku funkcji na jednym rysunku. Polecenie rysujące kilka wykresów musimy napisać:

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

Krzywe parametryczne

Ponownie wybieramy z menu pozycję Wykres ⇒ Wykres2D, klikamy w przycisk Specjalne i z menu podręcznego wybieramy Parametryczny.

Warto wybrać format gnuplot i nie podawać zakresu ani zmiennej $x$, ani zmiennej $y$.

Otrzymana krzywa jest szczególnym przypadkiem tzw. krzywych Lissajous. Program rysujący sam ustalił zakresy zmiennych $x$ i $y$.

W aktualnej wersji Maximy (5.45.1) kreator generuje błędne polecenie rysowania:
plot2d([['parametric, cos(5*t), sin(3*t), [t, 0, 2*%pi], [nticks, 300]]], [x,-5,5])$

trzeba je poprawić (skrócić):

plot2d([['parametric, cos(5*t), sin(3*t), [t, 0, 2*%pi]]], [nticks, 300])$

W kolejnym przykładzie krzywej parametrycznej (tzw. krzywa motyla), pewne skomplikowane wyrażenie pojawia się we wzorze na $x$ i we wzorze na $y$. Aby uniknąć dwukrotnego wpisywania tego wyrażenia, możemy je zdefiniować w oknie graficznym Maximy.

Wyrażenie to zostało nazwane $r$, można z niego korzystać w okienku Parametryczny:

Wygenerowane przez kreator polecenie wygląda – po korekcie – tak:

plot2d([['parametric,r*sin(t),r*cos(t),[t,-8*%pi,8*%pi]]],[nticks, 2000])$

A sama krzywa tak:

Zadania

Narysuj na jednym rysunku trzy krzywe:

Rozwiązanie

Chyba najprostszym rozwiązaniem jest napisanie polecenia:

plot2d([x^2, -x^2,[parametric, 2*cos(t)-1, 2*sin(t), [t, %pi/2, 3*%pi/2]]],[x,-5,5])$
Ukryj

Narysuj na jednym rysunku trzy krzywe:

Rozwiązanie

Wszystkie krzywe opiszemy parametrycznie. Ponownie napiszemy polecenie:

plot2d([[parametric,1,t,[t,-%pi,%pi]],[parametric,-1,t,[t,-%pi,%pi]],[parametric,sin(t),t,[t,-%pi,%pi]]],[x,-2,2])$
Ukryj

Elementy programowania

Własne funkcje

Używanie własnych funkcji ułatwia korzystanie z Maximy. Przypuśćmy, że będziemy wielokrotnie obliczać odległość punktu $(x,y)$ od początku układu. Definiujemy funkcję:

Jeżeli chcemy wewnątrz funkcji użyć dodatkowych zmiennych do przechowania wyników pomocniczych obliczeń, to definicja funkcji staje się bardziej skomplikowana:

Wiersz (%i4) wygenerowałem wykonując poniższe polecenie:

Tak zdefiniowane funkcje nie istnieją po zamknięciu i ponownym uruchomieniu programu Maxima. Polecenia: Maxima ⇒ Restart Maxima i Maxima ⇒ Wyczyść pamięć również usuwają funkcje. Jeżeli chcemy korzystać z funkcji wielokrotnie, to musimy ją zapisać do pliku: Plik ⇒ Zapisz i w razie potrzeby odczytać z pliku: Plik ⇒ Otwórz.

Napisz funkcję $\text{isTriangle}(a,b,c)$, która zwraca wartość logiczną true jeżeli istnieje trójkąt o bokach $a$, $b$ i $c$, a wartość logiczną false jeśli taki trójkąt nie istnieje.

Rozwiązanie
Ukryj

Pętla for

Pętla for wymusza wykonanie pewnego kodu dla wielu wartości pewnej zmiennej nazywanej zmienną sterującą.

W powyższym przykładzie wpierw definiowana została funkcja $F(n)$ obliczająca tzw. liczby Fermata. Następnie, za pomocą pętli for wypisane zostało siedem liczb Fermata wraz z informacją czy są one pierwsze. Zmienna sterująca oznaczona jest literą $i$, nie jest to przypadek – wiekszość zmiennych sterujących w wykorzystywanych na świecie pętlach for jest oznaczana literą $i$.
Funkcja primep

Funkcja $primep(n)$ jest dość tajemnicza:

Ukryj

Ogólna postać pętli for jest następująca:

for zm_ster:wart_pocz [step krok] kontrola do kod_do_wykonania

Fragment step krok jest nieobowiązkowy, liczba krok decyduje o ile zmienia się wartość zmiennej sterującej, liczba ta może być ujemna, może być ułamkowa. Domyślnie $\text{krok}=1$.

Fragment kontrola może mieć kilka postaci:

Korzystając z pętli for wypisz – w kolejności malejącej wszystkie liczby nieparzyste z przedziału $[100,200]$ i ich kwadraty.

Rozwiązanie
...
Ukryj

Tablice

Możliwości pętli for znacznie wzrastają gdy korzystamy z tablic. Tablice w Maximie mogą być wielomiarowe, będziemy korzystać tylko z tablic dwuwymiarowych i jednowymiarowych. Warto pamiętać, że indeksowanie elementów w tablicy zaczyna sie od zera.

Tworzenie tablic:

Tworzenie jednowymiarowej tablicy o nazwie Newton, zawierającej symbole Newtona $\binom{10}{0}\dots \binom{10}{10}$.

Obliczenie sumy liczb z tablicy Newton oraz wyznaczenie liczby największej i najmniejszej. Jeżeli w pętli for w kodzie po słowie do chcemy wykonać kilka instrukcji, to rozdzielamy je przecinkami i całość ograniczami nawiasami:

… do (instrukcja1,instrukcja2,...)

Utworzenie dwuwymiarowej tablicy o 2 wierszach i 21 kolumnach. Do pierwszego wiersza wpiszemy pierwsze 21 wyrazów ciągu Fibonacciego $f_0=1,\,f_1=1,\,f_n=f_{n-2}+f_{n-1}$ dla $n\ge 2$, w drugim wierszu na pozycji o indeksie $n\, (n\gt 1)$ wpiszemy $\frac{f_n}{f_{n-1}\cdot\phi}$ gdzie $\phi=\frac{1+\sqrt 5}{2}$ jest tzw. złotą liczbą.

array(fibo,1,20)
fibo[0,0]:1
fibo[0,1]:1
for i:2 thru 20 do 
fibo[0,i]:fibo[0,i-2]+fibo[0,i-1]
gold:(1+sqrt(5))/2
for i:1 thru 20 
do fibo[1,i]:fibo[0,i]/(fibo[0,i-1]*gold)
for i:0 thru 20 
do print(fibo[0,i],"  ",float(fibo[1,i]))
Ostatnie wiersze na ekranie wyglądają tak:

Zadania

Oblicz sumę $\sum_{n=1}^{100}n^3$.

Rozwiązanie
suma:0
for i:1 thru 100 do suma:suma + i^3
print(suma) ⇒ 25502500
Ukryj

Rozważmy prostokąty o bokach $a$ i $b$ będących liczbami nieparzystymi, spełniającymi warunek $a+b=100$. Jaka jest największa wartość pola tych prostokątów?

Rozwiązanie
M:0
for a:1 step 2 thru 100 do (pole:a*(100-a),M:max(M,pole))
print(M) ⇒ 2499
Ukryj

Ile składników szeregu geometrycznego $\sum_{i=1}^\infty\frac{1}{2^i}$ trzeba zsumować aby otrzymana suma częściowa była większa od $0,99999999$?

Rozwiązanie
suma:0
licznik:0
for i:1 while(suma<=0.99999999) do (suma:suma+1/2^i,licznik:licznik+1)
print(licznik) ⇒ 27
Ukryj

Napisz funkcję, która dla liczby $n$ zwraca ilość liczb pierwszych nie przekraczających $n$.

Rozwiązanie
primes(n):=block([p],p:0,for i:2 thru n do if primep(i) then p:p+1,return(p))
Dla kontroli:
primes(3) ⇒ 2
primes(10) ⇒ 4
primes(100) ⇒ 25
Ukryj

Napisz funkcję, która dla liczby $x$ zwraca odległość od najbliższej liczby całkowitej podzielnej przez 10.
Przydatne funkcje:

Rozwiązanie
near(x):=block([d],d:10,for i:floor(x)-10 thru ceiling(x)+10 do if mod(i,10)=0 then d:min(d,abs(i-x)),return(d))
Dla kontroli:
near(3.67) ⇒ 3.67
near(18.76) ⇒ 1.239999999999998
near(-5.67) ⇒ 4.33
Ukryj