Załózmy, że rozwiązujemy równanie postaci: $f(x)=0\,\,\,a\le x \le b$
Maxima
wykorzystuje metodę bisekcji, która wymaga by $f(a)\cdot f(b)\le 0$. W konsekwencji, Maxima
odmawia współpracy, jeżeli $f(a)\cdot f(b) \gt 0$, również wtedy gdy w przedziale $[a,b]$ są
rozwiązania równania.
⇒
Jeżeli we wskazanym przedziale jest więcej rozwiązań, to
Maxima
znajduje tylko jedno z nich.
⇒
Ukryj
Pierwiastki wielomianu
, nie otwiera się okienko kreatora. Wielomian należy wpisać w głównym oknie programu wcześniej.
⇒
Wybrane polecenie znajduje wszystkie – również zespolone – pierwiastki wielomianu.
Pierwiastki wielomianu rzeczywiste
, też nie otwiera się okna kreatora. Zgodnie z obietnicą, obliczane są tylko pierwiastki rzeczywiste.
⇒
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:
- parabolę o równaniu $y=x^2$,
- parabolę o równaniu $y=-x^2$,
- lewą połowę okręgu opisanego parametrycznie $x=2\cdot \cos(t)-1\,\,\,y=2\cdot \sin(t)$.
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:
- sinusoidę o równaniu $x=\sin(y)$,
- prostą o równaniu $x=1$,
- prostą o równaniu $x=-1$.
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
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:
- jeśli $primep(n)=false$, to liczba $n$ jest na pewno złożona,
- jeśli $primep(n)=true$ oraz $n\lt 341550071728321$, to liczba $n$ jest na pewno pierwsza,
- jeśli $primep(n)=true$ oraz $n\ge 341550071728321$, to liczba $n$ jest pierwsza z prawdopodobieństwem $1-10^{-15}$.
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:
thru wart_konc
, wartość zmiennej sterującej nie przekroczy wart_konc
,
while warunek
, wykonywanie pętli zakończy się gdy warunek nie będzie spełniony
for i:1 while(i<=5) do print(i)
wypisanych zostanie pięć wierszy,
unless warunek
, wykonywanie pętli zakończy się gdy warunek będzie spełniony
for i:1 unless(i>5) do print(i)
wypisanych zostanie pięć wierszy,
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
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:
- tablica jednowymiarowa
array(nazwa,index_ostatniego_elementu)
- tablica dwuwymiarowa
array(nazwa,index_ostatniego_wiersza,index_ostatniego_elementu_w_wierszu)
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:
floor(x)
zwraca przybliżenie całkowite liczby $x$ z dołu,
ceiling(x)
zwraca przybliżenie całkowite liczby $x$ z góry,
abs(x)
zwraca wartość bezwzględną liczby $x$,
mod(n,k)
zwraca resztę z dzielenia liczby $n$ przez liczbę $k$
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