Introduzione alluso di
Maple V Release 6
|\^/|
._|\| |/|_.
\ MAPLE /
<---- ---->
|
Liceo cantonale di Mendrisio
Mendrisio, anno scolastico 20012002
ii
Versione 1.1
Testo composto dallautore con L
A
T
E
X2
2,
3]
> map([sin,cos], 1);
[sin(1), cos(1)]
> map([sin,cos], [1,2]);
[[sin(1), cos(1)], [sin(2), cos(2)]]
Il comando zip(f, lista_1, lista_2) permette di far operare la funzione f sugli ele-
menti omonimi delle liste lista_1, lista_2.
Esempio 6.6.3
> zip((x,y) -> x+y, [a,b,c], [1,2,3]);
[a + 1, b + 2, c + 3]
> zip((x,y) -> [x,y], [a,b,c], [1,2,3]);
[[a, 1], [b, 2], [c, 3]]
42 CAPITOLO 6. SUCCESSIONI, INSIEMI E LISTE
CAPITOLO 7
Polinomi ed espressioni razionali
7.1 Introduzione
Maple in grado di manipolare polinomi ed espressioni razionali in vari modi ed eca-
cemente dal punto di vista del tempo di calcolo e delluso della memoria.
I polinomi e le espressioni razionali sono tra gli oggetti preferiti di Maple: per essi sono
deniti addirittura i tipi di dati polynom e ratpoly.
Esempio 7.1.1
> A := sin(x)*x^2 + 3*x - 1:
> type(A, polynom);
false
> B := x^2 + 2*x - 7: C := (x + 1)/(2*x - 1):
> type(B, polynom);
true
> type(C, ratpoly);
true
7.2 Polinomi ad una variabile
Sia dato il polinomio
p(x) = a
n
x
n
+ a
n1
x
n1
+ + a
1
x + a
0
, con a
n
,= 0
43
44 CAPITOLO 7. POLINOMI ED ESPRESSIONI RAZIONALI
Si dice che p(x) in forma canonica espansa se ordinato secondo le potenze decrescenti
di x, mentre si dice che in forma raccolta quando tutti i coecienti con la stessa potenza
sono raccolti (ma non necessariamente ordinati).
Sia p una variabile di tipo polynom.
Mediante degree(p) (degree = grado) si ottiene il grado del polinomio p, mentre con
ldegree(p) (ldegree = low degree) si ottiene lesponente della pi piccola potenza di p con
coeciente diverso da zero.
Il comando lcoeff(p) (lcoe = leading coecient) restituisce il coeciente direttore di
p; tcoeff(p) (tcoe = trailing coecient) restituisce il coeciente del monomio di grado
minore fra quelli che compongono p.
La successione dei coecienti non nulli di p si ottiene mediante coeffs(p, x) e, aggiun-
gendo come terzo argomento una variabile potenze, si pu anche memorizzare in essa la
successione delle potenze di x relative ai coecienti.
Con coeff(p, x^i) si ottiene il coeciente di x^i in p; per ottenere il termine noto
utilizzare coeff(p, x, 0).
Osservazione 7.2.1
I coecienti della successione restituita da coeffs(p, x) solitamente non sono ordinati
secondo le potenze crescenti o decrescenti di x. Si consiglia di utilizzare coeffs(p, x,
potenze) e di visualizzare anche il valore di potenze.
Esempio 7.2.1
> p := 5*x^4 - x^3 + 2*x - 4;
p := 5x
4
x
3
+ 2x 4
> degree(p);
4
> ldegree(p);
0
> lcoeff(p);
5
> tcoeff(p);
4
> coeffs(p, x);
4, 2, 5, 1
> coeffs(p, x, potenze); potenze;
4, 2, 5, 1
7.2. POLINOMI AD UNA VARIABILE 45
1, x, x
4
, x
3
> coeff(p, x^2);
0
> coeff(p, x^3);
1
Oltre alle comuni operazioni aritmetiche con i polinomi, Maple mette a disposizione altre
funzioni:
expand(p), per ridurre un polinomio in forma raccolta;
sort(p), per ordinare il polinomio (riduzione in forma canonica espansa);
gcd(p1, p2), per calcolare il massimo comune divisore di p1 e p2;
lcm(p1, p2), per calcolare il minimo comune multiplo di p1 e p2;
factor(p), per fattorizzare polinomi con coecienti razionali come prodotto di
polinomi irriducibili (su Q);
quo(p1, p2, x, resto), per calcolare p1 diviso p2 con x come incognita e memo-
rizzare il resto nella variabile resto;
rem(p1, p2, x, quoziente), per calcolare il resto di p1 diviso p2 con x come
incognita e memorizzare il quoziente nella variabile quoziente.
Per ragioni di ecienza Maple non ordina, di sua iniziativa, i polinomi secondo le potenze
crescenti o decrescenti dellincognita.
Esempio 7.2.2
> p1 := 8*x^5 - 12*x^4 - 14*x^3 + 7*x^2 + 9*x + 2;
p1 := 8x
5
12x
4
14x
3
+ 7x
2
+ 9x + 2
> p2 := 2 - 3*x + x^2;
p2 := 2 3x + x
2
> p1 * p2;
(8x
5
12x
4
14x
3
+ 7x
2
+ 9x + 2)(2 3x + x
2
)
> expand(%);
38x
5
36x
6
+ 8x
7
+ 25x
4
40x
3
11x
2
+ 12x + 4
> sort(%);
8x
7
36x
6
+ 38x
5
+ 25x
4
40x
3
11x
2
+ 12x + 4
46 CAPITOLO 7. POLINOMI ED ESPRESSIONI RAZIONALI
> gcd(p1, p2);
2 3x + x
2
> lcm(p1, p2);
8x
5
12x
4
14x
3
+ 7x
2
+ 9x + 2
> factor(p1);
(x 1)(x 2)(2x + 1)
3
> p3 := x^2 + x + 1;
p3 := x
2
+ x + 1
> quo(p1, p3, x, resto);
8x
3
20x
2
2x + 29
> resto;
18x 27
> rem(p1, p3, x, quoziente);
18x 27
> quoziente;
8x
3
20x
2
2x + 29
Osservazione 7.2.2
Maple in grado di lavorare con i polinomi anche su domini diversi dai comuni Z o Q,
per esempio sullanello degli interi gaussiani, su campi niti, su ampliamenti algebrici di
campi e su campi di funzioni. Per maggiori informazioni consultare la guida.
Per valutare il polinomio p nel punto valore si usa il comando subs(x = valore, p).
Esempio 7.2.3
> P := 3*x^3 - x^2 + 4*x -1;
P := 3x
3
x
2
+ 4x 1
> subs(x = 2, P);
27
7.3 Polinomi in pi variabili
Maple in grado di lavorare anche con polinomi in pi variabili. I comandi visti per i
polinomi in una variabile sono a disposizione anche per i polinomi in pi variabili. Nellusare
il comando sort si pu specicare il tipo di ordine desiderato aggiungendo il parametro
plex (plex = pure lexicographic) per lordine lessicograco denito da
x
i
y
j
x
i
y
j
i < i
oppure (i = i
e j < j
)
7.3. POLINOMI IN PI VARIABILI 47
(si avr dunque:
1 y y
2
. . . x xy x
2
. . .)
oppure il parametro tdeg (tdeg = total degree) per lordine denito da
x
i
y
j
x
i
y
j
i + j < i
+ j
oppure (i + j = i
+ j
e i < i
)
(si avr dunque:
1 y x y
2
xy x
2
y
3
xy
2
x
2
y x
3
. . .).
Tralasciando il parametro in sort verr preso per difetto il parametro tdeg.
Esempio 7.3.1
> p := expand((x*y - 2*y^2) * (x^2 - y) * 4 * (y^2 - 3*x));
p := 4x
3
y
3
12x
4
y 4xy
4
+ 12y
2
x
2
8x
2
y
4
+ 24x
3
y
2
+ 8y
5
24xy
3
> sort(p, [x, y], plex);
12x
4
y + 4x
3
y
3
+ 24x
3
y
2
8x
2
y
4
+ 12x
2
y
2
4xy
4
24xy
3
+ 8y
5
> sort(p, [x, y], tdeg);
4x
3
y
3
8x
2
y
4
12x
4
y + 24x
3
y
2
4xy
4
+ 8y
5
+ 12x
2
y
2
24xy
3
> factor(p);
4y(x 2y)(3x y
2
)(x
2
y)
Il polinomio dellesempio precedente potrebbe essere visto come un polinomio nella va-
riabile x con polinomi nella variabile y come coecienti. Il comando collect permette
di raccogliere una variabile in un polinomio in pi variabili; con subs si pu valutare un
polinomio in pi variabili.
Esempio 7.3.2
> collect(p, x);
12x
4
y + (24y
2
+ 4y
3
)x
3
+ (8y
4
+ 12y
2
)x
2
+ (24y
3
4y
4
)x + 8y
5
> collect(p, y);
8y
5
+ (4x 8x
2
)y
4
+ (4x
3
24x)y
3
+ (12x
2
+ 24x
3
)y
2
12x
4
y
> A := 3*x^2*y - x + 3*y -4;
A := 3x
2
y x + 3y 4
> subs(x = 1, y = -1, A);
11
48 CAPITOLO 7. POLINOMI ED ESPRESSIONI RAZIONALI
7.4 Espressioni razionali
Unespressione razionale F nella variabile x unespressione che pu essere scritta come
quoziente di due polinomi. Mediante numer(F) e denom(F) si pu accedere al numeratore
e, rispettivamente, al denominatore di F.
Esempio 7.4.1
> F := (3*x^3 - 9*x^2 - 3*x + 9)/(5*x^3 + 5*x^2 - x - 1);
F :=
3x
3
9x
2
3x + 9
5x
3
+ 5x
2
x 1
> numer(F);
3x
3
9x
2
3x + 9
> denom(F);
5x
3
+ 5x
2
x 1
Maple non semplica le espressioni razionali in una forma con numeratore e denominatore
primi fra loro (forma normale): per far ci bisogna utilizzare il comando normal(F). Even-
tuali semplicazioni sono fatte automaticamente solo se Maple scopre subito dei fattori
comuni.
Esempio 7.4.2
> normal(F);
3
x
2
4x + 3
5x
2
1
Osservazione 7.4.1
La semplicazione di espressioni razionali in forma normale non automatica per i seguenti
motivi:
non sempre la forma normale semplice (per esempio:
x
10000
1
x 1
pi compatto
della sua normalizzazione che un polinomio con diecimila termini);
la normalizzazione computazionalmente dispendiosa;
un utente potrebbe volere altre rappresentazioni, per esempio sotto forma di frazione
continua.
Naturalmente Maple in grado di lavorare anche con espressioni razionali in pi variabili.
La valutazione di unespressione razionale pu avvenire mediante il comando subs.
7.4. ESPRESSIONI RAZIONALI 49
Esempio 7.4.3
> A := (2*x + y^2) / (x*y);
A :=
2x + y
2
xy
> subs(x = 1, y = 2, A);
3
Le espressioni razionali di Maple si possono convertire in forma di frazione continua o in
forma di frazione algebrica semplice mediante il comando convert (consultare la guida).
50 CAPITOLO 7. POLINOMI ED ESPRESSIONI RAZIONALI
CAPITOLO 8
Equazioni, disequazioni e sistemi di equazioni
Maple in grado di risolvere, in modo esatto o approssimato, vari tipi di equazioni,
disequazioni e sistemi di equazioni in diversi domini algebrici.
8.1 Equazioni
La struttura di unequazione in Maple identica a quella in matematica:
primo membro = secondo membro
(se il secondo membro dellequazione 0 si pu tralasciare). Attenzione a non usare
erroneamente il simbolo di assegnazione := al posto di = nella denizione di unequazione.
Esempio 8.1.1
> 2*x - 4 = x^2 + 3*x - 1;
2x 4 = x
2
+ 3x 1
In Maple possibile assegnare un nome ad unequazione e accedere facilmente ai suoi
membri tramite lhs(equazione) (= left hand side = membro a sinistra delluguale di
equazione) e rhs(equazione) (= right hand side = membro a destra delluguale di
equazione).
Esempio 8.1.2
51
52 CAPITOLO 8. EQUAZIONI, DISEQUAZIONI E SISTEMI DI EQUAZIONI
> eq := 2 + x = 5*a - x^2 + 1;
eq := 2 + x = 5a x
2
+ 1
> lhs(eq);
2 + x
> rhs(eq);
5a x
2
+ 1
Il comando solve permette di risolvere unequazione in modo esatto nel campo dei nu-
meri complessi. Nella sua forma pi semplice ha come argomenti lequazione e lincognita
(lincognita necessaria se nellequazione appaiono pi variabili). Il risultato pu essere
una soluzione, una successione di soluzioni oppure nulla (se Maple non stato in grado di
trovare una soluzione).
Esempio 8.1.3
> solve(3*x - 4 = 0, x);
4
3
> solve(x^2 - x = 1, x);
1
2
+
1
2
5,
1
2
1
2
5
> solve(x^2 = -1, x);
I, I
> solve(x = x + 1, x); # Non ci sono soluzioni => nessun output
> solve(exp(x) = 2, x);
ln(2)
Se Maple risolve unequazione rispetto alla variabile x e trova una soluzione, essa non viene
assegnata automaticamente alla x: per far ci bisogna provvedere mediante unistruzione
di assegnazione oppure mediante il comando assign.
Esempio 8.1.4
> eq := 3*x = 6;
eq := 3x = 6
> solve(eq, x);
2
> x; # x non vale 2!
x
8.1. EQUAZIONI 53
> x := solve(eq, x);
x := 2
> x;
2
> x := x:
> solve(5*x - 15 = 0, x);
3
> assign(x, %); x;
3
possibile che la risoluzione di equazioni polinomiali mediante solve fornisca un risultato
contenente lespressione RootOf(p), dove p polinomio nella variabile _Z (nome interno
dato dal sistema). Ci signica che alcune soluzioni dellequazione sono radici del poli-
nomio p. Mediante il comando allvalues(RootOf(p)) si possono avere tutte le radici
(approssimate) di p (chiaramente in allvalues si pu usare x al posto di _Z).
Prima di tentare di risolvere unequazione Maple tenta di semplicarla. Questo pu
portare a delle soluzioni non corrette, come nellesempio seguente (radice estranea):
Esempio 8.1.5
> solve((x - 1)^2 / (x^2 - 1) = 0, x);
1
Nel caso di equazioni non lineari, soprattutto quelle contenenti funzioni trigonometriche,
Maple si accontenta spesso di ritornare una sola soluzione, anche se ne esistono diverse.
Esempio 8.1.6
> solve(cos(Pi*x) = 0, x);
1
2
Il comando fsolve(equazione, x, opzioni) permette di risolvere equazione rispetto
allincognita x usando laritmetica in virgola mobile (metodi numerici). Come opzioni
possibile scegliere:
complex se si desidera una radice complessa (nota: se equazione di tipo polinomiale
tutte le radici complesse saranno determinate);
a..b se si desidera che la soluzione venga ricercata nellintervallo aperto ]a,b[;
avoid=s se si desiderano escludere certi valori quando si cercano le radici dellequa-
zione (s un insieme di equazioni del tipo variabile = valore_da_escludere);
54 CAPITOLO 8. EQUAZIONI, DISEQUAZIONI E SISTEMI DI EQUAZIONI
maxsols = n se si vogliono determinare al massimo n soluzioni;
fulldigits se si desidera che fsolve usi, a scapito del tempo di calcolo, sempre
Digits cifre durante il calcolo (per difetto fsolve usa una precisione inferiore a
Digits nei suoi calcoli interni quando Digits grande: ci per risparmiare tempo e
memoria).
Esempio 8.1.7
> fsolve(x - 2*x*cos(x) = 1, x);
7.248719454
> fsolve(x - 2*x*cos(x) = 1, x, 3..7);
5.126601871
> fsolve(x^6 - 5*x^5 + x - 3 = 0, x);
.9208722810, 4.999359795
> fsolve(x^6 - 5*x^5 + x - 3 = 0, x, complex);
.2651472528 .8733209135 I, .2651472528 + .8733209135 I,
.7259034957 .5053232551 I, .7259034957 + .5053232551 I,
4.999359795, .9208722810
> fsolve(x^6 - 5*x^5 + x - 3 = 0, x, complex, maxsols=3);
.9208722810, .2651472528 .8733209135 I, .2651472528 + .8733209135 I
> fsolve(sin(x), x, avoid={x=0,x=Pi,x=-Pi}, -10..10);
6.283185307
Il comando roots(p, a1, a2, ...) permette di determinare gli zeri del polinomio uni-
variato a coecienti razionali p sul campo algebrico che si ottiene aggiungendo a Q gli
elementi a1, a2, eccetera. Il risultato restituito sottoforma di lista di liste di due elementi:
il primo elemento lo zero, il secondo la molteplicit dello zero.
Mediante Roots(p) mod n si possono determinare gli zeri di p nel campo nito Z
n
.
Esempio 8.1.8
> roots(x^2 - 3*x + 1); # cerca gli zeri razionali
[ ]
8.1. EQUAZIONI 55
> # cerca gli zeri della forma a + b*sqrt(5), con a e b razionali
> roots(x\acccirc 2 - 3*x + 1, sqrt(5));
__
3
2
1
2
5, 1
_
,
_
3
2
+
1
2
5, 1
__
> Roots(x^2 - 3*x + 1) mod 5;
[ [ 4, 2 ] ]
Il comando realroot(p, lung) restituisce degli intervalli di ampiezza lung comprendenti
le radici reali di p (il secondo argomento lung facoltativo).
Esempio 8.1.9
> realroot(3*x^5+x^4-10*x^3+5*x^2+x-5);
[ [ 0, 2 ], [ 2, 0 ], [ 4, 2 ] ]
> realroot(3*x^5 + x^4 - 10*x^3 + 5*x^2 + x - 5, 0.000001);
__
1516127
1048576
,
47379
32768
_
,
_
738757
1048576
,
184689
262144
_
,
_
561187
262144
,
2244747
1048576
__
> evalf(%);
[[ 1.445891380, 1.445892334 ], [ .7045335770, .7045326233 ],
[ 2.140758514, 2.140757561 ]]
Mediante isolve possibile risolvere equazioni diofantee (ossia equazioni in Z), mentre
mediante msolve possibile risolvere equazioni nellanello Z
n
(consultare la guida per
maggiori informazioni).
Esempio 8.1.10
> isolve(2*x^2 + 3*y = 2);
y = 4 _Z1 6 _Z1
2
, x = 1 + 3 _Z1 , y = 2 8 _Z1 6 _Z1
2
, x = 2 + 3 _Z1
> msolve(2*x^2 + 3*x = 2, 6); # modulo 6
x = 2 , x = 4
Il simbolo _Z1 sopra sta a signicare che esistono innite soluzioni per lequazione data e
che una soluzione la si pu ottenere sostituendo a _Z1 un qualsiasi valore intero.
56 CAPITOLO 8. EQUAZIONI, DISEQUAZIONI E SISTEMI DI EQUAZIONI
8.2 Disequazioni
Il comando solve utilizzabile anche per risolvere disequazioni (questa possibilit non
sussiste purtroppo per il comando fsolve). Da notare che si usa >= per indicare maggiore
o uguale e <= per indicare minore o uguale.
Esempio 8.2.1
> solve(x^2 - 5*x + 4 < 0, x);
RealRange(Open(1), Open(4))
> solve(x^4 - 1 >= 0, x);
RealRange(, 1), RealRange(1, )
> solve((x + 1)/(2*x-4) >= 0, x);
RealRange(, 1), RealRange(Open(2), )
In generale non bisogna aspettarsi molto da Maple nella risoluzione di disequazioni: sem-
bra in grado di trattare discretamente disequazioni polinomiali e razionali fratte nch in
grado di risolvere esattamente le equazioni corrispondenti; risolve le disequazioni esponen-
ziali e logaritmiche elementari, non (ancora) in grado di risolvere disequazioni irrazionali
(se non alcuni casi particolari) e altri tipi di disequazioni non lineari.
8.3 Sistemi di equazioni
Per risolvere un sistema di equazioni bisogna dare come argomenti di solve linsieme delle
equazioni e linsieme delle incognite del sistema.
Esempio 8.3.1
Per risoluzione il sistema lineare
_
2x + y = 1
x y = 2
bisogna impartire il comando seguente:
> solve(2*x + y = 1, x - y = 2, x, y);
x = 1, y = 1
Si pu procedere anche nel modo seguente:
> equazioni := 2*x + y = 1, x - y = 2;
equazioni := 2x + y = 1, x y = 2
8.3. SISTEMI DI EQUAZIONI 57
> incognite := x, y;
incognite := x, y
> solve(equazioni, incognite);
x = 1, y = 1
oppure anche cos:
> eq1 := 2*x + y = 1; eq2 := x - y = 2;
eq1 := 2x + y = 1
eq2 := x y = 2
> solve(eq1, eq2, x, y);
x = 1, y = 1
Nellesempio sopra alle variabili x e y non vengono assegnati i valori delle soluzioni: se ci
desiderato bisogna usare il comando assign.
Esempio 8.3.2
> solve(3*x - 4*y = 10, 7*x + y = 12, x, y);
y =
34
31
, x =
58
31
> assign(%); x; y;
58
31
34
31
Naturalmente possibile risolvere anche alcuni sistemi di equazioni non lineari ed possi-
bilire usare anche il comando fsolve.
Esempio 8.3.3
> restart:
> eq1 := x^2 + y^2 = 9; eq2 := y = x + 1;
eq1 := x
2
+ y
2
= 9
eq2 := y = x + 1
> solve(eq1,eq2,x,y);
y = RootOf( _Z
2
_Z 4, label = _L1), x = RootOf( _Z
2
_Z 4, label = _L1) 1
58 CAPITOLO 8. EQUAZIONI, DISEQUAZIONI E SISTEMI DI EQUAZIONI
> allvalues(%);
_
y =
1
2
+
1
2
17, x =
1
2
+
1
2
17
_
,
_
x =
1
2
1
2
17, y =
1
2
1
2
17
_
> evalf(%);
y = 2.561552813, x = 1.561552813 ,
y = 1.561552813, x = 2.561552813
> fsolve(eq1,eq2,x,y);
y = 1.561552813, x = 2.561552813
Da notare che largomento label di RootOf serve per distinguere non specicate radici della
stessa equazione.
Si possono utilizzare anche i comandi isolve e msolve per la risoluzione, rispettivamente,
di sistemi di equazioni diofantee e di sistemi di congruenze modulo m.
CAPITOLO 9
Somme e prodotti
9.1 Somme
Il comando sum(f(i), i=a..b) permette di calcolare la somma (denita o indenita)
b
i=a
f(i). La forma inerte Sum visualizza il simbolo di sommatoria (tale comando si pu
usare in combinazione con il comando value(espressione) che valuta espressione).
Esempio 9.1.1
> sum(i, i=1..100);
5050
> sum(i, i=1..n);
1
2
(n + 1)
2
1
2
n
1
2
> factor(%);
1
2
n(n + 1)
> Sum(1/k!, k=0..+infinity);
+
k=0
1
k!
> value(%);
e
59
60 CAPITOLO 9. SOMME E PRODOTTI
Il comando add si usa in modo simile al comando sum, con la dierenza che esso utilizzabile
solo con somme denite (ossia: come risultato non pu restituire una formula).
Esempio 9.1.2
> add(i, i=1..100);
5050
> add(i, i=1..n);
Error, unable to execute add
Se la variabile usata per lindice i ha gi un valore potrebbero sorgere dei problemi nel
calcolo del valore della somma (ci avviene anche per altri comandi che fanno uso di variabili
indice). Il problema si risolve facilmente usando come indice una variabile non assegnata
oppure, pi elegantemente, quotando lindice i (ossia scrivendo i tra accenti acuti) ad ogni
occorrenza: questo modo di procedere fortemente consigliato!
Esempio 9.1.3
> i := 1: # la variabile i ha un valore
> sum(1/i, i=1..10);
Error, (in sum) summation variable previously assigned, second argument
evaluates to 1=1..10
> sum(1/i, i=1..10);
7381
2520
9.2 Prodotti
Il comando product(f(k), k=a..b) permette di calcolare il prodotto (denito o indeni-
to)
b
k=a
f(k) (esiste anche la forma inerte Product).
Esempio 9.2.1
> Product(k, k=1..10);
10
k=1
k
> value(%);
3628800
9.2. PRODOTTI 61
Il comando mul si usa in modo simile al comando product, con la dierenza che esso
utilizzabile solo con prodotti deniti (ossia: come risultato non pu restituire una formula).
Esempio 9.2.2
> mul(k, k=1..10);
3628800
> mul(k, k=1..n);
Error, unable to execute mul
62 CAPITOLO 9. SOMME E PRODOTTI
CAPITOLO 10
Algebra lineare
Anch sia possibile trattare gli oggetti dellalgebra lineare predeniti in Maple neces-
sario caricare la libreria linalg. Per far ci bisogna eseguire il comando with(linalg):
( consigliabile terminare il comando con un due punti poich in caso contrario verr
mostrata sullo schermo la lista di tutti i comandi della libreria linalg).
Per tutto il capitolo si assume che allinizio di ogni paragrafo siano stati impartiti i comandi
restart: e with(linalg):.
10.1 Denizione di matrici
Una matrice , per Maple, una lista di righe e ogni riga , a sua volta, una lista. Si pu
denire una matrice mediante il comando matrix, che pu avere diversi argomenti.
Esempio 10.1.1
La seguente matrice A denita come una lista di liste:
> A := matrix([ [1,2,3], [3,4,5], [6,5,8], [9,7,2]]);
A :=
_
_
1 2 3
3 4 5
6 5 8
9 7 2
_
_
Esempio 10.1.2
La seguente matrice B denita indicando come argomenti del comando matrix il numero
di righe, il numero di colonne e la lista degli elementi della matrice:
63
64 CAPITOLO 10. ALGEBRA LINEARE
> B := matrix(2, 3, [1, 2, 3, 4, 5, 6]);
B :=
_
1 2 3
4 5 6
_
Esempio 10.1.3
La seguente matrice C denita indicando come argomenti del comando matrix il numero
di righe, il numero di colonne e una funzione degli indici degli elementi della matrice (in
questo caso: la somma degli indici):
> C := matrix(3, 3, (i, j) -> i + j);
C :=
_
_
2 3 4
3 4 5
4 5 6
_
_
Esempio 10.1.4
> f := proc(i, j)
if i < j then i^j else j^i; end if;
end proc:
> F := matrix(4, 3, f);
F :=
_
_
1 1 1
1 4 8
1 8 27
1 16 81
_
_
Esempio 10.1.5
Ecco un modo per denire la matrice identit di ordine n:
> id := n -> matrix(n, n,
proc(i, j) -> if i=j then 1 else 0; end if; end proc):
> id(2);
_
1 0
0 1
_
> id(3);
_
_
1 0 0
0 1 0
0 0 1
_
_
10.2. OPERAZIONI CON LE MATRICI 65
Per visualizzare gli elementi della matrice A non suciente digitare A; al prompt di
Maple ma bisogna utilizzare il comando evalm (evaluate matrix) oppure print.
Esempio 10.1.6
> A;
A
> evalm(A);
_
_
1 2 3
3 4 5
6 5 8
9 7 2
_
_
Con il comando A[i,j]; possibile accedere allelemento A
ij
della matrice A.
Esempio 10.1.7
> A[2, 3];
5
> A[4, 1] := -3;
A
4,1
:= 3
> evalm(A);
_
_
1 2 3
3 4 5
6 5 8
3 7 2
_
_
10.2 Operazioni con le matrici
Deniamo dapprima due matrici A e B che ci serviranno nei prossimi esempi.
> A := matrix(3, 3, [1,2,3,4,5,6,7,8,9]);
A :=
_
_
1 2 3
4 5 6
7 8 9
_
_
66 CAPITOLO 10. ALGEBRA LINEARE
> B := matrix(3, 3, ilcm);
B :=
_
_
1 2 3
2 2 6
3 6 3
_
_
Per sommare due matrici si usa il simbolo +, per sottrarre due matrici si usa il simbolo
-, per moltiplicare uno scalare per una matrice si usa il simbolo *, per moltiplicare due
matrici si usa il simbolo &*.
Esempio 10.2.1
Sommiamo le matrici A e B:
> A + B;
A + B
> evalm(%);
_
_
2 4 6
6 7 12
10 14 12
_
_
Mediante il comando matadd possibile visualizzare subito il risultato della somma di due
matrici:
> matadd(A, B);
_
_
2 4 6
6 7 12
10 14 12
_
_
Esempio 10.2.2
Calcoliamo A B:
> A - B:
> evalm(%);
_
_
0 0 0
2 3 0
4 2 6
_
_
In alternativa si poteva usare il comando matadd(A, -B); che avrebbe visualizzato subito
il risultato sullo schermo.
10.2. OPERAZIONI CON LE MATRICI 67
Esempio 10.2.3
Calcoliamo 3A:
> 3*A:
> evalm(%);
_
_
3 6 9
12 15 18
21 24 27
_
_
In alternativa si poteva usare il comando scalarmul(A, 3); che avrebbe visualizzato
subito il risultato sullo schermo.
Esempio 10.2.4
Calcoliamo A B:
> A &* B:
> evalm(%);
_
_
14 24 24
32 54 60
50 84 96
_
_
In alternativa si poteva usare il comando multiply(A, B); che avrebbe visualizzato subito
il risultato sullo schermo.
Ricordiamo che il prodotto di matrici non commutativo.
Esempio 10.2.5
> evalm((A &* B) - (B &* A));
_
_
16 12 18
20 8 12
2 24 24
_
_
anche possibile calcolare le potenze di matrici quadrate.
Esempio 10.2.6
> A^3:
> evalm(%);
_
_
468 576 684
1062 1305 1548
1656 2034 2412
_
_
68 CAPITOLO 10. ALGEBRA LINEARE
La matrice trasposta di una matrice M la matrice M
t
che si ottiene scambiando ordi-
natamente le righe e le colonne di M. In Maple denito, per tale scopo, il comando
transpose.
Esempio 10.2.7
> transpose(A);
_
_
1 4 7
2 5 8
3 6 9
_
_
Per ogni matrice quadrata possiamo calcolare il determinante mediante il comando det e
la traccia mediante il comando trace (la traccia di una matrice quadrata la somma degli
elementi della diagonale principale).
Esempio 10.2.8
> det(A);
0
> trace(A);
15
> det(B);
12
> trace(B);
6
Una matrice quadrata M di ordine n detta regolare (o non singolare o invertibile) se il
suo determinante diverso da 0. In tal caso esiste una (e una sola) matrice quadrata di
ordine n, detta matrice inversa di M e indicata con M
1
, tale che
M M
1
= M
1
M = I
n
dove con I
n
indichiamo la matrice identit di ordine n.
Linversa della matrice quadrata M si calcola mediante il comando inverse(M); oppure
mediante il comando M^(-1); (nel secondo caso la matrice risultato non sar visualizzata).
10.2. OPERAZIONI CON LE MATRICI 69
Esempio 10.2.9
> A^(-1);
1
A
> evalm(%);
Error, (in linalg[inverse]) singular matrix
> inverse(B);
_
_
5
2
1
1
2
1
1
2
0
1
2
0
1
6
_
_
Il rango di una matrice si calcola mediante il comando rank. Dallalgebra lineare noto
che una matrice quadrata di ordine n invertibile se e solo il suo rango n.
Esempio 10.2.10
La matrice A non invertibile poich il suo rango diverso da 3:
> rank(A);
2
La matrice aggiunta della matrice quadrata M = (m
ij
) la matrice adg(M) = (m
ij
)
che si ottiene da M nel modo seguente: lelemento m
ij
uguale al prodotto fra (1)
i+j
e il determinante che si ottiene eliminando da M la iesima riga e la jesima colonna.
In Maple la matrice aggiunta si ottiene tramite il comando adjoint oppure tramite il
comando adj.
Esempio 10.2.11
> adjoint(A);
_
_
3 6 3
6 12 6
3 6 3
_
_
Dallalgebra lineare noto che, se M invertibile, vale:
M
1
=
1
det(M)
adg(M).
Esempio 10.2.12
Verichiamo quanto appena detto con la matrice B:
70 CAPITOLO 10. ALGEBRA LINEARE
> inverse(B);
_
_
5
2
1
1
2
1
1
2
0
1
2
0
1
6
_
_
> scalarmul(adjoint(B), 1/det(B));
_
_
5
2
1
1
2
1
1
2
0
1
2
0
1
6
_
_
Con il comando submatrix(M, a..b, c..d) si costruisce una matrice i cui elementi ven-
gono dalle righe con indice i tale a i b e dalle colonne con indice j tale che c j d
della matrice M.
Esempio 10.2.13
> submatrix(A, 2..3, 2..3);
_
5 6
8 9
_
> submatrix(A, 1..3, 2..3);
_
_
2 3
5 6
8 9
_
_
10.3 Matrici simboliche
Mediante il comando matrix(m, n); possibile denire una matrice simbolica con m righe
e n colonne.
Esempio 10.3.1
> M := matrix((3, 3);
M := array(1..3, 1..3, [ ])
> evalm(M);
10.4. MATRICI PARTICOLARI 71
_
_
M
1,1
M
1,2
M
1,3
M
2,1
M
2,2
M
2,3
M
3,1
M
3,2
M
3,3
_
_
Le matrici simboliche possono essere utili per dimostrare alcune propriet delle matrici.
Esercizio 10.3.1
Siano X, Y e Z tre matrici quadrate di ordine 3. Dimostrare, usando Maple, che:
1. det(X Y ) = det(X) det(Y );
2. tr(X + Y ) = tr(X) + tr(Y ) (con tr(X) si intende la traccia di X);
3. (X Y )
t
= Y
t
X
t
;
4. (X Y )
1
= Y
1
X
1
, con X e Y invertibili;
5. (X Y ) Z = X (Y Z);
6. (X + Y ) Z = X Z + Y Z.
10.4 Matrici particolari
Mediante il comando array(identity, 1..n, 1..n); si pu ottenere la matrice identit
di ordine n.
Esempio 10.4.1
> array(identity, 1..3, 1..3);
_
_
1 0 0
0 1 0
0 0 1
_
_
Con il comando diag, che ha per argomento una sequenza di elementi, si pu ottenere una
matrice diagonale.
Esempio 10.4.2
> diag(-5, 2, 3);
_
_
5 0 0
0 2 0
0 0 3
_
_
72 CAPITOLO 10. ALGEBRA LINEARE
Dato un vettore con n componenti si pu costruire la matrice quadrata di ordine n avente
come elementi della jesima colonna le potenze di ordine j 1 delle componenti del vettore:
una siatta matrice detta matrice di Vandermonde. Il comando vandermonde, che ha
come argomento una lista, permette di calcolare la matrice di Vandermonde relativa agli
elementi dati.
Esempio 10.4.3
> vandermonde([x, y, z]);
_
_
1 x x
2
1 y y
2
1 z z
2
_
_
La matrice di Hilbert di ordine n una matrice quadrata H = (h
ij
) di ordine n tale che
h
ij
=
1
i+j1
per 1 i, j n. Il comando hilbert, che ha come argomento la dimensione
della matrice, permette di calcolare la matrice di Hilbert dellordine desiderato.
Esempio 10.4.4
> hilbert(3);
_
_
1
1
2
1
3
1
2
1
3
1
4
1
3
1
4
1
5
_
_
Mediante il comando randmatrix si possono creare matrici di qualsiasi dimensione con
elementi casuali. Negli esempi che seguono illustriamo i vari argomenti che pu avere il
comando randmatrix.
Esempio 10.4.5
Se come unici argomenti di randmatrix diamo le dimensioni della matrice, verr restituita
una matrice della dimensione desiderata con elementi casuali interi compresi tra 99 e 99.
> randmatrix(5, 3);
_
_
85 55 37
35 97 50
79 56 49
63 57 59
45 8 93
_
_
Esempio 10.4.6
Il comando seguente restituisce una matrice di ordine 5 3 con elementi casuali interi
compresi tra 5 e 10:
10.4. MATRICI PARTICOLARI 73
> randmatrix(5, 3, entries = rand(5..10));
_
_
6 5 8
8 10 5
5 5 6
8 6 5
7 10 7
_
_
Esempio 10.4.7
Il comando seguente restituisce una matrice sparsa di ordine 5 3 (ossia una matrice con
gli elementi quasi tutti nulli) con elementi casuali interi compresi tra 1 e 9:
> randmatrix(5, 3, sparse, entries = rand(1..9));
_
_
5 0 2
0 0 0
0 0 7
1 7 6
9 0 0
_
_
Esempio 10.4.8
Il comando seguente restituisce una matrice simmetrica di ordine 3 (ossia una matrice
quadrata i cui elementi sono simmetrici rispetto alla diagonale principale) con elementi
casuali interi compresi tra 1 e 9:
> randmatrix(3, 3, symmetric, entries = rand(1..9));
_
_
2 9 1
9 2 7
1 7 3
_
_
Esempio 10.4.9
Il comando seguente restituisce una matrice antisimmetrica di ordine 3 (ossia una matrice
quadrata i cui elementi soddisfano lequazione m
ij
= m
ji
) con elementi casuali interi
compresi tra 1 e 9:
> randmatrix(3, 3, antisymmetric, entries = rand(1..9));
_
_
0 1 9
1 0 5
9 5 0
_
_
Esempio 10.4.10
Il comando seguente restituisce una matrice unimodulare di ordine 53 (ossia una matrice
i cui elementi soddisfano le condizioni m
ii
= 1 e m
ij
= 0 per i < j) con elementi casuali
interi compresi tra 1 e 9:
74 CAPITOLO 10. ALGEBRA LINEARE
> randmatrix(3, 3, unimodular, entries = rand(1..9));
_
_
1 5 9
0 1 2
0 0 1
0 0 0
0 0 0
_
_
10.5 Denizione di vettori
Per denire un vettore con Maple si usa il comando vector. Gli esempi seguenti mostrano
i possibili argomenti per tale comando.
Esempio 10.5.1
Il seguente vettore a denito indicando come argomenti del comando vector il numero
di elementi e la lista degli elementi del vettore:
> a := vector(3, [1, 2, 3]);
a := [1, 2, 3]
Esempio 10.5.2
Il seguente vettore
129
Langolo, in radianti, tra due vettori a e
b si calcola con il comando angle.
Esempio 10.6.6
> angle(a, b);
arccos(
73
12900
129
200)
> evalf(convert(%, degrees));
155.3615157degrees
Esercizio 10.6.1
Sia langolo fra i vettori a e
b. Vericare che:
= arccos
a,
b)
[[a[[ [[
b[[
78 CAPITOLO 10. ALGEBRA LINEARE
Il comando normalize(v) restituisce un vettore parallelo e concorde al vettore v e di
lunghezza 1.
Esempio 10.6.7
> normalize(a);
[
4
129
129,
7
129
129,
8
129
129 ]
Per vettori di uno spazio vettoriale tridimensionale denito pure il prodotto vettoriale,
calcolabile con Maple mediante il comando crossprod.
Esempio 10.6.8
> crossprod(a, b);
[8, 48, 46]
Esercizio 10.6.2
Denire una funzione per il calcolo del prodotto misto di tre vettori di uno spazio vettoriale
tridimensionale.
10.7 Manipolazioni con vettori e matrici
Deniamo dapprima quattro vettori simbolici che ci serviranno per gli esempi di questo
paragrafo:
> a := vector(3):
b := vector(3):
c := vector(3):
d := vector(3):
Il comando augment (o, equivalentemente, concat) unisce orizzontalmente due o pi ma-
trici o vettori (i vettori sono trattati come vettoricolonna). Le matrici e i vettori devono
avere lo stesso numero di righe.
Esempio 10.7.1
La matrice A costruita partendo dai vettoricolonna a e
b:
> A := augment(a, b);
10.7. MANIPOLAZIONI CON VETTORI E MATRICI 79
A :=
_
_
a
1
b
1
a
2
b
2
a
3
b
3
_
_
La matrice B costruita aggiungendo a destra della matrice A il vettorecolonna c:
> B := augment(A, c);
B :=
_
_
a
1
b
1
c
1
a
2
b
2
c
2
a
3
b
3
c
3
_
_
La matrice C costruita aggiungendo a destra della matrice A la matrice B:
> C := augment(A, B);
C :=
_
_
a
1
b
1
a
1
b
1
c
1
a
2
b
2
a
2
b
2
c
2
a
3
b
3
a
3
b
3
c
3
_
_
Il comando stackmatrix unisce verticalmente due o pi matrici o vettori (i vettori sono
trattati come vettoririga). Le matrici e i vettori devono avere lo stesso numero di colonne.
Esempio 10.7.2
La matrice X costruita partendo dai vettoririga a e
b:
> X := stackmatrix(a, b);
X :=
_
a
1
a
2
a
3
b
1
b
2
b
3
_
La matrice Y costruita aggiungendo sotto la matrice X il vettoreriga c:
> Y := stackmatrix(X, c);
Y :=
_
_
a
1
a
2
a
3
b
1
b
2
b
3
c
1
c
2
c
3
_
_
La matrice Z costruita aggiungendo sotto la matrice X la matrice Y :
> Z := stackmatrix(X, Y);
Z :=
_
_
a
1
a
2
a
3
b
1
b
2
b
3
a
1
a
2
a
3
b
1
b
2
b
3
c
1
c
2
c
3
_
_
80 CAPITOLO 10. ALGEBRA LINEARE
Il comando addrow(M, i, k, lambda); moltiplica la iesima riga di M per e somma il
risultato alla kesima riga di M. Il comando addcol lanalogo per le colonne.
Esempio 10.7.3
> M := concat(a, b, c, d);
M :=
_
_
a
1
b
1
c
1
d
1
a
2
b
2
c
2
d
2
a
3
b
3
c
3
d
3
_
_
> addrow(M, 1, 2, 3);
_
_
a
1
b
1
c
1
d
1
3a
1
+ a
2
3b
1
+ b
2
3c
1
+ c
2
3d
1
+ d
2
a
3
b
3
c
3
d
3
_
_
> addcol(M, 1, 2, 3);
_
_
a
1
3a
1
+ b
1
c
1
d
1
a
2
3a
2
+ b
2
c
2
d
2
a
3
3a
3
+ b
3
c
3
d
3
_
_
Il comando mulrow(M, i, lambda); moltiplica la iesima riga di M per . Il comando
mulcol lanalogo per le colonne.
Esempio 10.7.4
> mulrow(M, 1, 2);
_
_
2a
1
2b
1
2c
1
2d
1
a
2
b
2
c
2
d
2
a
3
b
3
c
3
d
3
_
_
> mulcol(M, 1, 2);
_
_
2a
1
b
1
c
1
d
1
2a
2
b
2
c
2
d
2
2a
3
b
3
c
3
d
3
_
_
Il comando swaprow(M, i, j); scambia di posto la iesima riga e la jesima riga di M.
Il comando swapcol lanalogo per le colonne.
Esempio 10.7.5
> swaprow(M, 1, 2);
10.8. RISOLUZIONE DI SISTEMI DI EQUAZIONI LINEARI 81
_
_
a
2
b
2
c
2
d
2
a
1
b
1
c
1
d
1
a
3
b
3
c
3
d
3
_
_
> swapcol(M, 1, 2);
_
_
b
1
a
1
c
1
d
1
b
2
a
2
c
2
d
2
b
3
a
3
c
3
d
3
_
_
10.8 Risoluzione di sistemi di equazioni lineari
Per risolvere il sistema matriciale A X =
0.
Esempio 10.8.4
Consideriamo la matrice seguente:
> A := > matrix(4,3,[1,1,1,-1,0,1,1,2,3,1,-1,-3]);
_
_
1 1 1
1 0 1
1 2 3
1 1 3
_
_
Allora:
> kernel(A);
[1, 2, 1]
che va cos interpretato: il vettore
_
1
2
1
_
una base del nucleo di A.
10.9 Autovalori e autovettori
Data una matrice quadrata A di ordine n si chiama matrice caratteristica di A la matrice
I
n
A, dove uno scalare e I
n
la matrice identit di ordine n.
Il determinante della matrice caratteristica di A si chiama polinomio caratteristico di A.
Le radici del polinomio caratteristico si chiamano autovalori (o valori propri ) di A, mentre
i vettori che soddisfano lequazione caratteristica
A v = v
si chiamano autovettori (o vettori propri ).
Lo spazio vettoriale generato dagli autovettori relativi allautovalore si chiama autospazio
(o spazio proprio) relativo a .
Nellesempio seguente vediamo i comandi che Maple mette a disposizione per trattare gli
oggetti deniti sopra.
84 CAPITOLO 10. ALGEBRA LINEARE
Esempio 10.9.1
Deniamo dapprima una matrice quadrata A di ordine 3:
> A := matrix(3,3,[1,-3,3,3,-5,3,6,-6,4]);
_
_
1 3 3
3 5 3
6 6 4
_
_
Ecco la matrice caratteristica di A:
> B := charmat(A, lambda);
B :=
_
_
1 3 3
3 + 5 3
6 6 4
_
_
Ecco il polinomio caratteristico di A:
> charpoly(A, lambda);
3
12 16
Verica:
> det(B);
3
12 16
Ecco gli autovalori di A:
> eigenvalues(A);
4, 2, 2
Verica:
> solve(det(B) = 0, lambda):
4, 2, 2
Ecco gli autovettori di A:
> eigenvectors(A);
[4, 1, [1, 1, 2]], [2, 2, [0, 1, 1], [1, 1, 0]]
Lultimo risultato va interpretato cos:
[4, 1, [1, 1, 2]] signica: 4 lautovalore di molteplicit 1,
__
1
1
2
__
una base del-
lautospazio relativo allautovalore 4;
[2, 2, [0, 1, 1], [1, 1, 0]] signica: -2 lautovalore di molteplicit 2,
__
0
1
1
_
,
_
1
1
0
__
una base dellautospazio relativo allautovalore 2.
10.10. LA LIBRERIA LINEARALGEBRA 85
10.10 La libreria LinearAlgebra
A partire dalla versione 6 di Maple V stata potenziata la numerica dellalgebra lineare,
grazie allalleanza commerciale di Maple con il NAG (Numerical Algorithms Group). Ci
ha portato a migliori e pi ecienti algoritmi numerici, soprattutto per il trattamento di
matrici molto grandi: queste nuove capacit sono comprese nella libreria LinearAlgebra.
Siccome non siamo interessati alluso di queste nuove capacit rimandiamo gli interessati
alla guida in linea di Maple.
86 CAPITOLO 10. ALGEBRA LINEARE
CAPITOLO 11
Limiti di funzioni
In questo capitolo avremo bisogno della rappresentazione graca di funzioni reali e per
questo motivo diamo qualche accenno sul comando plot.
Data una funzione reale f(x) si pu tracciarne il graco mediante il comando
> plot(f(x), x=a..b, y=c..d, opzioni);
dove con x=a..b si intende lintervallo delle ascisse [a, b], con y=c..d si intende lintervallo
delle ordinate [c, d] (questo intervallo facoltativo: se non viene dato, Maple sceglie
automaticamente un intervallo per le ordinate) e opzioni sono possibili opzioni che si
possono dare (titolo del graco, colore e tipo di linea, . . . ; consultare la guida).
possibile disegnare su uno stesso graco pi funzioni: basta dare come primo argomento
del comando plot linsieme delle funzioni da rappresentare.
Nota: tutte le gure saranno poste, per motivi di impaginazione, al termine del capitolo.
11.1 Motivazione
Consideriamo la funzione razionale F(x) =
2x
3
5x
2
+ x + 2
x 2
. evidente che non possia-
mo valutarla per x = 2:
> F := (2*x^3 - 5*x^2 + x + 2)/(x - 2);
F :=
2x
3
5x
2
+ x + 2
x 2
87
88 CAPITOLO 11. LIMITI DI FUNZIONI
> subs(x=2, F);
Error, division by zero
I limiti sono usati per scoprire quale valore dovrebbe assumere unespressione se fosse
denita. Nel nostro caso il valore perso si rappresenta con
> Limit(F, x=2);
lim
x2
2x
3
5x
2
+ x + 2
x 2
che viene valutato in
> value();
5
In molti casi il valore perso pu essere indovinato grazie ad una rappresentazione graca
della funzione. Disegnando il graco della nostra funzione nellintervallo [1, 3] possiamo
notare che la retta verticale passante per x = 2 non interseca il graco di F(x), ossia in
corrispondenza di x = 2 il graco di F(x) presenta un buco (vedi gura 1):
> plot(F, x = 1..3);
Il graco di F(x) identico, tranne che nel punto x = 2, al graco della funzione
> normal(F);
2x
2
x 1
(il numeratore e il denominatore di F(x) avevano in comune il fattore x 2).
Non sempre il risultato di un calcolo di limiti un valore nito; la rappresentazione graca
utile per confermare anche questo fatto. Se consideriamo, per esempio, G(x) =
F(x)
x 2
evidente che G(x) assume valori innitamente grandi per x che si avvicina a 2, come
conferma il graco (vedi gura 2):
> plot(F/(x-2), x=1..3, y=-10..10);
Talvolta si desidera stimare il valore di una funzione per valori di x molto grandi.
Esempio 11.1.1
Consideriamo la funzione razionale
> H := (4*x^2 + 1/x)/(3*x^2 - x);
H :=
4x
2
+
1
x
3x
2
x
Tracciando il graco di H nellintervallo [1, 10] si pu notare che esso decresce rapidamente
quando x cresce, no a stabilizzarsi ad un valore vicino a 1.4 (vedi gura 3):
> plot(H, x=1..10);
11.2. CALCOLO DI LIMITI CON MAPLE 89
Tale comportamento confermato dal graco di H nellintervallo [1, 100] (vedi gura 4):
> plot(H, x=1..100);
Facendo calcolare il limite da Maple si ottiene:
> Limit(H, x=infinity);
lim
x
4x
2
+
1
x
3x
2
x
che viene valutato in
> value();
4
3
Dunque: pi x si avvicina a , pi lespressione si avvicina a
4
3
. Questo fatto si pu
spiegare in questo modo: il termine x
2
presente nel numeratore e nel denominatore di H
cresce molto pi rapidamente di quanto fanno x oppure
1
x
. Assumendo grossolanamente
che tutti i termini piccoli possono essere ignorati e sostituiti con 0, lespressione che resta
pu essere semplicata in
4
3
.
11.2 Calcolo di limiti con Maple
Il comando limit(f(x), x=a, opzione) permette di calcolare lim
xa
f(x). Le opzioni che
ci interessano sono:
left, per calcolare il limite sinistro;
right, per calcolare il limite destro;
real, per calcolare il limite bidirezionale reale.
Se non viene specicata alcuna opzione il limite sar calcolato come limite reale bidirezio-
nale, a meno che a sia + o .
Il risultato di limit pu essere un numero, unespressione, , , undefined oppure un
intervallo p..q (questultima possibilit si presenta quando non pu essere trovato il limite
ma Maple sa che i valori di f sono nellintervallo [p, q] quando x tende ad a).
Esempio 11.2.1
> limit(x^2 + 2*x + 3, x=1);
6
> limit(1/x, x=0, right);
3
8
11.3. DEFINIZIONE FORMALE DI LIMITE 91
11.3 Denizione formale di limite
Diamo la denizione matematica rigorosa del concetto di limite, ossia dellespressione
f(x) si avvicina a L quando x si avvicina ad a.
Definizione 11.3.1
Si dice che il limite della funzione f(x) (avente dominio D
f
R)vale L, in simboli
lim
xa
f(x) = L,
se per ogni > 0 esiste un > 0 tale che [x a[ < implica [f(x) L[ < .
La denizione appena data serve per per dimostrare che il valore di un limite corretto.
Possiamo applicare questa denizione come se fosse un gioco tra due persone:
La prima persona sceglie un valore per , il pi cattivo possibile (solitamente
un valore molto piccolo!). La seconda persona scommette che in grado di
trovare un adeguato valore , come richiesto dalla denizione, da usare con .
Naturalmente la seconda persona vuole vincere la scommessa e dunque lunica possibilit
che ha per vincere il gioco quella di trovare una regola che fornisca per ogni valore di
(la regola deve essere valida per ogni x ]a , a + [D
f
).
Esempio 11.3.1
Vogliamo dimostrare che lim
x7
(x 4) = 3.
Sia dunque > 0 pressato. Dobbiamo trovare un > 0 tale che
[x 7[ < [(x 4) 3[ < .
Quanto scritto sopra valido se scegliamo = . Avremmo potuto, per esempio, scegliere
anche =
2
oppure =
5
, ma non = 2.
Esempio 11.3.2
Vogliamo dimostrare che lim
x1
(x
2
+ 1) = 2.
Carichiamo dapprima, mediante listruzione with, il package student che contiene dei
comandi per trattare problemi di analisi a livello licealepreuniversitario:
> restart: with(student):
Deniamo ora la funzione e il valore del limite proposto:
> f := x -> x^2 + 1; L := 2;
f := x x
2
+ 1
92 CAPITOLO 11. LIMITI DI FUNZIONI
L := 2
Dobbiamo trovare una restrizione per [x1[ in modo tale che la seguente disequazione sia
soddisfatta per quei valori di x che sono usati:
> abs(f(x) - L) < epsilon;
[x
2
1[ <
> factor();
[(x 1)(x + 1)[ <
> expand();
[x 1[[x + 1[ <
da cui si ottiene:
> isolate(, abs(x-1));
[x 1[ <
[x + 1[
La parte destra di questa disequazione
> B := rhs();
B :=
[x + 1[
una restrizione che dipende purtroppo da x e questo non ammissibile. Tuttavia le
osservazioni seguenti ci permettono di eliminare ogni riferimento a x in B:
Possiamo sempre scegliere la pi piccola fra due restrizioni. La regola che cerchiamo
deve specicare cosa succede nelle vicinanze di x = 1. Cos possiamo ignorare ogni
valore di x esterno ad una regione arbitraria, per esempio [x 1[ <
1
2
, anche se per
tali valori di x la f(x) si avvicina a L = 2.
Nella regione [x1[ <
1
2
possiamo sistematicamente sottostimare il valore di B usando
come unico valore di B il peggiore che possiamo determinare nellintero intervallo
(ossia: il pi piccolo).
Il numeratore di B la costante positiva , che stata scelta dal nostro avversario nel
gioco. Possiamo cos stimare B esaminando il comportamento di
> g := subs(epsilon=1, B);
1
[x + 1[
sulla regione [x 1[ <
1
2
e moltiplicando poi il risultato per .
Dal graco di g (vedi gura 5)
> plot(g, x=-0.5 .. 0.5);
segue che il valore minimo lo si ha per x =
1
2
: esso diventa il secondo candidato per la
nostra seconda restrizione. La nostra restrizione sar allora:
11.4. PROPRIET DEI LIMITI 93
> min(1/2, subs(x=1/2, B));
min
_
1
2
,
2
3
_
.
Scegliamo dunque = min
_
1
2
,
2
3
_
. Per questa restrizione abbiamo: [f(x) L[ < sempre
che [x 1[ < . Infatti:
[x 1[ < [x 1[ <
[x + 1[
[x 1[[x + 1[ = [x
2
+ 1 L[ <
Abbiamo cos trovato una regola per calcolare , dato un positivo qualsiasi.
Esercizio 11.3.1
Dimostrare, in modo analogo a quanto fatto nellesercizio precedente, che:
lim
x2
(23x
5
+ 105x
4
10x
2
+ 17x) = 2410 .
11.4 Propriet dei limiti
Nel seguito elenchiamo alcuni teoremi che riguardano le operazioni elementari con i limiti.
Si suppone che i limiti seguenti siano tutti deniti.
> restart: with(student):
Teorema 11.4.1 Il limite di una costante la costante stessa:
> Limit(k, x=c);
lim
xa
c
> expand();
c
Teorema 11.4.2 Le costanti possono essere messe in evidenza nel calcolo dei limiti:
> Limit(c*f(x), x=a);
lim
xa
cf(x)
> expand();
c lim
xa
f(x)
Teorema 11.4.3 Il limite di una somma uguale alla somma dei limiti:
> Limit((f(x) + g(x)), x=a);
lim
xa
(f(x) + g(x))
> expand();
lim
xa
f(x) + lim
xa
g(x)
94 CAPITOLO 11. LIMITI DI FUNZIONI
Teorema 11.4.4 Il limite di un prodotto uguale al prodotto dei limiti:
> Limit((f(x) * g(x)), x=a);
lim
xa
(f(x) g(x))
> expand();
lim
xa
f(x) lim
xa
g(x)
Teorema 11.4.5 Il limite di un quoziente uguale al quoziente dei limiti:
> Limit((f(x) / g(x)), x=a);
lim
xa
f(x)
g(x)
> expand();
lim
xa
f(x)
lim
xa
g(x)
Teorema 11.4.6 Limite di una potenza:
> Limit(f(x)^(g(x))), x=a);
lim
xa
f(x)
g(x)
> expand();
lim
xa
f(x)
lim
xa
g(x)
Teorema 11.4.7 Limite di una radice quadrata:
> Limit(sqrt(f(x), x=a);
lim
xa
_
f(x)
> expand();
_
lim
xa
f(x)
11.5 Il teorema sandwich
Teorema 11.5.1 Sia f(x) g(x) h(x) per ogni x vicino ad a.
Se lim
xa
f(x) = L = lim
xa
h(x) allora lim
xa
g(x) = L.
11.6. LIMITI DI SUCCESSIONI 95
Esempio 11.5.1
Vogliamo dimostrare che lim
x0
x sin(1/x) = 0.
Esaminiamo il graco della funzione nelle vicinanze di 0 (vedi gura 6):
> f := x -> x*sin(1/x);
f := x x sin(x
1
)
> plot(f(x), x=-0.5 .. 0.5);
Dal graco sembrerebbe che il limite sia 0 in x = 0.
Possiamo calcolare tale limite esattamente in x = 0 poich
[x[ x sin(x
1
) [x[, per ogni x vicino a 0.
Il graco della gura 7 mostra che [x[ un limite superiore per f. In modo analogo: [x[
un limite inferiore per f.
Siccome x sin(x
1
) [x[ abbiamo:
lim
x0
x sin(x
1
) lim
x0
[x[.
Analogamente:
lim
x0
[x[ lim
x0
x sin(x
1
).
Si pu dunque concludere che lim
x0
x sin(1/x) = 0.
La gura 8 rappresenta i tre graci insieme:
> plot({f(x), abs(x), -abs(x)}, x=-1..1);
11.6 Limiti di successioni
Una successione numerica (a
n
)
nN
non altro che una funzione avente linsieme N (o un
suo sottoinsieme) come dominio, ossia:
a : N R, n a(n) := a
n
Il termine a
n
della successione (a
n
)
nN
detto termine generale: esso, solitamente, fornisce
la regola per costruire tutti i termini della successione. Scriveremo, per comodit, (a
n
)
invece di (a
n
)
nN
.
Siamo interessati al comportamento della successione (a
n
) quando n . Si dice che la
successione (a
n
) converge verso il limite a per n e si scrive lim
n
a
n
= a se per ogni
> 0 esiste un M > 0 tale che per ogni n > M valga [a
n
a[ < .
Esempio 11.6.1
Consideriamo la successione dei reciproci dei numeri interi positivi:
96 CAPITOLO 11. LIMITI DI FUNZIONI
> a := n -> 1/n;
a := n
1
n
I primi dieci termini della successione sono:
> seq(a(i), i=1..10);
1,
1
2
,
1
3
,
1
4
,
1
5
,
1
6
,
1
7
,
1
8
,
1
9
,
1
10
e il limite della successione vale:
> Limit(a(n), n=infinity) = limit(a(n), n=infinity);
lim
n
1
n
= 0
come si pu ricavare anche dal graco della successione (vedi gura 9):
> punti := [seq([i, a(i)], i=1..50)]:
> plot(punti, color=red, style=point, symbol=circle);
Esempio 11.6.2
Consideriamo la successione
> b := n -> n/(n+1);
b := n
n
n + 1
i cui primi dieci termini sono:
> seq(b(i), i=1..10);
1
2
,
2
3
,
3
4
,
4
5
,
5
6
,
6
7
,
7
8
,
8
9
,
9
10
,
10
11
Possiamo ipotizzare che (b
n
) converga verso 1 per n . Il graco della successione (vedi
gura 10) conferma la nostra ipotesi:
> punti := [seq([i, b(i)], i=1..50)]:
> plot(punti, color=red, style=point, symbol=circle);
Vogliamo ora dimostrare rigorosamente che lim
n
b
n
= 1.
Comunichiamo dapprima a Maple che n sempre positivo (ci sar utile per le sempli-
cazioni automatiche, laddove appaiono valori assoluti):
> assume(n>0):
Sia dunque > 0 pressato. Dobbiamo determinare un M > 0 tale che per ogni n > M
valga:
> abs(b(n) - 1) < epsilon;
n
n +1
1
<
11.6. LIMITI DI SUCCESSIONI 97
> normal();
1
n +1
<
Per risolvere la disequazione precedente rispetto ad n dobbiamo dapprima caricare in
memoria la procedura isolate:
> readlib(isolate):
> isolate(, n+1);
n 1 <
1
< n
_
Baster scegliere:
> M := lhs(sol[1]);
M :=
+ 1
n
n +1
1
< .0001
Proviamo con n = 10000:
> evalf(abs(b(10000) - 1)); is(abs(b(10000) - 1) < epsilon);
.00009999000100
true
Esempio 11.6.3
Consideriamo la successione
> restart: c := n -> (-1)^n/n;
c := n
(1)
n
n
98 CAPITOLO 11. LIMITI DI FUNZIONI
i cui primi 10 termini sono
> seq(c(i), i=1..10);
1,
1
2
,
1
3
,
1
4
,
1
5
,
1
6
,
1
7
,
1
8
,
1
9
,
1
10
converge evidentemente verso 0 per n . Il graco della successione (vedi gura 11 )
mostra un tipo di convergenza che si potrebbe dire alternato:
> punti := [seq([i, c(i)], i=1..50)]:
> plot(punti, color=red, style=point, symbol=circle);
Una successione che non converge detta divergente. Negli esempi che seguono vogliamo
vedere vari modi nei quali una successione pu divergere.
Esempio 11.6.4
La successione
> d := n -> (n^3 + 3)/(20*n + 1);
d := n
n
3
+ 3
20n + 1
divergente. Infatti:
> Limit(d(n), n=infinity) = limit(d(n), n=infinity);
lim
n
n
3
+ 3
20n + 1
=
Il graco della successione (vedi gura 12) mostra il tipo di divergenza di (d
n
):
> punti := [seq([i, d(i)], i=1..50)]:
> plot(punti, color=red, style=point, symbol=circle);
Esempio 11.6.5
Consideriamo ora la successione
> e := n -> 2^((-1)^n);
e := n 2
((1)
n
))
i cui primi dieci termini sono
> seq(e(i), i=1..10);
1
2
, 2,
1
2
, 2,
1
2
, 2,
1
2
, 2,
1
2
, 2
Calcolando il limite con Maple si ottiene una risposta un po strana:
> Limit(e(n), n=infinity) = limit(e(n), n=infinity);
lim
n
2
((1)
n
))
=
1
2
.. 2
11.6. LIMITI DI SUCCESSIONI 99
Ci signica che Maple riconosce che la successione limitata nellintervallo [0.5, 2], ma
il limite non esiste. La successione detta oscillante; i punti
1
2
e 2 sono i punti di ac-
cumulazione di (e
n
). La gura 13 mostra la rappresentazione graca della successione
(e
n
):
> punti := [seq([i, e(i)], i=1..50)]:
> plot(punti, color=red, style=point, symbol=circle);
Esempio 11.6.6
Consideriamo la successione
> f := n -> (-1)^n * n/(n+1);
f := n
(1)
n
n
n + 1
i cui primi 10 termini sono
> seq(f(i), i=1..10);
1
2
,
2
3
,
3
4
,
4
5
,
5
6
,
6
7
,
7
8
,
8
9
,
9
10
,
10
11
Calcolando il limite si ottiene:
> Limit(f(n), n=infinity) = limit(f(n), n=infinity);
lim
n
(1)
n
n
n + 1
= 1 .. 1
Il graco della successione (vedi gura 14) conferma che 1 e 1 sono punti di accumulazione
di (f
n
):
> punti := [seq([i, f(i)], i=1..50)]:
> plot(punti, color=red, style=point, symbol=circle);
100 CAPITOLO 11. LIMITI DI FUNZIONI
CAPITOLO 12
Derivate
12.1 Introduzione
Sia data, tramite equazione, la funzione y = f(x). La retta tangente al graco di f(x) nel
punto x = a pu essere approssimata dalle rette secanti passanti per un secondo punto, di
ascissa x = b, che si avvicina a x = a.
> with(student):
> P := [a,f(a)]; Q := [b,f(b)];
P := [a, f(a)]
Q := [b, f(b)]
La pendenza della secante :
> pendenza := slope(Q,P);
pendenza :=
f(b) f(a)
b a
e questa pendenza approssima la pendenza della tangente nel punto x = a.
Esempio 12.1.1
Sia data la funzione
> f := x -> (x-1)*(x-2)*x;
f := x (x 1)(x 2)x
101
102 CAPITOLO 12. DERIVATE
Vogliamo approssimare la pendenza della tangente al graco di f(x) nel punto x =
1
5
.
Posto a =
1
5
consideriamo una successione di punti b = a + h, per piccoli valori di h:
> a := 1/5: b := a + h;
b :=
1
5
+ h
> h := 0.1: slope([b,f(b)], [a,f(a)]);
0.6900000000
> h := 0.01: slope([b,f(b)], [a,f(a)]);
0.8961000000
> h := 0.001: slope([b,f(b)], [a,f(a)]);
0.9176010000
Per calcolare il vero valore della pendenza della tangente in x =
1
5
bisogna calcolare il
limite delle pendenze precedenti per h tendente a 0:
> h := h: Limit(slope([b,f(b)], [a,f(a)]), h=0);
lim
h0
_
4
5
+ h
_ _
9
5
+ h
_ _
1
5
+ h
_
36
125
h
che vale
> m := value();
23
25
(si dice che questo valore la derivata di f(x) nel punto x =
1
5
). Lequazione della tangente
al graco di f(x) nel punto x =
1
5
dunque
> y = solve(y - f(a) = m * (x - a), y);
y =
13
125
+
23
25
x
La gura 1 mostra la situazione gracamente:
> showtangent(f(x), x=1/5, x=-1..1, y=-1..1);
(disegna la tangente al graco di f(x) nel punto x =
1
5
, nella regione piana [1, 1][1, 1]).
Nel seguito sia f(x) una funzione generica e x = a un punto generico. Se scegliamo un
secondo punto b come
> restart: with(student): b := a + h;
b := a + h
12.2. CALCOLO DELLE DERIVATE CON MAPLE 103
allora la pendenza della retta secante
> pendenza := slope([b,f(b)], [a,f(a)]);
pendenza :=
f(a + h) f(a)
h
Se b si avvicina ad a allora h si avvicina a 0 e quindi la pendenza della tangente data da
> m := Limit(pendenza, h=0);
m := lim
h0
f(a + h) f(a)
h
che viene semplicato da Maple in
> value();
D(f)(a)
Si dice che la derivata di f(x) nel punto x = a , sempre che esista, il limite visto sopra.
Si scrive:
f
(a) = lim
h0
f(a + h) f(a)
h
(invece di f
si usa anche
df
dx
o D(f)). evidente che:
f
(a) = lim
ba
f(b) f(a)
b a
(basta sostituire b con a + h).
12.2 Calcolo delle derivate con Maple
Il comando per derivare una funzione diff(f, x) (esiste anche la forma inerte Diff). Il
primo argomento di diff pu essere unespressione di Maple nella variabile x oppure una
funzione di Maple e in tal caso bisogner aggiungere la variabile tra parentesi.
Esempio 12.2.1
> f := x * sin(x); # f unespressione di Maple
f := x sin(x)
> Diff(f, x) = diff(f, x);
x
x sin(x) = sin(x) + x cos(x)
> g := x -> x + tan(x); # g una funzione di Maple
g := x x + tan(x)
104 CAPITOLO 12. DERIVATE
> diff(g, x); # Sintassi sbagliata e quindi risposta errata!
0
> diff(g(x), x);
2 + tan(x)
2
possibile derivare una funzione n volte rispetto alla variabile x scrivendo x$n come
secondo argomento del comando diff.
Esempio 12.2.2
> h := x^4 - 3*x^2 - 5*x + 12;
h := x
4
3x
2
5x + 12
> diff(h, x$3);
24x
Mediante diff(f, x, y, ...) possibile derivare f rispetto alle variabili x, y, ...
(naturalmente per derivate di ordine superiore si usa la sintassi descritta precedentemente).
diff(f, x, y) equivalente al comando diff(diff(f, x), y) (chiamata ricorsiva).
Esempio 12.2.3
> F := x * sin(y) + 3 * x^2 * y^3;
F := x sin(y) + 3x
2
y
3
> diff(F, x);
sin(y) + 6xy
3
> diff(F, y);
x cos(y) + 9x
2
y
2
> diff(F, x, y);
cos(y) + 18xy
2
> diff(F, x$2, y$3);
36
Osservazione 12.2.1
Da notare che il risultato di diff(f, x) non una funzione (di Maple) ma solo unespres-
sione, anche se f una funzione. Mediante il comando unapply si pu tuttavia trasformare
unespressione in una funzione.
Esempio 12.2.4
> G := x -> x*sin(x);
G := x x sin(x)
12.2. CALCOLO DELLE DERIVATE CON MAPLE 105
> dG := diff(G(x), x);
dG := sin(x) + x cos(x)
> type(dG, procedure);
false
> dG := unapply(dG, x);
dG := x sin(x) + x cos(x)
> type(dG, procedure);
true
Esiste anche loperatore dierenziale D che, nella sua forma pi generale ha la sintassi
D[i](f), dove i un intero o una successione di interi che designa le variabili rispetto alle
quali deve essere applicato loperatore (nota: D[i, j](f) = D[i](D[j](f))) e f una
funzione di Maple. Il risultato di D[i](f) una funzione di Maple.
Esempio 12.2.5
> D(sin);
cos
> D(f + g);
D(f) + D(g)
> D(f * g);
D(f)g + fD(g)
> D(f / g);
D(f)
g
fD(g)
g
2
> D(f@g); # @ loperatore per la composizione di funzioni
D(f)@g D(g)
> h := (x, y, z) -> x * y * cos(z);
h := (x, y, z) xy cos(z)
> D[1](h);
(x, y, z) y cos(z)
> D[1,2,3](h);
(x, y, z) sin(z)
> D[1,3$4](h);
y cos(z)
Osservazione 12.2.2
Essenzialmente D(f) equivale a unapply(diff(f(x), x)). diff deriva unespressione e
restituisce unespressione; D deriva una funzione di Maple e restituisce una funzione di
Maple.
106 CAPITOLO 12. DERIVATE
12.3 Derivate di funzioni implicite
Maple non in grado di calcolare direttamente le derivate implicite; tuttavia lo pu fare
con qualche piccolo aiuto. Vediamo come nel caso particolare in cui si volesse calcolare
dy
dx
dallequazione 5x
2
y
3
+ 2xy = x
2
7.
Deniamo dapprima lequazione:
> eq := 5 * x^2 * y^3 + 2 * x * y = x^2 - 7;
eq := 5x
2
y
3
+ 2xy = x
2
7
Per sottolineare il fatto che y una funzione di x facciamo la sostituzione seguente:
> eq2 := subs(y = y(x), eq);
eq2 := 5x
2
y(x)
3
+ 2xy(x) = x
2
7
Ora dovremmo derivare ogni sommando rispetto a x. Fortunatamente Maple mette a
disposizione il comando map(f, expr, arg1, arg2, ...) che applica la funzione f ad
ogni operando di expr rispettando eventuali ulteriori argomenti arg1, arg2, ... di f.
Dunque:
> eq3 := map(diff, eq2, x);
eq3 := 10xy(x)
3
+ 15x
2
y(x)
2
_
x
y(x)
_
+ 2y(x) + 2x
_
x
y(x)
_
= 2x
A questo punto risolviamo eq3 rispetto a
dy
dx
:
> solve(eq3, diff(y(x), x));
10xy(x)
3
+ 2y(x) 2x
15x
2
y(x)
2
+ 2x
dy
dx
vale cos:
> subs(y(x) = y, );
10xy
3
+ 2y 2x
15x
2
y
2
+ 2x
12.4 Estremi di una funzione
Si dice che una funzione reale f, di dominio D
f
, possiede il valore massimo assoluto nel
punto x = c se f(c) f(x), per ogni x D
f
.
Si dice che una funzione reale f, di dominio D
f
, possiede il valore minimo assoluto nel
punto x = c se f(c) f(x), per ogni x D
f
.
12.4. ESTREMI DI UNA FUNZIONE 107
Massimi e minimi assoluti sono detti estremi assoluti. Essi possono anche non essere unici,
come ben si pu vedere dalla gura 2:
> plot(cos(x), x=-17..17, y=-2..2);
oppure non essere niti (vedi gura 3):
> plot(x^3 - x^2 + 4*x + 4, x=-6..6);
Maple mette a disposizione i comandi minimize e maximize per determinare il minimo e
il massimo di una funzione. Prima di poter usare questi comandi necessario caricare in
memoria, mediante readlib(minimize), la libreria che contiene questi comandi.
Esempio 12.4.1
> restart: readlib(minimize):
> minimize(cos(x), {x});
1
> maximize(cos(x), {x});
1
> minimize(x^2, {x});
0
> maximize(x^2, {x});
(x) = 0.
Esempio 12.4.2
La gura 4 mostra che la funzione f(x) = 7x
3
+ 14x
2
7x 14 possiede un massimo e un
minimo locali nellintervallo [2, 2]:
> f := x -> 7*x^3 + 14*x^2 - 7*x - 14;
f := x 7x
3
+ 14x
2
7x 14
> plot(f(x), x=-2..2);
Risolvendo lequazione
> D(f)(x) = 0;
21x
2
+ 28x 7 = 0
108 CAPITOLO 12. DERIVATE
si possono trovare gli estremi locali:
> estremi := solve(, x);
2
3
+
1
3
7,
2
3
1
3
7
ossia, approssimandoli e ordinandoli:
> estremi := sort(evalf([]));
[1.548583770, 0.2152504369]
La gura 5 mostra il graco di f(x) e le tangenti orizzontali negli estremi locali:
> gr1 := showtangent(f(x),x=estremi[1],x=-2..2):
> gr2 := showtangent(f(x),x=estremi[2],x=-2..2):
> with(plots): display({gr1, gr2});
Le soluzioni di f
1
3
x
3
3x
2
+ 2
Gli estremi locali si ottengono risolvendo lequazione
> D(f)(x) = 0;
x
4
+ 4x
3
x
2
6x = 0
> estremi := solve(, x);
estremi := 0, 2, 3, 1
> estremi := sort([]);
estremi := [1, 0, 2, 3]
La gura 7 mostra che in x = 1 c un minimo locale che maggiore del massimo locale
situato in x = 3:
> gr1 := showtangent(f(x), x=estremi[1], x=-4..4, y=-10..10):
> gr2 := showtangent(f(x), x=estremi[2], x=-4..4, y=-10..10):
> gr3 := showtangent(f(x), x=estremi[3], x=-4..4, y=-10..10):
> gr4 := showtangent(f(x), x=estremi[4], x=-4..4, y=-10..10):
> display({gr1,gr2,gr3,gr4});