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
/