Wstep do pakietu algebry komputerowej Maple
Transkrypt
Wstep do pakietu algebry komputerowej Maple
Antoni C. Mituś Rafał Orlik Grzegorz Pawlik Wstęp do pakietu algebry komputerowej Maple Na prawach rękopisu - wszelkie prawa zastrzeżone Wrocław 2007 Spis treści 1 Maple w przykładach 1.1 Maple jako kalkulator . . . . . . . . . . . . 1.2 Przekształcanie wyrażeń . . . . . . . . . . . 1.3 Analityczne rozwiązywanie równań . . . . . 1.4 Numeryczne rozwiązywanie równań . . . . . 1.5 Działania na macierzach . . . . . . . . . . . 1.6 Pochodne i całki . . . . . . . . . . . . . . . 1.7 Równania różniczkowe . . . . . . . . . . . . 1.8 Wykresy . . . . . . . . . . . . . . . . . . . . 1.9 Projekt: ruch pod wpływem siły F (t) = e−t 2 Podstawowe pojęcia, struktury i 2.1 Uwagi ogólne . . . . . . . . . . 2.2 Podstawowe obiekty . . . . . . 2.3 Wyrażenia . . . . . . . . . . . . 2.4 Struktury danych: zbiory, listy i 2.5 Zmienne . . . . . . . . . . . . . konstrukcje . . . . . . . . . . . . . . . . . . . . . . . . tablice . . . . . . . . . . . 3 Funkcje Maple 3.1 Upraszczanie i przekształcanie wyrażeń 3.2 Elementy programowania . . . . . . . . 3.3 Funkcje i procedury . . . . . . . . . . . 3.4 Elementy grafiki dwuwymiarowej . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 6 6 7 7 8 8 8 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 14 17 22 24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 31 32 33 33 4 Spis treści 3.5 3.6 3.7 3.8 3.9 3.4.1 Podstawowe konstrukcje . . . . . . . . . . . . . . . . . . . 3.4.2 Wykresy parametryczne . . . . . . . . . . . . . . . . . . . 3.4.3 Wykresy w układzie współrzędnych biegunowych . . . . . 3.4.4 Wykresy krzywych zadanych w postaci niejawnej . . . . . 3.4.5 Dane dyskretne . . . . . . . . . . . . . . . . . . . . . . . . 3.4.6 Pole wektorowe . . . . . . . . . . . . . . . . . . . . . . . . 3.4.7 Histogram . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.8 Animacja . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementy grafiki trójwymiarowej . . . . . . . . . . . . . . . . . . 3.5.1 Podstawowe konstrukcje . . . . . . . . . . . . . . . . . . . 3.5.2 Wykresy parametryczne, krzywa przestrzenna . . . . . . . 3.5.3 Wykresy w układach współrzędnych: sferycznym i cylindrycznym . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.4 Wykresy powierzchni zadanych w postaci niejawnej . . . 3.5.5 Dane dyskretne . . . . . . . . . . . . . . . . . . . . . . . . 3.5.6 Pole wektorowe . . . . . . . . . . . . . . . . . . . . . . . . 3.5.7 Animacja . . . . . . . . . . . . . . . . . . . . . . . . . . . Rozwiązywanie równań i nierówności algebraicznych . . . . . . . Elementy algebry liniowej . . . . . . . . . . . . . . . . . . . . . . 3.7.1 Definiowanie wektorów i macierzy . . . . . . . . . . . . . 3.7.2 Podstawowe operacje na wektorach . . . . . . . . . . . . . 3.7.3 Podstawowe operacje na macierzach . . . . . . . . . . . . 3.7.4 Wartości i wektory własne . . . . . . . . . . . . . . . . . . Granice, pochodne i całki . . . . . . . . . . . . . . . . . . . . . . 3.8.1 Granice . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.2 Pochodne . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.3 Szereg Taylora . . . . . . . . . . . . . . . . . . . . . . . . 3.8.4 Całki oznaczone . . . . . . . . . . . . . . . . . . . . . . . 3.8.5 Całkowanie numeryczne . . . . . . . . . . . . . . . . . . . 3.8.6 Całki niewłaściwe . . . . . . . . . . . . . . . . . . . . . . 3.8.7 Całki nieoznaczone . . . . . . . . . . . . . . . . . . . . . . 3.8.8 Całki wielokrotne . . . . . . . . . . . . . . . . . . . . . . . Wybrane zagadnienia analizy matematycznej . . . . . . . . . . . 3.9.1 Elementy analizy wektorowej . . . . . . . . . . . . . . . . 3.9.2 Równania różniczkowe zwyczajne: metody analityczne . . 3.9.3 Równania różniczkowe zwyczajne: metody numeryczne . . 3.9.4 Równania różniczkowe zwyczajne: metody graficzne . . . . . . . . . . . . . . 33 35 36 36 37 38 40 41 41 41 43 . . . . . . . . . . . . . . . . . . . . . . . . . 44 45 46 46 48 49 52 52 55 56 57 58 58 59 60 61 62 62 63 63 64 64 66 67 69 Rozdział 1 Maple w przykładach Celem pierwszego wykładu jest prezentacja wybranych przykładów, ilustrujących oferowane przez Maple narzędzia matematyczne. Ograniczymy się przy tym do kręgu typowych zagadnień z matematyki, z którymi student spotyka się w czasie pierwszego roku studiów. Składnia występujących poniżej poleceń będzie szczegółowo omówiona w kolejnych wykładach. Zachęcamy Czytelnika do modyfikowania kodu i prób eksperymentowania! 1.1 Maple jako kalkulator Maple może działać jako kalkulator, mający wbudowane standardowe funkcje matematyczne: > 2.13*sin(2.22)-log(2.7)/exp(-0.11); 0.587939283 Działania na liczbach wymiernych są wykonywane bez konwersji na liczby rzeczywiste: > 1/7+(2/12-1/3)/(1/2+4/13); −4 63 √ Zaimplementowana jest arytmetyka liczb zespolonych (I oznacza −1): > 2*I + (1-I)/(1+2*I); 5 6 Rozdział 1. Maple w przykładach −1 7 + I 5 5 1.2 Przekształcanie wyrażeń Przypiszemy zmiennej a wyrażenie b + c2 > a:= b + c^2; a := b + c2 Zmienna a może być użyta do konstrukcji wyrażeń arytmetycznych: > a1:=a^5; a1 := (b + c2 )5 , na których można wykonywać kolejne przekształcenia. Na przykład, przedstawimy w postaci wielomianowej wyrażenie przypisane zmiennej a1 : > expand(a1); b5 + 5 b4 c2 + 10 b3 c4 + 10 b2 c6 + 5 b c8 + c10 1.3 Analityczne rozwiązywanie równań Dane jest równanie kwadratowe: x2 + 5 x + 1 = 0. Jego pierwiastki wynoszą: > solve(x^2+5*x+1=0,x); √ √ 5 21 5 21 − + ,− − 2 2 2 2 Znajdziemy rozwiązanie układu równań liniowych: x + y = 2, x − y = 0: > solve({x+y=2,x-y=0},{x,y}); {y = 1, x = 1} 1.4. Numeryczne rozwiązywanie równań 1.4 7 Numeryczne rozwiązywanie równań Gdy Maple nie znajduje ścisłego rozwiązania równania, można użyć metod numerycznych do wyznaczenia przybliżonego rozwiązania. Taka sytuacja ma miejsce 2 dla równania: sin(x) = e−x . Jedno z przybliżonych rozwiązań tego równania wynosi: > fsolve(sin(x)=exp(-x^2),x); 0.6805981744 1.5 Działania na macierzach Obliczymy wyznacznik, ślad oraz macierz odwrotną macierzy A = [[1, 2], [1, 3]]. > with(linalg): Warning, the protected names norm and trace have been redefined and unprotected > A:=matrix([[1,2],[1,3]]); " # 1 2 A := 1 3 Wyznacznik i ślad macierzy A wynoszą: > det(A); trace(A); 1 4 Macierz odwrotna do A ma postać: > B:=evalm(A^(-1)); " B := 3 −2 −1 1 # 8 Rozdział 1. Maple w przykładach 1.6 Pochodne i całki Obliczymy pierwszą i drugą pochodną funkcji sin(x): > diff(sin(x),x); diff(sin(x),x$2); cos(x) − sin(x) R Znajdziemy całkę nieoznaczonoą cos(t) t2 dt: > int(cos(t)*t^2,t); Całka oznaczona R2 1 t2 sin(t) − 2 sin(t) + 2t cos(t) sin(ln(x)) dx wynosi: > int(sin(ln(x)),x=1..2); − cos(ln(2)) + sin(ln(2)) + 1.7 1 2 Równania różniczkowe Rozwiążemy równanie różniczkowe: bodnego oscylatora harmonicznego. d2 dt2 x(t) + x(t) = 0, opisujące ruch swo- > difeq:=diff(x(t),t$2) + x(t)=0; d2 dif eq := 2 x(t) + x(t) = 0 dt > dsolve(difeq,x(t)); x(t) = C1 sin(t) + C2 cos(t) W rozwiązaniu występują dwie dowolne stałe: C1 i C2. 1.8 Wykresy Na poniższym rysunku przedstawiono wykres funkcji y = cos(x)(x + sin(x)) w przedziale 0 ¬ x ¬ 4π: 1.9. Projekt: ruch pod wpływem siły F (t) = e−t 9 > plot(cos(x)*(x+sin(x)),x=0..4*Pi); 10 5 0 2 6 x 4 8 10 12 –5 Tworzenie wykresów trójwymiarowych jest równie proste. Narysujemy wykres funkcji z(x, y) = sin(x, y): > with(plots): Warning, the name changecoords has been redefined > plot3d(sin(x*y),x=-Pi..Pi,y=-Pi..Pi,axes=box); 1 0.5 0 –0.5 –1 –3 1.9 –2 –1 0 y 1 2 3 3 2 1 0 –1 x –2 –3 Projekt: ruch pod wpływem siły F (t) = e−t Przedstwione w tym rozdziale narzędzia Maple pozwalają na analizę wielu zagadnień fizycznych. Zbadamy jednowymiarowy, prostoliniowy ruch cząstki o masie m = 1 pod wpływem siły zależnej od czasu: F (t) = e−t . W chwili t = 0 spoczywająca cząstka znajduje się w punkcie o współrzędnej x = 0. Należy znaleźć zależność położenia cząstki od czasu x(t), narysować wykres tej zależności oraz obliczyć czas t0 , po upływie którego cząstka znajdzie się w punkcie o współ- 10 Rozdział 1. Maple w przykładach rzędnej x = 1. 1 Należy rozwiązać równanie Newtona dla siły F (t): je w Maple: d2 dt2 x(t) = e−t . Napiszemy > restart: > diffeq:=diff(x(t),t$2)=exp(-t); d2 dif f eq := 2 x(t) = e(−t) dt Rozwiążemy to równanie: > dsolve(diffeq,x(t)); x(t) = e(−t) + C1t + C2 Przypiszemy znalezione rozwiązanie zmiennej x: > x := exp(-t)+ C1+ C2*t; x := e(−t) + C1 + C2t Stałe, oznaczone przez C1 i C2, wyznacza się z warunków początkowych. Wiemy, że prędkość w chwili t = 0 wynosi v(0) = 0. Prędkość obliczamy jako pochodną położenia cząstki po czasie: > v:=diff(x,t); v := −e(−t) + C2 Z warunku v(0) = 0 otrzymujemy równanie 0 = − exp(0) + C2 = −1 + C2, skąd C2 = 1. Nasze rozwiązanie przyjmuje postać: > x:=exp(-t)+ C1+t; x := e(−t) + C1 + t Z drugiego warunku początkowego, x(0) = 0, otrzymujemy równanie x(0) = exp(0) + C1 = 1 + C1, skąd C1 = −1. Znależliśmy w ten sposób zależność x od czasu: > x :=exp(-t)-1+t; x := e(−t) − 1 + t Narysujemy wykres zależności x(t): > plot(x,t=0..3); 1 Przedstawione poniżej rozwiązanie można znacznie skrócić. Naszym celem jest pokazanie tego, że dysponując bardzo ograniczonym zestawem funkcji Maple można otrzymać zadowalające rozwiązanie postawionego problemu. 1.9. Projekt: ruch pod wpływem siły F (t) = e−t 11 2 1.5 1 0.5 0 0.5 1 1.5 t 2 2.5 3 Czas t0 , będący pierwiastkiem równania x(t0 ) = 1, wyznaczymy numerycznie: > fsolve(x=1,t); 1.841405660 12 Rozdział 1. Maple w przykładach Rozdział 2 Podstawowe pojęcia, struktury i konstrukcje 2.1 Uwagi ogólne Zaczniemy od kilku ważnych informacji na temat edytora arkusza roboczego (ang. worksheet) pakietu. Interpreter Maple rozróżnia duże i małe litery. Informację, która ma być przetworzona przez Maple, wpisuje się po znaku zachęty. Składa się ona z poleceń, funkcji, wyrażeń itd. i musi być zakończona dwukropkiem lub średnikiem. W linii może znajdować się więcej niż jedno polecenie; każde z nich musi kończyć się średnikiem lub dwukropkiem. Jeżeli informacja wejściowa nie mieści się w jednej linii, można przejść do następnej linii za pomocą kombinacji klawiszy SHIFT + ENTER; tworzy się wówczas grupa dwóch linii połączonych z lewej strony klamrą. Naciśnięcie klawisza ENTER powoduje wykonanie poleceń z danej linii (lub z kilku linii w obrębie jednej grupy). Gdy linię wejściową zakończono średnikiem powoduje to (z reguły) wyświetlenie wyniku obliczeń wykonanych przez Maple na ekranie; wyniki nie są wyświetlane, gdy linia kończy się dwukropkiem: > 2; 2 > 3: 13 14 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje Podczas edycji arkusza roboczego szczególnie przydatne są skróty CTRL+K i CTRL+J, powodujące wstawienie nowej linii przed i po aktualnej linii. Informację wejściową można wprowadzać w trybie matematycznym albo tekstowym; wyboru między nimi dokonuje się za pomocą klawisza F5. Użycie klawisza F3 powoduje rozbicie grupy linii połączonych wspólną klamrą; klawisz F4 powoduje połączenie dwóch grup linii. Wyrażenia matematyczne, zapisane w notacjiMaple w trybie tekstowym, mogą być (po podświetleniu) zapisane w standardowej notacji matematycznej za pomocą ciągu Format-Convert to-Math Expression dostępnego z głównego menu arkusza roboczego Maple. Zawartość arkusza roboczego, lub jego części, można zapisać w formacie LATEX, HTML oraz w plikach języka Fortran lub C. Zagadnienia te są krótko omówione w rozdziale dwunastym. Przy pracy z pakietem bardzo użyteczny jest rozwinięty system pomocy. Informację odnośnie obiektu Maple o nazwie ”obiekt” uzyskuje się wykonując polecenie ?obiekt. Na przykład, informację o całkowaniu otrzymuje się w następujący sposób: > ?int; Nie zamieszczamy tu, z braku miejsca, odpowiedzi Maple. Polecenie restart restartuje jądro Maple i oczyszcza wewnętrzną pamięć, powodując tym samym usunięcie przypisań nadanych zmiennym: > restart; 2.2 Podstawowe obiekty Zaliczają się do nich liczby całkowite i ułamki: > 2; 1/9; oraz liczby rzeczywiste: 2 1 9 > 27.2; 0.272*10^2; 0.272e2; 27.2 2.2. Podstawowe obiekty 15 27.200 27.2 Maple traktuje ułamek 1/9 jako symbol, a nie jako liczbę zmiennoprzecinkową. Przejścia do reprezentacji zmiennoprzecinkowej dokonuje się za pomocą polecenia evalf. W dalszej części wykładu wprowadzone zostaną odgrywające podobne role polecenia evalb, evalc, evalm. Mają one prostą składnię: evalf(expr) evalb(expr) evalc(expr) evalm(expr) W naszym przypadku: > evalf(1/9); 0.1111111111 Liczby zespolone, będące wyrażeniami arytmetycznymi, omówimy w rozdziale 2.3. Druga grupa obiektów to stałe matematyczne: Pi (π = 3.14 . . .), exp(1) (e √ – podstawa logarytmów naturalnych), I = −1, infinity (∞), true, false (patrz ?constants): > Pi; evalf(Pi); exp(1); evalf(exp(1)); π 3.141592654 e 2.718281828 > I; infinity; true; I ∞ true oraz zmienne globalne i otoczeniowe (ang. global and environment variables), patrz ?ininame, w ich liczbie Digits (liczba cyfr znaczących w arytmetyce zmiennoprzecinkowej): > Digits; 10 16 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje Wartość przypisana zmiennej tego typu może być zmieniona za pomocą nowego przypisania. Można również użyć jej nowej wartości jako parametru funkcji Maple jak w poniższym przykładzie, gdzie podano 20 cyfr znaczących liczby π: > evalf(Pi,20); 3.1415926535897932385 Ostatni omawiany podstawowy obiekt to łańcuch: > ’Burek’; Burek Maple oferuje wiele typów obiektów. Funkcje whattype i hastype: whattype(expr) hastype(expr, typ) dostarczają informacji o typie obiektu. Liczby całkowite, ułamki oraz liczby rzeczywiste są stałymi o typie numerycznym (ang. numeric): > whattype(2); whattype(1/9); whattype(27.2); integer f raction f loat > hastype(2,numeric); hastype(1/9,numeric); hastype(27.2,numeric); true true true Stała Pi nie ma typu numerycznego: > whattype(Pi); whattype(evalf(Pi)); hastype(Pi,numeric); symbol f loat f alse 2.3. Wyrażenia 2.3 17 Wyrażenia Wyrażenia są jednymi z najważniejszych struktur Maple. W ich skład mogą wchodzić stałe, zmienne, funkcje i łańcuchy. Omawianie wyrażeń rozpoczniemy od wyrażeń arytmetycznych. Ich części składowe połączone są za pomocą działań arytmetycznych: dodawania (+), odejmowania (-), mnożenia (*), dzielenia (/) oraz potęgowania (^): > 2 + x^(2*y)/(x-y); 2+ x(2y) x−y Jaki typ ma to wyrażenie? Odwołamy się do zmiennej otoczeniowej %, której Maple przypisuje wynik ostatnio obliczonego wyrażenia (zmiennej %% przypisuje się wynik przedostatniego obliczonego wyrażenia) i użyjemy funkcji whattype: > whattype(%); + Powyższe wyrażenie jest (ma typ) sumą. Do konstrukcji wyrażeń można używać funkcji. Maple ma wbudowaną większość elementarnych i specjalnych funkcji znanych z analizy matematycznej i trygonometrii (patrz ?inifcn). Wiele funkcji z zakresu algebry, teorii liczb i statystyki matematycznej znajduje się w pakietach, które muszą być wczytane. Spis dostępnych pakietów otrzymuje się wykonując polecenie ?index[package]. W szczególności sqrt, ln, exp, sin, arcsin, tan oznaczają, kolejno, funkcje: pierwiastek, logarytm naturalny, wykładniczą, sinus, arcus sinus i tangens. Do wyznaczania wartości bezwzględnej służy funkcja abs. Funkcje wywołuje się z argumentem podanym w okrągłym nawiasie: > abs(sin(-Pi/2))+ y*tan(2*Pi/3); √ 1−y 3 > (arcsin(x^2)-1)/(ln(exp(x))); arc sin(x2 ) − 1 ln(ex ) Gdy argument ma typ zmiennoprzecinkowy, Maple wykonuje obliczenia stosując artmetykę zmiennoprzecinkową: 18 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje > sqrt(3)+1/2; sqrt(3.0)+1/2; √ 1 3+ 2 2.232050808 Ważną klasą wyrażen arytmetycznych są liczby zespolone, zawierające stałą √ 1 I = −1 . Obliczymy I 2 oraz iloczyn liczb zespolonych 2 + 3I, 2 − 3I: > I*I; −1 > (2+I*3)*(2-I*3); 13 Funkcje Re i Im służą do obliczania części rzeczywistej i urojonej liczby zespolonej: > Re(2+I*3);Im(2+I*3); 2 3 Funkcje abs i conjugate obliczają wartość bezwzględną i liczbę sprzężoną: > abs(2+I*3); √ 13 > conjugate(2+I*3); 2 − 3I Poniższy przykład może zaskoczyć użytkownika: > Re(a+I*b); <(a + bI) Wynik jest bezpośrednim rezultatem filozofii oprogramowania pakietu Maple, w myśl której w wyrażeniach zespolonych (i nie tylko) wszystkie występujące zmienne są traktowane jako zmienne zespolone. Tak więc część rzeczywista powyższego wyrażenia nie wynosi a. Aby a i b mają były traktowane jako wyrażenia rzeczywiste, użytkownik musi poinformować o tym Maple, za pomocą polecenia assume (omówionego w następnym rozdziale) albo polecenia evalc: 1 W zastosowaniach fizycznych używa się notacji i = √ −1 2.3. Wyrażenia 19 > evalc(%); a Druga grupa wyrażeń to wyrażenia logiczne (patrz ?boolean), przyjmujące wartości logiczne prawda (true) i fałsz (false). Tworzy się je za pomocą operatorów logicznych: and, or, not oraz operatorów relacji: < (mniejszy), <= (mniejszy lub równy), > (większy), >= (większy lub równy), = (równy), <> (nierówny). Polecenie evalb służy do obliczania wartości logicznej wyrażenia. Na przykład: > 2>3; evalb(2>3); evalb(2-x>0); 3<2 f alse x<2 W ostatnim przypadku Maple nie obliczył wartości logicznej wyrażenia, ponieważ zmiennej x nie przypisano wartości. Zauważymy, że wyrażenia logiczne, w których występuje stała Pi, mogą nastręczać kłopotów związanych z tym, że Maple porównuje wyrażenia typu numeric, a Pi ma inny typ: > evalb(2>Pi); π<2 Problem można częściowo usunąć za pomocą polecenia is: > is(2-Pi>0); f alse Przy konstrukcji wyrażeń należy rygorystycznie przestrzegać hierarchii kolejności działania występujących w nich operatorów: najwyżej w niej umiejscowione są operatory arytmetyczne, następnie operatory logiczne, a na końcu – operatory relacji (patrz ?operators[precedence]). Sugerujemy, w celu uniknięcia pomyłek, używanie nawiasów tworzących grupy wyrażeń. Zilustrujemy te uwagi na przykładzie jednego z praw de Morgana: zaprzeczenie koniunkcji to alternatywa zaprzeczeń: > evalb((not(a and b)) = ((not a) or (not b))); true Zwraca uwagę fakt, że wyrażenia a i b nie były deklarowane jako wyrażenia logiczne. Jest to konsekwencją ogólnej strategii Maple, polegającej na określeniu 20 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje typu wyrażenia na podstawie kontekstu w którym je użyto. Zauważmy również, że wyrażeniom a, b nie przypisano żadnych wartości logicznych. Oznacza to, że Maple ma wbudowane tautologie logiczne. Wyrażenia arytmetyczne można grupować w ciąg wyrażeń, będący ważną strukturą Maple, stosowaną między innymi do tworzenia innych struktur danych. Najprostszy sposób utworzenia ciągu wyrażeń polega na użyciu operatora - przecinka (,). Na przykład: > 1,a^2,sin(z); 1, a2 , sin(z) > whattype(%); exprseq Wynik ma typ ”ciąg wyrażeń” (ang. expression sequence). Dwa podstawowe narzędzia do tworzenia ciągów wyrażeń to polecenie seq oraz operator powtórzeń $. Najczęściej stosowane wywołanie polecenia seq ma postać: seq(f, i=m..n) gdzie f oznacza wyrażenie, i - nazwę (łańcuch), a m i n przypisano wartości numeryczne. W wyniku otrzymuje się ciąg wyrażeń f obliczonych dla kolejnych wartości licznika i, wynoszących m, m+1, ..., n. Na przykład: > seq(n^2,n=1..4); 1, 4, 9, 16 Operator $ tworzy ciąg składający się z n kopii wyrażenia: expr $ n Na przykład, > sin(z)$3; sin(z), sin(z), sin(z) Wyrażenia tworzące ciąg wyrażeń są numerowane za pomocą indeksu - do tego zagadnienia powrócimy w rozdziale 2.5, przy omawianiu pojęcia zmiennej indeksowanej. Do badania struktury wyrażeń używa się poleceń op oraz nops, zwracających ciąg komponentow wyrażenia symbolicznego oraz ich liczbę: 2.3. Wyrażenia 21 op(i,expr) op(list,expr) nops(expr) gdzie i, list to, odpowiednio, liczba naturalna albo lista liczb naturalnych. Przykład 2.1. Zbadać strukturę (komponenty) wyrażenia x4 + sin(x). > wyr:=x^4+sin(x); wyr := x4 + sin(x) Na pierwszym poziomie mamy dwa komponenty: > nops(wyr); op(wyr); 2 x4 , sin(x) Pierwszy i drugi komponent otrzymuje się podając jego numer, będący liczbą naturalną z przedziału od 1 do nops(wyr): > op(1,wyr);op(2,wyr); x4 sin(x) / Dalsza analiza komponentów wymaga przejścia na kolejny poziom strukturalny. Można zagnieżdżać polecenie op: op(an, op(..., op(a2, op(a1,e)) ...) lub stosować jego skróconą wersję: op([a1, a2, ..., an], e). W rozważanym przykładzie pierwszy komponent pierwszego komponentu wynosi: > op([1,1],wyr); x Drugi komponent pierwszego komponentu to: > op([1,2],wyr); 4 Funkcja op oferuje prosty spoób dokonywania skomplikowanych podstawień. Przykład 2.2. Zamienić w wyrażeniu wyr z poprzedniego przykładu liczbę 4 na sin(y). W tym celu stwierdzamy, jakiej liście indeksów odpowiada komponent 4 i stosujemy polecenie op: > wyr:=subs(op([1,2],wyr)=sin(y),wyr); wyr := xsin(y) + sin(x) 22 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje (polecenie subs będzie omówione w trzecim rozdziale.) Maple ma wbudowane polecenie subsop, które upraszcza linię wejściową: > subsop([1,2]=sin(y), wyr); xsin(y) + sin(x) / 2.4 Struktury danych: zbiory, listy i tablice Lista to kolejny typ danych, opisujący zbiory (”nieuporządkowane” listy) oraz ”uporządkowane” listy. Zaczniemy od zbiorów (ang. set), tworzonych za pomocą nawiasów klamrowych z ciągu wyrażeń: > {1,3,2,4}; {1,2,4,2}; {1, 2, 3, 4} {1, 2, 4} > whattype(%); set Zwraca uwagę zmiana kolejności elementów zbioru w pierwszym przykładzie i opuszczenie powtarzającego się elementu (2) w drugim. Listę (uporządkowaną) (ang. list) tworzy się za pomocą nawiasów kwadratowych: > [1,3,2,4]; [1,2,4,2]; [1, 3, 2, 4] [1, 2, 4, 2] > whattype(%); list W przeciwieństwie do poprzedniego przykładu, kolejność elementów listy została zachowana, a powtarzające się elementy nie są usuwane. Dostęp do elementu listy uzyskuje się za pomocą indeksu (patrz rozdział 2.5). W poniższym przykładzie wyznaczymy pierwszy element zbioru i trzeci element listy: > S:={1,2,4}; S[1]; S := {1, 2, 4} 1 2.4. Struktury danych: zbiory, listy i tablice 23 > L:=[a,b,c,d]; L[3]; L := [a, sin(t), c, d] c Omówimy dwie proste, ale ważne operacje na listach: dodawanie elementu do listy oraz łączenie list. Znajduje tu zastosowanie polecenie op, które działając na listę usuwa nawiasy kwadratowe, tworząc z niej ciąg wyrażeń. Niech L oznacza listę z ostatniego przykładu: > op(L); whattype(%); a, sin(t), c, d exprseq Element e dodajemy do listy L w intuicyjnie jasny sposób: > L1:=[op(L), e]; L1 := [a, sin(t), c, d, e] Dwie listy łączymy na podobnej zasadzie. Na przykład, połączymy listy L i L1: > L2:=[op(L), op(L1)]; 2 := [a, sin(t), c, d, a, sin(t), c, , d, e] Rozszerzenie koncepcji listy prowadzi do struktury danych zwanej tablicą (ang. array). Każdy element tablicy odpowiada zbiorowi indeksów, a więc ta struktura nie jest, w przeciwieństwie do listy, jednowymiarowa. Zdefiniujemy tablicę 3 × 3, nie przypisując jej elementom żadnych wartości:: > tabl:=array(1..3,1..3,[]); tabl := array(1..3, 1..3, []) Do elementów tej tablicy odwołujemy się za pomocą pary indeksów: > tabl[1,1]; tabl1,1 Ponieważ tablice grają szczególnie ważną rolę w naukach ścisłych, zostaną one dokładniej omówione w rozdziale dziewiątym, dotyczącym algebry liniowej. Ostatnia omawiana struktura danych to uogólniona tablica (ang. table), rozszerzająca wprowadzony wyżej typ tablicowy array. Różnica między nimi polega na tym, że indeksem w typie table może być dowolny obiekt, nie tylko liczba 24 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje naturalna. Przykład 2.3. Skonstruować tablicę, zawierającą całki z funkcji: x, sin(x), exp(x); indeksem ma przy tym być nazwa funkcji. > calka:=table([x=x^2/2, sin(x)=-cos(x), exp(x)=exp(x)]); x2 calka := table([x = , sin(x) = − cos(x)ex = ex ]) 2 Całka z funkcji sin(x) wynosi: > calka[sin(x)]; − cos(x) / 2.5 Zmienne Głównym obszarem zastosowań pakietów algebry komputerowej są obliczenia symboliczne. Jednym z podstawowych pojęć jest tu, tak jak w językach programowania zorientowanych na obliczenia numeryczne, pojęcie zmiennej. Zmienna (ang. variable) ma nazwę 2 (ang. name), zazwyczaj zaczynającą się od litery. W odróżnieniu od większości języków programowania, w Maple nie ma konieczności definiowania typu zmiennej, który zostanie określony automatycznie na podstawie kontekstu, w jakim zmienna jest użyta: > a; whattype(a); a symbol Taka swobodna zmienna (ang. free variable) nie ma przypisanej wartości. Przypisanie zmiennej wyrażenia dokonuje się za pomocą operatora przypisania (:=) w następujący sposób: zmienna := expr Na przykład: > a:=2; 2 Różnica między nazwą a łańcuchem polega między innymi na tym, że nazwa nie wymaga użycia apostrofów 2.5. Zmienne 25 a := 2 W celu sprawdzenia tego, jaka wartość jest przypisana zmiennej o nazwie a należy wykonać polecenie > a; 2 Umieszczenie nazwy zmiennej między dwoma apostrofami powoduje usunięcie przypisania wartości tej zmiennej: > a:=’a’: a; a Szczególnie ważna rolę w obliczeniach symbolicznych odgrywają przypisania złożone. W Maple przyjęto zasadę, że dla zmiennych globalnych obowiązuje pełne obliczenie wartości jej przypisania (ang. full evaluation). Zmienne globalne to, w szczególności, zmienne występujące w standardowej (interaktywnej) sesji Maple. Dla zmiennych lokalnych, występujących w procedurach, reguła obliczania jest inna. Jeżeli więc zmiennej globalnej przypisano inną zmienną globalną 3 itd., to przy obliczaniu wartości przypisanej pierwszej zmiennej Maple wykonuje pełny łańcuch przypisań. Nieliczne wyjątki od tej reguły przedstawimy w dalszej części wykładu. Zilustrujemy tę fundamentalną zasadę na prostym przykładzie - przypiszemy zmiennej a zmienną b, a tej ostatniej - wartość 2. W wyniku pełnego obliczenia wartości przypisanej zmiennej a otrzymuje się 2: > a:=b: b:=2: a; 2 Zmienimy wartość przypisaną zmiennej b na sin(t): > b:=sin(t); b := sin(t) Zmienna a ma teraz przypisaną wartość sin(t): > a; sin(t) 3 Zmienna jest reprezentowana wewnętrznie za pomocą wektora o trzech polach; przypisanie zmiennej pewnej wartości oznacza stworzenie wskażnika łączącego wektor opisujący zmienną z wektorem, opisującym przypisaną wartość. 26 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje Do tej pory zajmowaliśmy się zmiennymi prostymi. W Maple istnieją także zmienne indeksowane. Tworzy się je przez dołączenie do nazwy zmiennej indeksu, będącego listą utworzoną z liczb naturalnych: > c[1,2]; whattype(%); c1, 2 indexed Użycie indeksu nie powoduje tego, że zmienna c jest tablicą. Staje się nią dopiero po przypisaniu zmiennej indeksowanej wartości. Na przykład, wykonanie instrukcji: > a[1]:=5; a[2]:=3; a1 := 5 a2 := 3 powoduje utworzenie tablicy i przypisanie jej elementom, indeksowanym liczbami 1 i 2, odpowiednio wartości 5 i 3. Zwrócimy uwagę na następujący ważny fakt. Nazwa a odnosi się do całej zmiennej indeksowanej. W celu sprawdzenia wartości przypisanych elementom a[1] itd. nie wystarczy wykonać polecenia > a; a Jest to jeden z nielicznych wyjątków od zasady pełnego obliczania. Ten sposób obliczania, noszący nazwę zasady obliczanie ”do ostatniej nazwy” (ang. last name evaluation), patrz ?last name eval, polega na wykonania łańcucha przypisań aż do momentu osiągnięcia ostatniej nazwy występującej w tym łańcuchu, reprezentującej tablicę, macierz lub procedurę. W celu sprawdzenia pełnych przypisań należy użyć polecenia eval, wymuszającego wykonanie pełnego obliczania. Jego składnia ma postać4 : eval(expr) W naszym przypadku: > eval(a); whattype(eval(a)); table([1 = 5, 2 = 3]) table Zgodnie z wcześniejszym stwierdzeniem, utworzona została tablica. 4 Polecenie to w postaci eval(expr, x = a) oblicza wartość wyrażenia w punkcie x = a. 2.5. Zmienne 27 W rozdziale 2.3 omawialiśmy ciągi wyrażeń. Rozpatrzymy ciąg: > ciag:=seq(k^2,k=0..5); ciag := 0, 1, 4, 9, 16, 25 Do jego elementów odwołujemy się za pomocą indeksu. W Maple indeks pierwszego składnika wynosi 1: > ciag[1]; ciag[6]; 0 25 natomiast element indeksowany liczbą 0, tj. ciag[0], nie istnieje: > ciag[0]; Error, invalid subscript selector Często korzysta się ze zmiennej przy założeniu, że ma pewną własność – na przykład jest dodatnia. Ustalenie tej własności odbywa się za pomocą polecenia assume: assume(expr, własność) Na przykład, > assume(x>0); x; x˜ Tylda towarzysząca nazwie zmiennej wskazuje na istnienie nałożonych na nią ograniczeń. Polecenie about informuje o aktualnych własnościach zmiennej: > about(x); Originally x, renamed x˜: is assumed to be: RealRange(Open(0), infinity) Kolejne polecenie assume anuluje aktualne ograniczenia: > assume(x>0): assume(x<2): about(x); Originally x, renamed x˜: is assumed to be: RealRange(-infinity, Open(2)) W celu uzupełnienia listy ograniczeń o nowe ograniczenie używa się polecenia additionally: additionally(expr, własność) 28 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje Na przykład, > assume(x>0): additionally(x<2): about(x); Originally x, renamed x˜: is assumed to be: RealRange(Open(0), Open(2)) Umieszczenie nazwy zmiennej między dwoma apostrofami powoduje usunięcie ograniczenia: > x:=’x’: about(x); x: nothing known about this object Jeżeli zmienna z ograniczeniem występuje w wyrażeniu, to powyższy sposób nie jest skuteczny: > assume(a>0): wyr:=a^2: a:=’a’; wyr; a := a a˜2 Należy najpierw usunąć ograniczenie na zmienną w wyrażeniu, a nstępnie przypisać zmiennej jej nazwę, umieszczając ją pomiędzy apostrofami: > assume(a>0): wyr:=a^2: wyr:=subs(a=’a’,wyr); a:=’a’; wyr := a2 a := a (polecenie subs będzie omówione w trzecim rozdziale). Zauważymy, że jeżeli ograniczenie używane jest tylko do jednej operacji i po jej ukończeniu powinno być usunięte, wygodniej jest użyć polecenia assuming. Podobnego typu trudności powstają przy próbie przypisania wartości zmiennej z ograniczeniem, będącej częścią wyrażenia. Po wykonaniu poniższych poleceń oczekujemy, że końcowy wynik wynosi 4, a tymczasem: > assume(b>0): wyr:=b^2; b:=2; wyr; wyr := b˜2 b := 2 b˜2 Przypisanie zmiennej z ograniczeniem pewnej wartości dokonuje się za pomocą polecenia assign 5 : 5 Polecenie assign ma jeszcze jedną postać, która będzie omówiona przy rozwiązywaniu równań. 2.5. Zmienne 29 assign(nazwa = expr) W naszym przypadku > assume(c>0): wyr:=c^2; assign(c=2);wyr; wyr := c˜2 4 30 Rozdział 2. Podstawowe pojęcia, struktury i konstrukcje Rozdział 3 Funkcje Maple 3.1 Upraszczanie i przekształcanie wyrażeń simplify(expr) normal(expr) expand(expr) combine(expr) factor(expr) collect(expr, x) map(fcn, expr) convert(expr, nazwa) subs(wyr1=wyr2, wyr) 31 32 Rozdział 3. Funkcje Maple 3.2 Elementy programowania for nazwa | from expr || by expr || to expr || while expr | do ciąg poleceń end do; |...| oznacza, że dany składnik występuje opcjonalnie1 . Średnik (dwukropek) poprzedzający słowo end do może być pominięty. while expr do ciąg poleceń end do for name in expr do ciąg poleceń end do if cond expr then ciąg poleceń | elif cond expr then ciąg poleceń | | else ciąg poleceń | end if Pionowe ograniczniki |...| oznaczają, że dany składnik występuje opcjonalnie2 . Konstrukcja | elif cond expr then ciąg poleceń | może być wielokrotnie powtórzona. Przed słowami kluczowymi elif, else, end if można nie używać średników i dwukropków. sum(f, i=m..n) gdzie f oznacza wyrażenie, i – nazwę (zmienna sumowania), a m i n – liczby całkowite lub wyrażenia określające granice sumowania. product(f, i=m..n) 1 2 Zamiast end do można użyć słowa od, pochodzącego ze starszych wersji Maple Zamiast end if można użyć słowa fi, pochodzącego ze starszych wersji Maple 3.3. Funkcje i procedury 3.3 33 Funkcje i procedury nazwa funkcji := nazwa zmiennej → wyrażenie Jeżeli zmiennych jest więcej niż jedna, to muszą być one oddzielone przecinkami, a całość ujęta w okrągłe nawiasy. f := unapply(expr,nazwa zmiennej) Jeżeli zmiennych jest więcej niż jedna, to muszą być one oddzielone przecinkami, lub tworzyć listę. (f @ g)(x) (f @ n)(x) nazwa zmiennej − > piecewise (warunek 1, wartość 1, ..., warunek N, wartość N, default); nazwa zmiennej := proc(| ciąg parametrów |) | local ciąg nazw; || global ciąg nazw; || options ciąg nazw; | ciąg poleceń end; Pionowe ograniczniki |...| oznaczają, że dany składnik występuje opcjonalnie. Średnik (albo dwukropek) występujący bezpośrednio przed słowem kluczowym end może być pominięty. Zaleca się staranne definiowanie wszystkich lokalnych i globalnych zmiennych występujących w procedurach. Wynikiem działania procedury jest rezultat ostatniej operacji wykonanej w ciele procedury. 3.4 3.4.1 Elementy grafiki dwuwymiarowej Podstawowe konstrukcje plot(f(x), x=a..b, parametry) 34 Rozdział 3. Funkcje Maple gdzie f(x) oznacza funkcję (która może być podana w postaci wyrażenia, porównaj trzeci sposób tworzenia funkcji omówiony w rozdziale 5.1), a a..b – przedział wartości zmiennej niezależnej, dla których ma być narysowany wykres. Polecenie plot ma kilka ważnych parametrów (ang. options) służących do kontroli wyglądu wykresów (?plot, ?plot[options]). Maple ma wbudowany interaktywny kreator wykresów, służący do wyboru wartości parametrów za pomocą okna dialogowego. W celu jego uruchomienia należy albo zaznaczyć wynik uprzednio wykonanego polecenia Maple, a następnie wybrać opcje Plots, Plot Builder, albo użyć polecenia interactive (konieczne jest załadowanie pakietu plots): > with(plots): Warning, the name changecoords has been redefined > interactive(sin(x)/x); Initializing Java runtime environment. Po wykonaniu tych poleceń pojawia się okno dialogowe. Standardowo, wykres pojawia się w arkuszu roboczym. Wykres można umieścić w oddzielnym oknie – należy w tym celu otworzyć okno dialogowe, wychodząc z pozycji File w głównym menu: File/Preferences/Plotting/Plot Display. Zaczniemy od wykresu funcji sin(x2 ) w przedziale (−π, π): > plot(sin(x^2),x=-Pi..Pi); 1 0.5 –3 –2 –1 1 x 2 3 –0.5 –1 Przykład 3.1. Narysować na jednym rysunku wykresy następujących funkcji: 2 cos(x), sin(x), e−x w przedziale (−π, π), używając, odpowiednio, koloru niebieskiego, czerwonego i czarnego. > plot([cos(x),sin(x),exp(-x^2)],x=-Pi..Pi, color=[blue,red, black]); 3.4. Elementy grafiki dwuwymiarowej 35 1 0.5 –3 –2 –1 1 x 2 3 –0.5 –1 / display(L, parametry) Dla funkcji z poprzedniego przykładu mamy: > > > > p1:=plot(cos(x),x=-Pi..Pi): p2:=plot(sin(x),x=-Pi..Pi): p3:=plot(exp(-x^2),x=-Pi..Pi): display({p1,p2,p3}); 1 0.5 –3 –2 –1 1 x 2 3 –0.5 –1 3.4.2 Wykresy parametryczne plot([ x(t), y(t), t=a..b ], parametry) Przykład 3.2. Narysować elipsę, zadaną parametrycznie równaniami x(t) = sin(t), y(t) = 2 cos(t), t ∈ (0, 2 π). Użyć opcji scaling=constrained, powodującej użycie tej samej jednostki na obu osiach: 36 Rozdział 3. Funkcje Maple > plot([sin(t), 2*cos(t), t=0..2*Pi], scaling=constrained); 2 1 –1 –0.5 0 0.5 1 –1 –2 / 3.4.3 Wykresy w układzie współrzędnych biegunowych polarplot(r(phi), phi=a..b) Przykład 3.3. Narysować wykres spirali, zadanej w układzie współrzędnych √ biegunowych za pomocą równania r = φ. > with(plots): Warning, the name changecoords has been redefined > polarplot(sqrt(t),t=0..Pi*4); 2 1 –3 –2 –1 1 2 3 0 –1 –2 –3 / plot([ r(t), phi(t), t=a..b ],coords=polar, parametry) 3.4.4 Wykresy krzywych zadanych w postaci niejawnej implicitplot(równanie, x=a..b, y=c..d, parametry) 3.4. Elementy grafiki dwuwymiarowej 37 Przykład 3.4. Narysować wykres hiperboli x2 − y 2 = 1. > implicitplot(x^2-y^2=1,x=-3..3,y=-3..3); 2 y 1 –3 –2 –1 0 1 x 2 3 –1 –2 3.4.5 Dane dyskretne pointplot(L, parametry) L oznacza listę (albo zbiór) dwuelementowych list, zawierających współrzędne punktów. Przykład 3.5. Dane do wykresu są zbiorem dziewięciu par liczb [n, Ln ], n = 1 . . . 9, gdzie Ln oznacza n-tą liczbę pierwszą. Narysować wykresy, traktując parę liczb jako współrzędne punktu w układzie (a) kartezjańskim i (b) biegunowym. Użyjemy funkcji ithprime(n), zwracającej Ln . Opcja symbol=box ustala symbol graficzny (tutaj kwadrat, inne możliwości: point,cross,diamond,circle), jakim będą rysowane punkty wykresu, a symbolsize – jego wielkość. Listę par liczb nazwano dane. > dane:=[seq([i,ithprime(i)],i=1..9)]; dane := [[1, 2], [2, 3], [3, 5], [4, 7], [5, 11], [6, 13], [7, 17], [8, 19], [9, 23]] > pointplot(dane,symbol=box,symbolsize=20); 38 Rozdział 3. Funkcje Maple 20 15 10 5 2 6 4 8 Ostatni omawiany przypadek dotyczy sytuacji, gdy współrzędne x i y punktów znajdują się w dwóch oddzielnych listach lista x, lista y. scatterplot(lista x, lista y, parametry) Przykład 3.6. Narysować wykres dla danych dyskretnych: ListaX = [1,3,4,6], ListaY = [1,3,6,2]. > with(stats[statplots]): > ListaX:=[1,3,4,6];ListaY:=[1,3,6,2]; ListaX := [1, 3, 4, 6] ListaY := [1, 3, 6, 2] > scatterplot(ListaX,ListaY,symbol=cross,symbolsize=30,color= black); 6 5 4 3 2 1 1 2 3 4 5 6 / 3.4.6 Pole wektorowe fieldplot(lista, x=a..b, y=c..d, opcje) 3.4. Elementy grafiki dwuwymiarowej 39 Obiekt lista jest listą dwóch wyrażeń zależnych od x, y, interpretowanych jako składowe pola wektorowego w punkcie (x, y). Zmienne x, y przyjmują wartości z podanych przedziałów. Użyteczne parametry to arrow, który opisuje postać graficzną wektora, oraz grid, ustalający rozmiar siatki, na której będą rysowane wektory. ~ y) = [x, y] na siatce o rozmiaPrzykład 3.7. Narysować pole wektorowe A(x, rach 11 × 11. Użyjemy tu opcji axes = box, powodującej umieszczenie wykresu wewnątrz prostokąta. > fieldplot([x,y],x=0..1,y=0..1,arrows=SLIM, grid=[11,11],axes= box); 1 0.8 0.6 y 0.4 0.2 0 0 0.2 0.4 x 0.6 0.8 1 / gradplot(expr, x=a..b, y=c..d, parametry) Tutaj expr oznacza pole skalarne, zależne od zmiennych x, y, przyjmujących wartości z podanych przedziałów. Przykład 3.8. Narysować pole wektorowe, będące gradientem funkcji f (x, y) = x2 + y 2 , na siatce o rozmiarach 8 × 8. > gradplot(x^2+y^2,x=-1..1,y=-1..1,grid=[8,8]); 1 y –1 0.5 –0.5 0.5 x –0.5 –1 1 40 Rozdział 3. Funkcje Maple 3.4.7 Histogram histogram(lista, parametry) Obiekt lista zawiera listę danych służących do budowy histogramu. histogram(lista, parametry) Obiekt lista zawiera listę danych służących do budowy histogramu. Przykład 3.9. Narysować histogram reprezentujący empiryczny rozkład prawdopodobieństwa kolejnych dwustu liczb pierwszych, począwszy od liczby pierwszej 3. > with(stats[statplots]): > data:=[seq(ithprime(n),n=1..200)]: > histogram(data); 0.0014 0.0012 0.001 0.0008 0.0006 0.0004 0.0002 200 400 600 800 1000 1200 Tutaj słupki mają jednakowe pola, natomiast na poniższym histogramie mają jednakowe szerokości: > histogram(data,area=1); 0.14 0.12 0.1 0.08 0.06 0.04 0.02 200 400 600 800 1000 1200 / 3.5. Elementy grafiki trójwymiarowej 3.4.8 41 Animacja animate(plot, [f(x,t), x=a..b], t=p..q, argumenty) Pierwszy parametr (tutaj: plot) jest nazwą funkcji Maple służącej do tworzenia wykresu. Obiekty a, b mogą zależeć od t. Aby uruchomić animację należy zaznaczyć wykres, a następnie użyć menu kontekstowego, wywoływanego za pomocą prawego klawisza myszy, albo użyć symboli klawiszy przypominających klawisze magnetofonowe, które pojawiają się po zaznaczeniu wykresu nad arkuszem roboczym. Spośród parametrów warto wymienić frames, zmieniający liczbę klatek animacji wynoszącą standardowo 25. Przykład 3.10. Pokazać animację biegnącej fali sinusoidalnej. W tym celu użyć funkcji f (x, t) = sin(2π(x + t)) dla 0 ¬ x ¬ 4, oraz dla parametru animacji t z przedziału (0, 1). > animate(plot,[sin(2*Pi*(x+t)),x=0..4],t=0..1, tickmarks=[2,2]); 1 t = 0. 0 2 x 4 –1 3.5 3.5.1 Elementy grafiki trójwymiarowej Podstawowe konstrukcje plot3d(f(x,y), x=a..b, y=c..d, parametry) Tutaj f(x,y) oznacza funkcję (która może być podana w postaci wyrażenia w zmiennych x, y, porównaj trzeci sposób tworzenia funkcji omówiony w rozdziale 5.1), natomiast a..b, c..d – przedziały wartości zmiennych niezależnych x, y, 42 Rozdział 3. Funkcje Maple dla których ma być narysowany wykres3 . Polecenie plot3d ma kilka ważnych parametrów (ang. options) służących do kontroli wyglądu wykresów (?plot3d, ?plot3d[options]). Rozpatrzymy funkcję z(x, y) = √ 1 . x2 +y 2 +1 > z:=1/sqrt(1+x^2+y^2); 1 z := p 1 + x2 + y 2 Jej wykres ma postać: > plot3d(z,x=-2..2,y=-2..2,axes=box); 1 0.8 0.6 0.4 –2 –2 –1 –1 y 0 0 1 1 2 x 2 Parametr style, przyjmujący wartości patch, patchcontour, patchnogrid, contour, pozwala zmienić styl rysowania powierzchni. contourplot(expr, x=a..b, y=c..d, parametry) contourplot3d(expr, x=a..b, y=c..d, parametry) Dla funkcji z poprzedniego przykładu: > contourplot(z,x=-2..2,y=-2..2,contours=[0.4,0.5,0.7,0.9],filled= true); 3 Patrz również: rozdział 5.2. 3.5. Elementy grafiki trójwymiarowej 43 2 y –2 1 –1 2 1 x –1 –2 densityplot(expr, x=a..b, y=c..d, parametry) 3.5.2 Wykresy parametryczne, krzywa przestrzenna spacecurve(L, parametry) Tutaj L oznacza listę, składającą się conajmniej z trzech elementów, interpretowanych jako parametryczna reprezentacja współrzędnych x, y, z. Podanie listy kilku list umożliwia rysowanie kilku wykresów. Interwał zmienności parametru może być określony zarówno wewnątrz tej listy (jako czwarty jej element), jak i poza nią. Przykład 3.11. Narysować trójwymiarową spiralę, zadaną za pomocą następującej parametryzacji: x(t) = sin(t), y(t) = cos(t), z(t) = t. > spacecurve([cos(t),sin(t),t],t=0..4*Pi,style=line,axes=box, thickness=3); 12 8 4 0 –1 –1 –0.5 –0.5 0 0 0.5 0.5 1 1 Parametryzacja listy za pomocą dwóch parametrów prowadzi do dwuwymiarowej powierzchni w przestrzeni trójwymiarowej. Używa się tu znanej już funkcji plot3d: 44 Rozdział 3. Funkcje Maple plot3d([exprx, expry, exprz], s=a..b, t=c..d, parametry) Wyrażenia exprx, expry i exprx zadają parametryzację współrzędnych x, y, z powierzchni za pomocą dwóch parametrów s, t. Przykład 3.12. ”Rozciągnąć” spiralę z powyższego przykładu w powierzchnię dwuwymiarową, zmieniając promień spirali r w granicach od 0 do 1. Parametryzacja tej powierzchni ma postać: x(t, r) = r sin(t), y(t, r) = r cos(t), z(t, r) = t. > plot3d([r*cos(t),r*sin(t),t],r=0..1,t=0..4*Pi,style= patchnogrid); / tubeplot(C, radius= expr, parametry) C oznacza krzywą przestrzenną (lub listę takich krzywych). Opcja radius ustala promień walca wokół krzywej przestrzennej. 3.5.3 Wykresy w układach współrzędnych: sferycznym i cylindrycznym plot3d(r(θ, φ), φ=a..b, θ=c..d, coords=spherical, opcje) W celu uniknięcia nieporozumień podkreślimy, że niezależnie od stosowanych oznaczeń, pierwsza zmienna (tutaj: φ), o przedziale zmienności (a, b), reprezentuje kąt azymutalny; podobnie, druga zmienna reprezentuje kąt polarny. Przykład 3.13. Narysować powierzchnię jednostkowej sfery (r(θ, φ) = 1). > plot3d(1,phi=0..2*Pi,theta=0..Pi,style=patchnogrid, coords= 3.5. Elementy grafiki trójwymiarowej 45 spherical,scaling=constrained); / plot3d(r(φ, z), φ=a..b, z=c..d, coords=cylindrical, opcje) W celu uniknięcia nieporozumień podkreślimy, że niezależnie od stosowanych oznaczeń, pierwsza zmienna (tutaj: φ), o przedziale zmienności (a, b), reprezentuje kąt azymutalny; podobnie, druga zmienna reprezentuje współrzędną z. Przykład 3.14. Narysować powierzchnię walca (r(φ, z) = 1). > plot3d(1,theta=0..2*Pi,z=-2..2,style=patchnogrid, coords= cylindrical,scaling=constrained,axes=box); 2 1 0 –1 –2 –1 –0.5 0 0.5 1 1 0 0.5 –1 –0.5 / 3.5.4 Wykresy powierzchni zadanych w postaci niejawnej implicitplot3d(równanie, x=a..b, y=c..d, z=p..q, opcje) Obiekt równanie oznacza równanie w zmiennych x, y, z. Przykład 3.15. Narysować elipsoidę x2 + y2 4 + z2 8 = 1. 46 Rozdział 3. Funkcje Maple > implicitplot3d(x^2+y^2/4+z^2/8=1, x=-3..3,y=-3..3,z=-3..3,grid= [15,15,15], style=patchcontour,contours=10,axes=box); 3 2 1 z 0 –1 –2 –3 –3 –2 –1 0 y 1 2 3 3 2 1 0 –1 x –2 –3 / 3.5.5 Dane dyskretne pointplot3d(L, opcje) L oznacza listę (albo zbiór) trójelementowych list, zawierających współrzędne punktów. Przykład 3.16. Współrzędne punktu materialnego zależą √ od czasu w następujący sposób: x(t) = cos(πt/20), y(t) = sin(πt/20), z(t) = t. Przedstawić graficznie położenia tego punktu w chwilach czasu t = 1, 2, . . . , 80. > dane:=evalf(seq([cos(k*Pi/20),sin(k*Pi/20),sqrt(k)],k=1..80)): > pointplot3d([dane],axes=boxed,symbol=box,symbolsize=15, orientation=[32,72]); 8 6 4 2 –1 3.5.6 –0.5 0 0.5 1 0.5 0 –0.5 –1 Pole wektorowe fieldplot3d(lista, x=a..b, y=c..d, z=p..q, opcje) 3.5. Elementy grafiki trójwymiarowej 47 Obiekt lista jest listą trzech wyrażeń zależnych od x, y, z, interpretowanych jako składowe pola wektorowego w punkcie (x, y, z). Zmienne x, y, z przyjmują wartości z podanych przedziałów. Użyteczne parametry to arrow, który opisuje postać graficzną wektora, oraz grid, ustalający rozmiar siatki, na której będą rysowane wektory. ~ r), wytworzonego przez dodatni Przykład 3.17. Natężenie pola elektrycznego E(~ jednostkowy ładunek punktowy umieszczony w początku układu współrzędnych, ~ r) = dane jest, w punkcie opisanym wektorem wodzącym ~r ≡ [x, y, z], wzorem4 E(~ p ~ r r| = x2 + y 2 + z 2 . Przedstawić graficznie r3 . Wprowadzono tu oznaczenie r = |~ to pole. > r:=sqrt(x^2+y^2+z^2): r3:=r^3; r3 := (x2 + y 2 + z 2 )(3/2) > fieldplot3d([x/r3,y/r3,z/r3],x=-4..4,y=-4..4,z=-4..4,grid= [6,6,6],arrows=THICK,axes=box,orientation=[31,39]); 4 2 z 0 –2 –4 –4 –4 –2 0 –2 y 0 2 x 2 4 4 Obracanie wykresu w przestrzeni za pomocą myszy znacznie ułatwia analizę pól wektorowych. / gradplot3d(expr, x=a..b, y=c..d, z=p..q parametry) Tutaj wyrażenie expr oznacza pole skalarne, zależne od zmiennych x, y, z, przyjmujących wartości z podanych przedziałów. Przykład 3.18. Potencjał pola elektrostatycznego z poprzedniego przykładu wynosi φ(x, y, z) = √ 2 1 2 2 . Należy przedstawić graficznie to pole. Z elekx +y +z ~ trostatyki wiadomo, że E(x, y, z) = −∇φ(x, y, z). Po wykonaniu następujących 4 Pomijamy tu współczynnik (4π0 )−1 48 Rozdział 3. Funkcje Maple poleceń otrzymuje się wykres z poprzedniego przykładu: > r:=sqrt(x^2+y^2+z^2); r := (x2 + y 2 + z 2 )(1/2) > gradplot3d(-1/r,x=-4..4,y=-4..4,z=-4..4,grid=[6,6,6],arrows= THICK,axes=box,orientation=[31,39]); 4 2 z 0 –2 –4 –4 –4 –2 0 –2 y 0 2 x 2 4 4 / 3.5.7 Animacja animate(plot3d, [f(x,y,t), x=a..b, y=c..d ], t=p..q, argumenty) Pierwszy parametr (tutaj: plot3d) jest nazwą funkcji Maple służącej do tworzenia wykresu. Obiekty a, b, c, d mogą zależeć od t. Aby uruchomić animację należy zaznaczyć wykres, a następnie użyć menu kontekstowego, wywoływanego za pomocą prawego klawisza myszy, albo użyć symboli klawiszy przypominających klawisze magnetofonowe, które pojawiają się (po zaznaczeniu wykresu) nad arkuszem roboczym. Spośród parametrów warto wymienić frames, zmieniający liczbę klatek animacji wynoszącą standardowo 25. Przykład 3.19. Pokazać animację wykresu funkcji z(x, y) = cos(tx) sin(ty) dwóch zmiennych −π ¬ x, y ¬ π, dla wartości parametru t z przedziału 1 ¬ t ¬ 2. Przyjąć liczbę klatek równą 10. > animate(plot3d,[cos(t*x)*sin(t*y),x=-Pi..Pi,y=-Pi..Pi],t=1..2, frames=10); 3.6. Rozwiązywanie równań i nierówności algebraicznych 49 t = 1. 3.6 Rozwiązywanie równań i nierówności algebraicznych solve(eqn, nazwa zmiennej) Tutaj eqn oznacza równanie, nierówność albo nazwę procedury, natomiast parametr nazwa zmiennej oznacza zmienną względem której należy to równanie (nierówność) rozwiązać. Przykład 3.20. Rozwiązać równanie kwadratowe x2 + x − 4 = 0 i sprawdzić rozwiązanie. > eq := x^2 + x - 4 = 0; x2 + x − 4 = 0 Wygodnie jest wprowadzić zmienną reprezentującą rozwiązania: > rozw := solve(eq,x); √ √ 1 17 1 17 ,− − rozw := − + 2 2 2 2 Otrzymany wynik jest ciągiem wyrażeń; do kolejnych rozwiązań odwołujemy się za pomocą indeksowania: > rozw1 := rozw[1]; rozw2 := rozw[2]; √ 1 17 rozw1 := − + 2 √2 1 17 rozw2 := − − 2 2 50 Rozdział 3. Funkcje Maple / Przykład 3.21. Rozwiązać nierówność x2 + x − 4 ¬ 0 > solve(x^2 + x - 4 <= 0,x); √ √ ! 17 1 17 1 RealRange − + ,− − 2 2 2 2 RealRange oznacza przedział domknięty. / Przykład 3.22. Rozwiązać równanie cos(x) − sin(x) = 0. > eq:=cos(x)-sin(x); solve(eq); π 4 Maple znalazł tylko jedno rozwiązanie, tymczasem jest ich nieskończenie wiele: > EnvAllSolutions := true: > solve(eq); π + π Z2˜ 4 Maple wprowadził zmienną Z2˜ przyjmującą wartości naturalne, o czym łatwo jest przekonać się wykonując polecenie about( Z2). / W tych przypadkach kiedy funkcja solve nie znajduje rozwiązań, można poszukiwać ich za pomocą funkcji fsolve, stosującej numeryczne metody rozwiązywania równań. Znajduje ona z reguły tylko jeden pierwistek równania. fsolve(eqn, nazwa zmiennej, argumenty) Oznaczenia są tutaj takie same, jak dla funkcji solve. Spośród argumentów wymienimy przedział a ¬ x ¬ b, w którym ma być szukane rozwiązanie; zadaje się go w postaci a..b albo x = a..b. 2 Przykład 3.23. Znależć rozwiązanie równania e−x = sin(x) w przedziale 10 ¬ x ¬ 15. > eq:=exp(-x^2)-sin(x): > x:=fsolve(eq,x=10..15); x := 12.56637061 / 3.6. Rozwiązywanie równań i nierówności algebraicznych 51 Dla równań piątego i wyższych stopni Maple reprezentuje te rozwiązania, które nie są liczbami wymiernymi, za pomocą funkcji RootOf. W celu wyznaczenia wszystkich wartości wyrażenia zawierającego RootOf stosuje się funkcję allvalues: allvalues(expr) Tutaj expr jest dowolnym wyrażeniem algebraicznym, zbiorem lub listą takich wyrażen. Przykład 3.24. Rozwiązać równanie: x5 − 3x3 − 2 = 0. > rozw:=solve(x^5 - 3*x^3-2,x); rozw := −1, RootOf ( Z 4 − Z 3 − 2 Z 2 + 2 Z − 2, index = 1), RootOf ( Z 4 − Z 3 − 2 Z 2 + 2 Z − 2, index = 2), RootOf ( Z 4 − Z 3 − 2 Z 2 + 2 Z − 2, index = 3), RootOf ( Z 4 − Z 3 − 2 Z 2 + 2 Z − 2, index = 4) W tym przykładzie znane są dokładne rozwiązania. Na przykład, drugi z pierwiastków wynosi > allvalues(rozw[2]); v √ √ √ u √ u 19 %2 %3 + 2 %3 %1 − 28 %3 + 63 %2 t √ √ 6 √ (143 + 3 2577)(1/3) %3 %3 1 − + 4 12 √ 12 %1 := (143 + 3 √2577)(2/3) %2 := (143 + 3 2577)(1/3) 57 %2 − 12 %1 + 168 √ %3 := (143 + 3 2577)(1/3) Przykład 3.25. Rozwiązać układ równań x2 + y 2 = 1, y = x + 21 . > eq:={y^2+x^2=1,y=x+1/2}; zm:={x,y}; 1 eq := {y 2 + x2 = 1, y = x + } 2 zm := {y, x} > solve(eq,zm); {y = 12 RootOf (2 Z 2 − 2 Z − 3, label = L2), x = 12 RootOf (2 Z 2 − 2 Z − 3, label = L2) − 21 } > rozw:=allvalues(%); / 52 Rozdział 3. Funkcje Maple √ √ √ √ 1 7 7 7 7 1 1 1 rozw := {y = + ,x = − + }, {y = − ,x = − − } 4 4 4 4 4 4 4 4 / Zwracamy uwagę na to, że znalezione rozwiązania nie przypisują zmiennym x, y żadnych wartości. W celu przypisania (nazwom) zmiennych powyższych rozwiązań stosuje się funkcję assign5 : assign(eqs) gdzie eqs oznacza zbiór lub listę równań otrzymanych w wyniku działania funkcji solve. Przypiszemy zmiennym x, y wartości z pierwszego rozwiązaniań: > assign(rozw[1]); x; y; 3.7 √ 7 1 − + 4 √4 7 1 + 4 4 / Elementy algebry liniowej Pakiety: > with(LinearAlgebra): > with(VectorCalculus): Pakiet Student[LinearAlgebra] oferuje wartościowe narzędzia ułatwiające studentom zrozumienie podstaw algebry liniowej. 3.7.1 Definiowanie wektorów i macierzy < a 1 , a2 , . . . , a n > 5 < a1 |a2 | . . . |an > Funkcja ta była wprowadzona w podobnym kontekście w rozdziale 2.5. 3.7. Elementy algebry liniowej 53 albo Vector[poz]([a1 , a2 , . . . , an ]) gdzie występujący opcjonalnie parametr poz przyjmuje wartości row albo column (ustawienie domyślne: column). Wynik zależy od tego, czy załadowany jest pakiet VectorCalculus. > restart: > with(LinearAlgebra): > v1:=<1, 2, 3>; v2:=<a | b | c>; 1 v1 := 2 3 v2 := [a, b, c] > v3:=Vector[column]([1,2,3]); v4:=Vector[row]([a,b,c]); 1 v3 := 2 3 v4 := [a, b, c] > with(VectorCalculus): > v1:=<1, 2, 3>; v2:=<a | b | c>; v1 := ex + 2ey + 3ez v2 := aex + bey + cez / Wygodna w użyciu jest nieco inna postać polecenia Vector: Vector[poz](n, symbol=a) gdzie n jest nazwą zmiennej reprezentującej liczbę składowych ai wektora. Wektory w pakiecie Maple 9 są automatycznie traktowane jako kartezjańskie. Układ współrzędnych można zmienić za pomocą funkcji SetCoordinates(v, c) 54 Rozdział 3. Funkcje Maple gdzie c jest nazwą (łańcuchem) określającą układ współrzędnych, która może być uzupełniona listą specyfikującą nazwy współrzędnych. Parametr v jest opcjonalny i określa nazwę wybranego wektora zdefiniowanego w danym układzie współrzędnych. Przykład 3.26. Zdefiniować wektor o składowych (1, 2, 3) w sferycznym układzie współrzędnych, w którym współrzędne sferyczne mają nazwy (r, φ, θ). > restart: > with(VectorCalculus): > SetCoordinates(<1, 2, 3>, ’spherical’[r, phi, theta]); er + 2eφ + 3eθ / Macierze tworzy się w podobny sposób jak wektory: << a|b|c >, < d|e|f >> albo: << a, b, c > | < d, e, f >> albo: Matrix([[a,b,c],[d,e,f]]) Macierz o wymiarach m × n (odpowiednio, liczba wierszy i kolumn) i elementach ai,j : Matrix(m, n, symbol=a) 1 4 7 Przykład 3.27. Utworzyć macierz 2 5 8 . 3 6 9 > restart: > M := <<1, 2, 3> | <4, 5, 6> | <7, 8, 9>>; 1 4 7 M := 2 5 8 3 6 9 3.7. Elementy algebry liniowej 55 > M1:=Matrix([[1,4,7],[2,5,8],[3,6,9]]); 1 4 7 M 1 := 2 5 8 3 6 9 / 3.7.2 Podstawowe operacje na wektorach Pakiet: > with(VectorCalculus): Iloczyn skalarny wektorów v1 i v2 (o jednakowej liczbie składowych) można obliczyć na dwa sposoby: DotProduct(v1, v2) albo v1 . v2 Do obliczenia iloczynu wektorowego dwóch trójwymiarowych wektorów służą polecenia: CrossProduct(v1, v2) albo v1 &x v2 Przykład 3.28. Wyprowadzić wzory na iloczyn skalarny v1 · v2 i wektorowy v1 × v2 dla kartezjańskich wektorów v1 = [a1 , a2 , a3 ] oraz v2 = [b1 , b2 , b3 ]. > v1:=<a[1], a[2], a[3]>; v1 := a1 ex + a2 ey + a3 ez > v2:=Vector(3, symbol=b); v2 := b1 ex + b2 ey + b3 ez > DotProduct(v1, v2); a1 b1 + a2 b2 + a3 b3 > CrossProduct(v1, v2); (a2 b3 − a3 b2 )ex + (a3 b1 − a1 b3 )ey + (a1 b2 − a2 b1 )ez / 56 Rozdział 3. Funkcje Maple 3.7.3 Podstawowe operacje na macierzach W tym rozdziale zakładamy, że załadowany jest pakiet LinearAlgebra: Przedstawione niżej funkcje stosuje się do wyznaczania: śladu macierzy Trace(M) wyznacznika Determinant(M) macierzy transponowanej Transpose(M) oraz macierzy odwrotnej MatrixInverse(M) albo Mˆ(-1) Przykład 3.29. Obliczyć wyznacznik, ślad oraz macierz odwrotną do macierzy M o wymiarze 2 × 2, której elementy są postaci ai,j : > M:=Matrix(2, 2, symbol=a); " M := a1,1 a1,2 a2,1 a2,2 # > Determinant(M); a1,1 a2,2 − a1,1 a2,2 > Trace(M); a1,1 + a2,2 > MI:=MatrixInverse(M); " M I := a2,2 a1,1 a2,2 −a1,1 a2,2 −a2,1 a1,1 a2,2 −a1,1 a2,2 a 1,2 − a1,1 a2,2 −a 1,1 a2,2 # a1,1 a1,1 a2,2 −a1,1 a2,2 Dodawanie macierzy: MatrixAdd(M1, M2, a, b) albo M1 + M2 Iloczyn dwóch macierzy oblicza się w następujący sposób / 3.7. Elementy algebry liniowej 57 MatrixMatrixMultiply(M1, M2) albo M1 . M2 Kolejne dwie funkcje pozwalają obliczyć iloczyn wektora i macierzy M. W pierwszym przypadku wektor jest kolumnowy (ColVect), w drugim - wierszowy (RowVect): MatrixVectorMultiply(M, ColVect) albo M . ColVect VectorMatrixMultiply(RowVect, M) albo RowVect . M " Przykład 3.30. Obliczyć iloczyn macierzy M = > M := <<1, 2>|<0, 1>>; " M := > v:=<1, 2>; 1 0 2 1 " v := > M . v; " v := 1 2 1 4 1 0 2 1 # " i wektora c = # 1 . 2 # # # / 3.7.4 Wartości i wektory własne Zakładamy, że załadowany jest pakiet LinearAlgebra. Do wyznaczania wartości własnych oraz wektorów własnych macierzy M służą polecenia: Eigenvalues(M) Eigenvectors(M, parametry) Pierwsze z nich zwraca wartości własne w postaci wektora kolumnowego, a drugie ciąg dwóch wyrażeń: wektor kolumnowy wartości własnych oraz macierz, której kolumny zbudowane są z wektorów własnych. Parametr output=list powoduje 58 Rozdział 3. Funkcje Maple wyznaczenie degeneracji wartości własnych. Jako wynik otrzymuje się listę, której elementy zawierają następujące informacje: wartość własną, jej degenerację, wektor własny. Przykład 3.31. Wyznaczmy wartości oraz wektory własne macierzy M : > M:=<<1, 2> | <2, 1>>; " M := > Eigenvalues(M); > Eigenvectors(M); " " 1 2 2 1 3 −1 # # # " # −1 −1 1 , 3 1 1 > Eigenvectors(M, output=list); "" (" #)# " (" #)## −1 1 −1, 1, , 3, 1, 1 1 Obie wartości własne nie są zdegenerowane. / 3.8 3.8.1 Granice, pochodne i całki Granice Granicę funkcji jednej zmiennej f(x) w punkcie a oblicza się za pomoca funkcji limit: limit(f, x=a |,dir |) Przykład 3.32. Obliczyć granicę funkcji sin(x)/x w punkcie x = 0. > limit(sin(x)/x,x=0); 1 3.8. Granice, pochodne i całki 59 / Granicę funkcji dwóch zmiennych oblicza się analogicznie, jak w przypadku funkcji jednej zmiennej: limit(f, {x=a,y=b} |,dir |) 3.8.2 Pochodne Pochodną (pierwszego rzędu) oraz pochodne rzędu n wyrażenia exp w zmiennej x wyznacza się za pomocą funkcji diff: diff(exp, x) diff(exp, x$n) Funkcja ta ma postac bezwładną Diff. Przykład 3.33. Obliczyć pochodną wyrażenia xx . > diff(x^x,x); xx (ln(x) + 1) / Pochodne cząstkowe wyrażenia exp w zmiennych x1 , . . . xn wyznacza się podobnie, jak dla wyrażenia w jednej zmiennej: diff(exp, x1, . . . xn) Przykład 3.34. Obliczyć pochodną cząstkową ∂ 3 x2 yz ∂ 2 x∂y . > f:=x^2*y*z; f := x2 yz > Diff(f,x,x,y)=diff(f,x,x,y); ∂3 (x2 yz) = 2z ∂y∂x2 / Pochodną funkcji f, pochodną tej funkcji w punkcie x, oraz n-tą pochodną wyznacza się za pomocą operatora różniczkowania D: D(f) D(f)(x) (D@@n)(f) 60 Rozdział 3. Funkcje Maple Przykład 3.35. Obliczyć pochodne następujących funkcji: sinus, wykładniczej, oraz funkcji kwadratowej x− > x2 . > D(sin); D(exp); f:=x->x^2; D(f); cos exp f := x → x2 x → 2x Widzimy, że pochodną funkcji jest funkcja. Wyznaczymy wartość pochodnej funkcji f w punkcie x = 1: > D(f)(1); 2 / Pochodną funkcji f wielu zmiennych wyznacza się podobnie, jak w przypadku funkcji jednej zmiennej: D[...](f) W nawiasie kwadratowym podaje się numery zmiennych (w kolejności ich występowania w definicji funkcji), po których obliczane są pochodne. Przykład 3.36. Obliczyć pochodną cząstkową x2 yz. ∂ 3 f (x,y,z) ∂ 2 x∂y funkcji f : (x, y, z)− > > f:=(x,y,z)->x^2*y*z; f := (x, y, z) → x2 yz > D[1,1,2](f); (x, y, z) → 2z W wyniku otrzymujemy funkcję. / 3.8.3 Szereg Taylora Rozwinięcie w szereg Taylora wyrażenia (funkcji) f w zmiennej x wokół punktu x=a z dokładnością do rzędu n wyznacza się za pomocą funkcji taylor. 3.8. Granice, pochodne i całki 61 Współczynnik przy k-tym członie rozwinięcia można wyznaczy za pomocą funkcji coeftayl: taylor(f, x=a |,n|) coeftayl(f, x=a, n) Pominięcie parametru a spowoduje domyślne przyjęcie a = 0. Przykład 3.37. Rozwinąć funkcję sin(x) w szereg Taylora wokół punktu x = 0, z dokładnością do wyrazów czwartego rzędu. Znależć wspólczynnik rozwinięcia przy x7 . > t:=taylor(sin(x),x=0,4); 1 t := x − x3 + O(x4 ) 6 Wynik ma typ: > whattype(t); series Przed wykonywaniem dalszych operacji algebraicznych należy pozbyć się reszty O(x4 ) za pomocą funkcji convert: > convert(t,polynom); Współczynnik przy x7 wynosi: 1 x − x3 6 > coeftayl(sin(x),x=0,7); −1 5040 3.8.4 / Całki oznaczone Całkę oznaczoną Rb a f (x) dx oblicza się za pomocą funkcji int: int(f, x=a..b, opcje) gdzie f jest wyrażeniem algebraicznym w zmiennej x. Forma bezwładna funkcji int ma postać Int. √ R Przykład 3.38. Obliczyć 01 x sin x2 + 1 dx. 62 Rozdział 3. Funkcje Maple > int(x*sin(x^2 +1),x=0..1); 1 1 cos(1) − cos(2) 2 2 / Wartości niektórych całek oznaczonych Maple podaje za pomocą funkcji specjalnych. Przykład 3.39. Funkcja sinus całkowy Si(x) jest często stosowana w optyce: > Int(sin(x)/x,x=0..t)=int(sin(x)/x,x=0..t); Z t sin(x) dx = Si(t) x 0 Jej wartość dla t = 1 wynosi > evalf(Si(1)); 0.9460830704 / 3.8.5 Całkowanie numeryczne Przy obliczaniu wartości całki oznaczonej Maple oblicza najpierw funkceę pierwotną. W tych przypadkach, gdy funkcja pierwotna nie istnieje (lub Maple nie potrafi jej wyznaczyć), można numerycznie obliczyć przybliżoną wartość całki. Przykład 3.40. Obliczyć wartość całki R1 0 exp (−x3 ) sin(x) dx. > int(exp(-x^3)*sin(x),x=0..1); Z 1 > evalf(%); 0 exp (−x3 ) sin(x) dx .3261940545 / 3.8.6 Całki niewłaściwe Granice całkowania mogą wynosić plus lub minus nieskończoność. Przykład 3.41. Obliczyć wartość całki niewłaściwej R∞ 1 −∞ 1+x2 > Int(1/(1+x^2),x=-infinity..infinity)=int(1/(1+x^2), dx. 3.8. Granice, pochodne i całki x=-infinity..infinity); 63 Z ∞ −∞ 1 dx = π 1 + x2 / 3.8.7 Całki nieoznaczone Całkę nieoznaczoną R f (x) dx oblicza się za pomocą funkcji int: int(f, x) gdzie f jest wyrażeniem algebraicznym w zmiennej x. Forma bezwładna funkcji int ma postać Int. Przykład 3.42. Wyznaczyć całkę nieoznaczoną R 1 1+x2 dx. > int(1/(1+x^2),x): Int(1/(1+x^2),x)=%; Z 1 dx = arc tg(x) 1 + x2 3.8.8 / Całki wielokrotne Całki wielokrotne, zarówno nieoznaczone jak i oznaczone, zapisuje się stosując zagnieżdżanie całek pojedynczych. Dla całek podwójnych i potrójnych istnieje postać bezwładna, odpowiednio Doubleint i Tripleint: Doubleint(f, x|=a..b|, y|=c..d|) Tripleint(f, x|=a..b|, y|=c..d|, z|=e..f) Przykład 3.43. Obliczyć objętość pod wykresem funkcji z = sin(x y) dla 0 ¬ x ¬ 1, 0 ¬ y ¬ 2. > value(Doubleint(sin(x*y),x=0..1,y=0..2)); γ + ln(2) − Ci(2) > value(%); .8473820172 Tutaj γ oznacza stałą Eulera, zaś Ci - kosinus całkowy. / 64 Rozdział 3. Funkcje Maple 3.9 3.9.1 Wybrane zagadnienia analizy matematycznej Elementy analizy wektorowej Operatory dywergencji i rotacji działają na pola wektorowe, które definiuje się za pomocą funkcji VectorField z pakietu VectorCalculus: VectorField(vec |, coord|) gdzie vec oznacza wektor, zaś opcjonalny parametr coord opisuje układ współrzędnych. ~ y, z) = [1, xy, z] w kartezjańPrzykład 3.44. Zdefiniować pole wektorowe A(x, skim układzie współrzędnych i wyznaczyć określony przez to pole wektor w punkcie x = 0, y = 0, z = 1. > SetCoordinates(cartesian[x,y,z]): > VectorField(<1,x*y,z>); ēx + x y ēy + z ēz Do wyznaczania pola wektorowego VF w punkcie, opisanym za pomocą wektora v, stosuje się funkcję evalVF z pakietu VectorCalculus: evalVF(VF, v) W naszym przypadku > evalVF(%,<0,0,1>); ēx + ēz / W Maple wektor ma przypisany jeden atrybut: > <1,x*y,z>; ex + x y ey + z ez > attributes(%); coords = cartesianx,y,z Pole wektorowe jest wektorem o dodatkowym atrybucie vectorfield: 3.9. Wybrane zagadnienia analizy matematycznej 65 > attributes(VectorField(<1,x*y,z>)); v ectorf ield, coords = cartesianx,y,z Dywergencję pola wektorowego VF oblicza się za pomocą funkcji Divergence: Divergence(VF) ~ Przykład 3.45. Dane jest pole elektryczne E(x, y, z) = [sin xy, exp (−x), cos z]. Wyznaczyć jego dywergencję. > E:=VectorField(<sin(x*y),exp(-x),cos(z)>,cartesian[x,y,z]); E := sin(xy) ēx + e(−x) ēy + cos(z) ēz > Divergence(E); cos(xy)y − sin(z) / Przykład 3.46. Podać wzór na obliczanie dywergencji w biegunowym układzie współrzędnych r, φ. W tym celu obliczyć dywergencję pola wektorowego F~ (r, φ) = [F 1(r, φ), F 2(r, φ)]. > VF:=VectorField(<F1(r,phi),F2(r,phi)>,polar[r,phi]); V F := F1(r, φ) ēr + F2(r, φ) ēφ > Divergence(VF); F1(r, φ) + r ∂ ∂r F1(r, φ) + ∂ ∂φ F2(r, φ) r / Rotacja pola wektorowego VF w przestrzeni trójwymiarowej jest polem wektorowym (dokładniej, pseudowektorowym). Oblicza się ją za pomocą polecenia Curl: Curl(VF) Przykład 3.47. Obliczyć rotację pola wektorowego zadanego w kartezjańskim ~ y, z) = [xz, y 2 , z + sin(xy)]. układzie współrzędnych: A(x, > A:=VectorField( <x*z,y^2,z+sin(x*y)>,’cartesian’[x,y,z]); 66 Rozdział 3. Funkcje Maple F := xz ex + y 2 ey + (z + sin(xy)) ez > Curl(A); cos(xy) x ex + (x − cos(xy) y) ey / Gradient oblicza się za pomocą funkcji Gradient: Gradient(f |, coord |) Przykład 3.48. Obliczyć gradient funkcji f (x, y, z) = x2 y sin(zx). > SetCoordinates(’cartesian’[x,y,z]); cartesian x,y,z > Gradient(x^2*y*sin(zx)); (2xy sin(xz) + x2 y cos(xz)z)ex + (x2 sin(xz))ey + x3 y cos(xz)ez / 3.9.2 Równania różniczkowe zwyczajne: metody analityczne Równanie różniczkowe zwyczajne rozwiązuje się za pomocą funkcji dsolve: dsolve({RRZ,warpoc},funkcja,par) gdzie RRZ oznacza równanie różniczkowe zwyczajne, warpoc - warunki początkowe, funkcja - zmienna zależna (funkcja jednej zmiennej), zaś par - opcjonalnie występujące parametry. Dla układu równań różniczkowych zwyczajnych składnia polecenia dsolve jest następująca: dsolve({uklad RRZ,warpoc},{funkcje},par) gdzie uklad RRZ oznacza układ równań, a parametr funkcje oznacza zbiór zmiennych zależnych. Przykład 3.49. Rozwiązać równanie Newtona dla punktu materialnego o masie m = 1, na który działa zależna od czasu siła F (t) = e−t . W chwili t = 0 położenie i prędkość punktu wynoszą x(0) = 0, v(0) = 0. Rozwiązanie: Należy 3.9. Wybrane zagadnienia analizy matematycznej 67 2 = e−t przy danych warunkach początkorozwiązać równanie różniczkowe d dtx(t) 2 wych. Ponieważ prędkość jest pochodną położenia po czasie, drugi z warunków początkowych zapiszemy używając operatora D. Równanie różniczkowe przypiszemy zmiennej difeq: > difeq:=diff(x(t),t$2)=exp(-t); d2 dif eq := 2 x(t) = e(−t) dt warunki początkowe – zmiennej warpoc: > warpoc:=x(0)=0,D(x)(0)=0; warpoc := x(0) = 0, D(x)(0) = 0 Stosujemy funkcję dsolve: > dsolve({difeq,warpoc},x(t)); x(t) = e(−t) + t − 1 Aby przypisać to rozwiązanie wielkości x(t) należy użyć polecenia assign: > assign(%); x(t); e(−t) + t − 1 / Przykład 3.50. Rozwiązać układ równań różniczkowych: dy(t) dt = x(t) z warunkami początkowymi x(0) = 0, y(0) = 1. dx(t) dt = x(t) + y(t), > difeqsys:=diff(x(t),t)=x(t)+y(t), diff(y(t),t)=x(t); d d dif eqsys := x(t) = x(t) + y(t), y(t) = x(t) dt dt > warpoc:=x(0)=0,y(0)=1; warpoc := x(0) = 0, y0) = 1 > dsolve({difeqsys,warpoc},{x(t),y(t)}); x(t) = ( 12 − 3.9.3 √ √ √ √ ( 5+1)t 5 5 ( ) 1 2 + ( 12 +√ 105 )e((− 2 +1/2)t) , {y(t) = ( 2 −√10 )e √ √ √ (− ( 5−1)t ) 1 (− (√5−1)t ) 1 ( 5+1)t 5 5 ) 1 1 ( 2 2 2 + (− 2 5e + 2e )( 2 10 )( 2 + 2 e √ + 5 10 )} / Równania różniczkowe zwyczajne: metody numeryczne Rozwiązanie numeryczne równania różniczkowego zwyczajnego z zadanymi warunkami początkowymi otrzymuje się za pomocą wprowadzonej w poprzednim 68 Rozdział 3. Funkcje Maple rozdziale funkcji dsolve z parametrem numeric (lub type=numeric). Domyślnie stosowany jest algorytm RKF (Runge–Kutta–Fehlberg). Algorytm można zmienić za pomocą parametru method. Ważnym parametrem jest output. Jego domyślna wartość to procedurelist, a wynikiem działania funkcji dsolve jest wówczas procedura, która dla zadanej wartości zmiennej niezależnej oblicza numerycznie wartość zmiennej zależnej oraz jej pochodnych. Przykład 3.51. Rozpatrzymy równanie oscylatora harmonicznego z siłą wy2 + x(t) = sin 2t, z następującymi warunkami początkowymi: muszającą: d dtx(t) 2 x(0) = 0, v(0) = 0. (a) Rozwiązać je numerycznie w przedziale 0 ¬ t ¬ 2 π. Wyznaczyć położenie i prędkość w chwili t = 1. (b) Znaleźć chwilę czasu, dla której x = 0.5. (c) Narysować wykres x(t). > difeq:=diff(x(t),t$2)+x(t)=sin(2*t); ! d2 dif eq := x(t) + x(t) = sin(2 t) dt2 > warpoc:= x(0)=0, D(x)(0) = 0; warpoc := x(0) = 0, D(x)(0) = 0 (a) Tworzymy procedurę o nazwie OH: > OH:=dsolve({difeq,warpoc},numeric,range=0..2*Pi); OH := proc(x rkf 45) . . . endproc Położenie i prędkość dla t = 1 wynoszą: > OH(1); d x(t) = .637632807968586234] dt (b) Napiszemy6 funkcję X argumentu t, która zwraca wartość x(t). Użyjemy funkcji op, która wybiera odpowiedni operand z takiej listy, jak powyższa: [t = 1., x(t) = .257881505213978068, > X:=t-> rhs(op(2,OH(t))); X := t → rhs(op(2, OH(t))) Do rozwiązania równania X(t) = 0.5 użyjemy funkcji fsolve, zapobiegając przedwczesnemu obliczaniu pisząc 0 X(t)0 : > fsolve(’X(t)’=0.5,t,0..2); 1.339290798 6 Można również użyć parametru output=listprocedure, w wyniku czego Maple tworzy te procedury. 3.9. Wybrane zagadnienia analizy matematycznej 69 (c) Do rysowania wykresów rozwiązań wyznaczonych numerycznie za pomocą dsolve służy funkcja odeplot, która będzie omówiona w następnym rozdziale. Tutaj zastosujemy polecenie plot do funkcji X(t), nie podając nazwy zmiennej niezależnej: > plot(X,0..2*Pi); 0.8 0.6 0.4 0.2 0 –0.2 1 2 3 4 5 6 –0.4 –0.6 –0.8 / 3.9.4 Równania różniczkowe zwyczajne: metody graficzne Wykresy rozwiązań równań różniczkowych zwyczajnych, otrzymanych za pomocą funkcji dsolve z parametrem numeric, tworzy się używając funkcji odeplot z pakietu plots: odeplot(dsn|,zmienne||, parametry|) gdzie dsn jest wynikiem wywołania funkcji dsolve z parametrem numeric, a więc dsn := dsolve(..., numeric). Ważny występujący opcjonalnie parametr zmienne ustala za pomocą list, jakie wykresy mają być utworzone. Domyślnie rysowane jest rozwiązanie równania. Przykład 3.52. Ścisłe równanie opisujące wychylenie kątowe α wahadła mated2 matycznego z położenia równowagi ma postać: dt 2 α(t) + sin (α(t)) = 0. W chwili początkowej α(0) = 0, α0 (0) = 1.7, gdzie znak prim (’) oznacza pochodną po czasie. Narysować: (a) na jednym wykresie zależności α(t) i α0 (t); (b) wykres w przestrzeni fazowej α − α0 . Przyjąć 0 ¬ t ¬ 4π. Rozwiązanie: Użyjemy funkcji dsolve: > difeq:=diff(alpha(t),t$2)+sin(alpha(t))=0; 70 Rozdział 3. Funkcje Maple ! d2 α(t) + sin(α(t)) = 0 dif eq := dt2 > warpoc:=alpha(0)=0,D(alpha)(0)=1.7; warpoc := α(0) = 0, D(α)(0) = 1.7 > rozw:=dsolve({difeq,warpoc},alpha(t),numeric,range=0..4*Pi); rozw := proc(x rkf 45) . . . endproc (a) Tworzymy listę dwóch list, definiujących krzywe mające pojawić się na wykresie. W naszym przypadku na osi odciętych odkładamy czas t, a na osi rzędnych wartości α(t) oraz α0 (t): > with(plots): > odeplot(rozw,[[t,alpha(t)],[t,diff(alpha(t),t)]]); 2 1 0 2 4 6t 8 10 12 –1 –2 alpha alpha’ Ponieważ wychylenia α są duże, to obserwuje się wyraźne odstępstwa od ruchu harmonicznego prostego, dla którego rozwiązaniami są funkcje sinus i kosinus, a okres drgań wynosi 2π. (b) Tworzymy listę wskazującą na to, że na osiach odkładane będą wartości kąta i jego pochodnej po czasie (prędkości kątowej): > odeplot(rozw,[alpha(t),diff(alpha(t),t)],scaling=constrained); 1.5 alpha’ 1 0.5 –2 –1 0 –0.5 1 alpha 2 –1 –1.5 /