Andrea Ellero, Alberto Zorzi - AA.2002/2003

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Andrea Ellero, Alberto Zorzi - AA.2002/2003"

Transcript

1 Introduzione a MAPLE Andrea Ellero, Alberto Zorzi - AA.2002/2003 Questi appunti hanno lo scopo di introdurre all uso del programma Maple (Waterloo Maple Inc.) e sono di supporto alle lezioni di Informatica (idoneità), Facoltà di Economia dell Università Ca Foscari di Venezia. La conoscenza del programma puù essere approfondita utilizzando un qualsiasi manuale di Maple. INDICE DEI PARAGRAFI 1. Calcoli, espressioni e funzioni. 2. Risoluzione di equazioni e sistemi. 3. Limiti, derivate, integrali. 4. Funzioni di più variabili e grafici. 5. Algebra delle matrici. 6. Introduzione alla programmazione Calcoli, espressioni e funzioni 1.1 Calcoli numerici e letterali Maple è in grado di soddisfare esigenze di calcolo sia di tipo simbolico che numerico.

2 1.1.1 Numeri razionali e numeri floating point Provate a calcolare una somma algebrica di due numeri interi. Seguite l esempio e battete il tasto di ritorno a capo. > 3-5; 2 NB: non è necessario scrivere = mentre è obbligatorio concludere l espressione con ; > 7/2; 7 2 NB: non viene eseguita la divisione in modo numerico per non perdere precisione negli eventuali calcoli successivi. Per Maple, 7/2 e 3.5 sono oggetti diversi: il primo è un numero razionale, il secondo è un numero in virgola mobile (floating point). Per chiarire la differenza consideriamo uno stesso calcolo eseguito con Maple utilizzando la notazione razionale e con virgola: > (1/3.0)*3; > (1/3)*3; 1 NB: il simbolo * indica la moltiplicazione e non puù essere sottinteso. Si noti che il primo calcolo viene effettuato in virgola mobile anche se un solo numero (3.0) è di tipo floating point. Il secondo calcolo è esatto perchè 1/3 è riconosciuto e trattato come numero razionale. Vediamo che pasticci possono accadere: consideriamo un calcolo in cui siano utilizzate le due notazioni appena viste > (1/3.0)*3-(1/3)*3; cioè -0.1 per un miliardesimo ovvero mentre, ovviamente, dovrebbe risultare 0. Possiamo chiedere un calcolo numerico più accurato chiedendo a Maple di utilizzare un maggior numero di cifre (digits) decimali: > Digits:= 10; > (1/3.0)*3-(1/3)*3; Digits := ora gli zeri che precedono la cifra 1, dopo la virgola, sono 24: si tratta di un numero molto vicino allo zero ma non è esattemente zero.

3 1.1.2 Arrotondamenti, troncamenti ed errori La precisione nei calcoli effettuati da Maple è assai elevata, ma alla precisione dei calcoli è necessario accompagnare attenzione nel fornire i dati alla macchina e nell interpretare i risultati che la macchina restituisce. Ad esempio se forniamo dati poco precisi è inutile, se non dannoso, utilizzare molte cifre decimali nei calcoli effettuati da Maple. Vediamo allora come comportarci in alcuni casi frequenti. Anzitutto, quando è opportuno trascurare alcune cifre decimali di un numero possiamo semplicemente tenere solo le cifre che ci interessano: effettuiamo in tal caso un troncamento del numero. Possiamo diminuire l errore nel considerare il dato effettuando un arrotondamento. Effettuare un arrotondamento significa aumentare di una unità l ultima cifra che consideriamo qualora la prima cifra che stiamo per eliminare sia maggiore o uguale a 5, troncare il numero altrimenti. Ad esempio se > x:= ; x := volendo considerare due cifre decimali con un troncamento otteniamo il numero , arrotondando troviamo invece Se desideriamo una sola cifra decimale allora sia troncando che arrotondando otteniamo E chiaro che in generale l arrotondamento, a parità di cifre considerate, consente di ridurre l errore commesso ed è pertanto preferibile. Vediamo ora cosa accade se effettuiamo gli arrotondamenti troppo presto. Supponiamo di dover calcolare quanto vino sia necessario per riempire un contenitore cilindrico di alluminio (qui semplifichiamo e supponiamo si tratti di un cilindro perfetto). Prendiamo le misure interne del cilindro. Con un calibro (precisione 1/10=0.1 mm) riusciamo a misurare il diametro: > Diam:= 9.31 ; # cm Diam := 9.31 per l altezza usiamo un metro con precisione di un millimetro: > Altezza:= 19.4 ; # cm Calcoliamo il volume: Altezza := 19.4 > Volume:=(Diam/2)^2*Pi*Altezza; # il risultato è in cm^3 > evalf(%); Volume := π

4 AnzichÈ considerare l intera cifra decidiamo di considerare solo le quattro cifre a sinistra della virgola. Quindi, arrotondando all unità, otteniamo 1321 centimetri cubi (in litri: 1,321). Supponiamo che il vino costi 0,51 euro al litro e di dover riempire lattine. Il costo che dovremo sostenere sarà allora: > Costo_totale:=1.321*0.51*19800; ovvero 13339,46 euro. Costo totale := E una bella cifra che ci spinge ad effettuare una valutazione più precisa. Tornando al calcolo del volume prendiamo subito qualche cifra in più, anzi teniamo tutte quelle che vediamo scritte, non ci costa più fatica: > Costo_totale:= *0.51*19800; Costo totale := La differenza, in euro, è data da > ; 3.44 L esempio ci suggerisce di effettuare i calcoli ritardando il più possibile il momento nel quale effettuare gli arrotondamenti. Errori nei dati iniziali e trasmissione dell errore Ma il nostro conto è anche affetto da un altro errore, un errore inevitabile anche se meno evidente, dovuto alla precisione con la quale sono noti i dati iniziali. Per misurare il diametro del cilindro avevamo infatti a disposizione un calibro con precisione di un decimo di millimetro. In realtà dunque siamo certi che il diametro (Diam=9,31 cm) ha una misura compresa tra 9,30 e 9,32 cm; di più non possiamo chiedere al calibro. Diciamo che l errore assoluto in questa misura è di 0,01 cm e possiamo scrivere Diam = 9,310,01. L errore percentuale, o errore relativo, è dato dal rapporto tra l errore assoluto e la misura effettuata > er_diam:=0.01/9.32; vale a dire circa uno su mille. er Diam := Analogamente per l altezza, l errore assoluto è di 0,1 cm, ovvero Altezza=19,4 0,1 cm. L errore relativo è in tal caso:

5 > er_altezza:=0.1/19.4; er Altezza := quindi dell ordine del 5 per mille. Ma quale errore commettiamo nel calcolo del volume? Si dimostra che moltiplicando tra loro due misure l errore percentuale trasmesso nel calcolo è dato dalla somma degli errori percentuali. Nel nostro caso allora: > er_volume:=er_diam+er_diam+er_altezza; er Volume := L errore relativo nel calcolo del volume è dunque del 7 per mille (perchè sommiamo due volte l errore relativo del diametro?). Lo stesso errore relativo si ripercuote sul calcolo del costo totale. Si noti che gli altri fattori che compaiono nel calcolo del costo totale sono il numero 1/2, che è esatto cioè con errore assoluto nullo, e π, che Maple tiene in memoria con un numero di cifre significative sufficientemente elevato da poter essere considerato con errore relativo trascurabile. In termini assoluti il calcolo del volume è affetto allora dall errore: > ea_volume:=er_volume*volume; ea Volume := π > evalf(%); In realtà quindi il volume di una singola lattina è ovvero di millilitri L errore su di una singola lattina è dell ordine di mezzo cucchiaio da cucina! Per quanto riguarda il costo complessivo abbiamo invece: > ea_costo_totale:=er_volume*costo_totale; ea Costo totale := quindi un errore dell ordine di un centinaio di euro, un errore che rende in realtà trascurabile, in questo caso, l errore complessivo dovuto al precedente arrotondamento al centimetro cubo del volume della lattina! Problemi simili a quelli incontrati nel caso di una moltiplicazione si hanno anche nella trsmissione degli errori effettuando altre operazioni tra i dati: per un loro adeguato trattamento rimandiamo ai testi specializzati in analisi numerica.

6 1.1.3 Calcoli simbolici Maple è in grado di fare calcoli di tipo letterale utilizzando moltissimi comandi per la manipolazione algebrica. Vediamo qualche esempio. > 3*a-5*a+4*a-b*a; 2 a b a Manipoliamo l espressione raccogliendone i fattori: > factor(%); a ( 2 + b) NB: per indicare la riga di calcolo (execution group) appena eseguita si utilizza il simbolo di percentuale (%), nelle versioni di Maple meno recenti lo stesso effetto si ha utilizzando il doppio apice ( ). > 3*x*(x^2-y^2)^2/((x+y)*9*x); 1 (x 2 y 2 ) 2 3 x + y NB: l elevamento a potenza viene indicato dal simbolo ˆ. Si puù notare che Maple effettua immediatamente le semplificazioni ovvie. Ma puù fare di meglio: > simplify(%); 1 3 (x y) (x2 y 2 ) Vediamo qualche altra semplificazione: > root(x^2,2); x 2 > simplify(%); csgn(x) x NB: csgn(x) indica il segno di x. Poteva far di meglio scrivendo il valore assoluto di x, che pure è definito (si provi a scrivere >abs(x);) e si legge meglio: questa è una avvisaglia del fatto che Maple puù perdersi in un bicchier d acqua. Ancora un esempio: > (x+2)*(x^2-1)/(x+1); (x + 2) (x 2 1) x + 1 cerchiamo di riscrivere l espressione in modo più semplice:

7 > factor(%); (x 1) (x + 2) Proviamo ad eseguire le operazioni > expand(%); x 2 + x 2 ancora non ci soddisfa, torniamo a fattorizzare > factor(%); Rifacciamo il conto in ordine diverso > (x+2)*(x^2-1)/(x+1); proviamo prima ad espandere > expand(%); (x 1) (x + 2) (x + 2) (x 2 1) x + 1 x 3 x + 1 x x x2 x x + 1 un disastro! Proviamo a vedere se si semplifica qualcosa > simplify(%); meglio. Ora proviamo a fattorizzare > factor(%); x 2 + x 2 (x 1) (x + 2) L ordine delle operazioni è ovviamente importante: l abbiamo provato tante volte facendo i conti a mano, qui almeno possiamo riprovare velocemente. Provate a rifare il conto cambiando ancora l ordine delle manipolazioni e con altre espressioni. Dagli esempi fin qui visti simplify puù apparire come il comando più utile; in realtà il comando più flessibile è expand che consente, ad esempio, di stabilire quale fattore raccogliere: > expand((x+2)*(x+3)*(y+z),x); x 2 y + x 2 z + 5 x y + 5 x z + 6 y + 6 z > expand((x+2)*(x+3)*(y+z),x+2); (x + 2) x y + (x + 2) x z + 3 (x + 2) y + 3 (x + 2) z > expand((x+2)*(x+3)*(y+z),y+z); (y + z) x (y + z) x + 6 y + 6 z

8 > factor(%); (x + 2) (x + 3) (y + z) Altre informazioni Maple consente operazioni sui numeri interi quali la divisione con resto, il fattoriale, la fattorizzazione..., sui numeri complessi, su insiemi, vettori, matrici,... Sono inoltre definite alcune costanti quali > exp(1); e > Pi; π 1.2 Assegnazioni e funzioni Possiamo associare un nome ad un oggetto matematico quale ad esempio un espressione, un equazione, una funzione. La sintassi è nome := oggetto;. Ad esempio > fattore1:=x*y; fattore1 := x y ora fattore1 è una variabile che vale xy. Consideriamo una seconda variabile > fattore2:=x*z; e moltiplichiamo fattore2 := x z > prodotto:=fattore1*fattore2; prodotto := x 2 y z Maple ha già effettuato qualche conto riconoscendo il valore delle variabili utilizzate. Possiamo definire in questo modo anche le funzioni: > f:=x->x^2-1; f := x x 2 1 La variabile f è in questo caso un oggetto di tipo funzione che possiamo utilizzare come siamo abituati, per esempio per valutarla in un punto

9 > f(2); 3 ma anche in un punto simbolico > f(antonio); antonio 2 1 o componendola > f(y-1); (y 1) 2 1 Combiniamo una variabile di tipo numero con la funzione f > alfredo:=3; > f(alfredo); alfredo := 3 8 E poi semplicissimo disegnare grafici mediante il comando plot: > plot(f,-2..4,-2..5); Nell esempio la porzione di grafico che interessa è quella racchiusa nel rettangolo [-2,4]x[-2,5]. Il secondo argomento del comando plot è un intervallo contenuto nel dominio di f relativamente al quale interessa rappresentare il grafico di f. Il terzo argomento è opzionale e, se presente, individua l intervallo di interesse relativamente al codominio.

10 2 2. Risoluzione di equazioni e sistemi 2.1 Equazioni La risoluzione di equazioni è particolarmente semplice, il comando da utilizzare è solve. > solve({x^2=4},{x}); {x = 2}, {x = 2} Maple commette errori nel caso di calcoli letterali, anche semplici, se ci sono parametri > solve({a*x+b=0},{x}); {x = b a } (cosa succede se a=0?) e non risponde in alcuni casi numerici proibiti > solve({0*x+3=0},{x}); E capace di lavorare con i numeri complessi > solve({x^2+1=0},{x}); {x = I}, {x = I} (I è l unità immaginaria vale a dire il numero complesso tale che Iˆ2=-1). Vediamo qualche altro esempio > solve({x^3+x^2-5*x=0},{x}); {x = 0}, {x = }, {x = } 2 > solve({x^3-13*x+12=0},{x}); {x = 1}, {x = 3}, {x = 4} > solve({x^2+y=0},{x,y}); {y = x 2, x = x} > solve({x^2+y^2=0},{x,y}); {x = I y, y = y}, {x = I y, y = y} > solve({x^7+x^2=0},{x}); {x = 0}, {x = 0}, {x = 1}, {x = I }, {x = I 2 5 5}, {x = I 2 5 5}, {x = I }

11 > solve({exp(x)*x^2-3=0},{x}); {x = 2 LambertW( 1 1 3)}, {x = 2 LambertW( 3)} 2 2 Nell ultimo esempio LambertW è una funzione che soddisfa l equazione LambertW(x) * exp(lambertw(x)) = x. Maple è riuscito a fornirci una soluzione esatta anche in questo caso. In genere siamo perù più interessati alla risoluzione numerica di una equazione come la precedente. Il comando da usare è in tal caso fsolve, con la stessa sintassi di solve > fsolve({exp(x)*x^2-3 = 0},{x}); Ecco un altro caso interessante > f:=sin(x); {x = } f := sin(x) > sol1:=solve({f=0.3},{x}); sol1 := {x = } > sol2:=fsolve({f=0.3},{x}); sol2 := {x = } Quale soluzione è corretta? In realtà queste sono solo due delle infinite soluzioni dell equazione considerata. Maple non è in grado, in questo caso, di avvisarci della presenza di altre soluzioni. Possiamo comunque accertare la bontà delle soluzioni trovate sostituendole come argomento della funzione f utilizzando il comando subs > subs(sol1,f); sin( ) chiedendo il calcolo del valore della funzione nel punto mediante il comando evalf > evalf(%); > subs(sol2,f); > evalf(%); sin( )

12 2.2 Sistemi di equazioni Per risolvere sistemi di equazioni è sufficiente scrivere come argomenti del comando solve l elenco delle equazioni e delle variabili rispetto alle quali risolverle > eq1:=3*x+2*y=2; > eq2:=x-y=4; eq1 := 3 x + 2 y = 2 eq2 := x y = 4 > solve({eq1,eq2},{x,y}); {x = 2, y = 2} Vediamo un caso in cui il sistema presenta infinite soluzioni > eq3:=x+2*y=1; > eq4:=2*x+4*y=2; eq3 := x + 2 y = 1 eq4 := 2 x + 4 y = 2 > solve({eq3,eq4},{x,y}); {y = y, x = 2 y + 1} Mettiamo ora alla prova Maple su di un sistema di due equazioni non lineari. Sia > primo1:=3*x^3-exp(y); primo1 := 3 x 3 e y il primo membro della prima equazione e > primo2:=y^2+x; primo2 := y 2 + x il primo membro della seconda equazione e risolviamo il sistema primo1=0, primo2=3 dando anche un nome all insieme delle soluzioni > soll:=fsolve({primo1=0,primo2=3},{x,y}); soll := {x = , y = } Controlliamo l esattezza del risultato sostituendo le soluzioni trovate in primo1 e primo2 > subs(soll,primo1); > evalf(%); > subs(soll,primo2); e ( )

13 Si noti che la soluzione trovata non è unica (anche se Maple non lo dice): > subs({x= ,y= },primo1); > evalf(%); e > subs({x= ,y= },primo2); Limiti, derivate, integrali Maple fornisce tutti gli strumenti tradizionali dell analisi. Iniziamo a vedere alcune delle possibilità offerte nel caso di funzioni reali di variabile reale. Arriveremo a poter svolgere il tradizionale studio di funzione in modo completo Limiti Definiamo una funzione della quale andremo poi a cercare alcuni limiti > g:= x-> (x+1)*(x+2)*(x-3)/(x-1); g := x (x + 1) (x + 2) (x 3) x 1 Proviamo a calcolare il limite per x - > 1. Prima definiamo il limite che ci interessa > Limit(g(x),x=1); e adesso cerchiamone il valore > value(%); (x + 1) (x + 2) (x 3) lim x 1 x 1 undefined La risposta è corretta infatti calcolando i limiti da sinistra e da destra troviamo > Limit(g(x),x=1,left); > value(%); (x + 1) (x + 2) (x 3) lim x 1 x 1

14 Per il limite destro utilizziamo la lettera minuscola nel comando limit, questo consente di ottenere subito il valore numerico del limite > limit(g(x),x=1,right); Se gli ultimi due limiti calcolati da Maple sono giusti (e lo sono) allora il primo limite cercato non esiste. Vediamo come si calcolano i limiti a + e - infinito. Ad esempio > Limit(g(x),x=-infinity); > value(%); (x + 1) (x + 2) (x 3) lim x ( ) x Derivate Consideriamo una funzione di x e contenente il parametro k: > f:=x->x*cos(k*x); > diff(f(x),x); f := x x cos(k x) cos(k x) x sin(k x) k In realtà il fatto che f sia definita come funzione di x a Maple interessa poco. Possiamo infatti derivare anche rispetto a k: > diff(f(x),k); x 2 sin(k x) Cerchiamo ora i punti stazionari di una funzione. Definiamo la funzione > h:=x->x^3-2*x^2-4*x; h := x x 3 2 x 2 4 x e calcoliamone i punti stazionari ai quali diamo anche un nome (staz): > staz:=solve(diff(h(x),x)=0,x); staz := 2, 2 3 Più in generale possiamo studiare la monotonia della funzione determinando gli intervalli nei quali la derivata si mantiene non negativa: > solve(diff(h(x),x)>=0,x); RealRange(, 2 ), RealRange(2, ) 3

15 Otteniamo così che -2/3 è un punto di massimo locale mentre è di minimo locale il punto 2. Vediamo come classificare i punti stazionari utilizzando la derivata seconda. Anzitutto calcoliamola nel generico punto x: > diff(h(x),x,x); 6 x 4 Speghiamo ora a Maple di considerare l espressione appena trovata come immagine di x tramite la funzione derivata seconda di h, che chiameremo DDh; per far questo usiamo il comando unapply > DDh:=unapply(%,x); DDh := x 6 x 4 Adesso possiamo valutare la derivata seconda nei due punti stazionari. Nel primo punto si ha > DDh(staz[1]); 8 perciù si tratta di un massimo. Nel secondo punto stazionario si ha > DDh(staz[2]); 8 che ci conferma che il punto 2 è di minimo per h. Vediamo il grafico (numerico) di h fornito da Maple: > plot(h(x),x=-3..5, ); x

16 Uno studio di funzione Esaminiamo le caratteristiche del grafico di una funzione in modo dettagliato. Consideriamo la funzione > f:=x->x^3*(x+1)/(x^2+2); f := x x3 (x + 1) x Proviamo a farci disegnare il grafico da Maple: > plot(f(x),x= ); x Pare che in 0 ci sia un minimo. Ma vediamo di effettuare uno studio delle qualità delle proprietà della funzione in modo completo. Partiamo con il calcolo dei limiti: > limit(f(x),x=-infinity); > limit(f(x),x=+infinity); Studiamo il segno di f: > solve(f(x)>=0,x); RealRange(, 1), RealRange(0, ) pertanto f è negativa tra -1 e 0, positiva altrove. Per studiare la monotonia calcoliamo la derivata di f

17 > diff(f(x),x); 3 x2 (x + 1) x che si puù semplificare un po : > simplify(%); Cerchiamo i punti stazionari + x3 x x4 (x + 1) (x 2 + 2) 2 x 2 (2 x x + x 2 + 6) (x 2 + 2) 2 > staz:=solve(diff(f(x),x)=0,x); staz := 0, 0, 1 6 %1(1/3) %1 (1/3) 1 6, 1 12 %1(1/3) %1 1 (1/3) I 3 ( 1 6 %1(1/3) % %1(1/3) %1 1 (1/3) I 3 ( 1 6 %1(1/3) 47 6 %1 := (1/3) ), 1 %1 (1/3) ) Si leggono proprio male! Prima di tentare di scrivere meglio i punti stazionari vediamo cosa si puù dire riguardo alla monotonia fornendo a Maple solo il fattore che determina il segno della derivata > solve(2*x^3+8*x+x^2+6>=0,x); RealRange 1 6 ( ) (1/3) + 6 ( ) 1 (1/3) 6, ancora una volta qualcosa di poco leggibile. Proviamo a riscrivere i punti stazionari: > s1:=evalf(staz[1]); > s2:=evalf(staz[2]); s1 := 0. s2 := 0. > s3:=evalf(staz[3]*1.); s3 := > s4:=evalf(staz[4]); s4 := I > s5:=evalf(staz[5]); s5 := I

18 Valutiamo f nel terzo punto stazionario: > f(s3); Proviamo ora ad utilizzare la derivata seconda per classificare i punti stazionari > DDf:=unapply(diff(f(x),x,x),x); DDf := x 6 x (x + 1) x x2 x x3 (x + 1) (x 2 + 2) 2 4 x4 (x 2 + 2) x5 (x + 1) (x 2 + 2) 3 Nei punti stazionari si ottiene: > evalf(ddf(staz[1])); > evalf(ddf(staz[3])); Il punto terzo punto stazionario è pertanto di minimo locale. Per classificare il primo punto stazionario abbiamo bisogno di calcolare la derivata terza: > DDDf:=unapply(diff(f(x),x,x,x),x); DDDf := x 6 x + 1 x x6 (x + 1) (x 2 + 2) 4 > evalf(dddf(staz[1])); 18 x x x2 (x + 1) (x 2 + 2) 2 L origine è dunque un punto di flesso x3 (x 2 + 2) x4 (x + 1) (x 2 + 2) 3 + Avendo capito che i punti stazionari sono certamente compresi nell intervallo [-1, 1], proviamo a tracciare un secondo grafico numerico di f, questa volta restringendo il range da considerare > plot(f(x),x= ); 24 x5 (x 2 + 2) 3

19 x 1 Lo studio di funzione consente di guidare il modo di tracciare anche il grafico numerico molto meglio rispetto al fuorviante grafico numerico tracciato all inizio Integrali Possiamo calcolare sia integrali indefiniti che definiti. Ad esempio, calcoliamo una primitiva della funzione > f:=x->x*exp(x+1); f := x x e (x+1) usando il comando int: > int(f(x),x); e (x+1) (x + 1) 2 e (x+1) Verifichiamo i calcoli derivando > diff(%,x); e (x+1) (x + 1) e (x+1) e semplificando > simplify(%); x e (x+1)

20 ottenendo la conferma della correttezza del calcolo dell integrale. Nota: anche se non sappiamo se il programma ha fornito una primitiva corretta ci possiamo senz altro fidare delle derivate fornite da Maple. Si tratta di un conto puramente meccanico che un programmatore puù insegnare ad un elaboratore con poche righe di istruzioni in un qualsiasi linguaggio di programmazione. Per calcolare un integrale definito è sufficiente indicare, oltre alla variabile, l intervallo di integrazione > Int(f(x),x=0..2); > value(%); 2 0 x e (x+1) dx e 3 + e Consideriamo ora una classico esempio di funzione le cui primitive non possono essere scritte a partire da funzioni elementari utilizzando operazioni algebriche o composizione di funzioni: > g:=x->exp(-x^2); g := x e ( x2 ) calcoliamone l integrale generalizzato nell intervallo tra 0 e più infinito > int(g(x),x=0..+infinity); 1 π 2 che è corretto. Se vogliamo calcolare lo stesso integrale tra 0 e 1, ad esempio, Maple ovviamente non puù far molto: > int(g(x),x=0..5); 1 2 erf(5) π dove erf ( x ) = 2/sqrt(Pi) * int ((exp(-xˆ2), t = 0..x ). Quindi Maple si mangia la coda, e non poteva che essere così. Possiamo perù chiedere una valutazione numerica dell integrale: > evalf(value(%));

21 4 4. Funzioni di più variabili e grafici Limiti e derivate Vediamo molto velocemente come quanto visto per le funzioni di una sola variabile reale si estenda al caso di due variabili; l estensione a più variabili risulterà poi del tutto ovvia. Cominciamo definendo una funzione nelle variabili x e y: > f:=(x,y)->x^2*y-3*y/x; Proviamo a calcolare due limiti (facili) > limit(f(x,y),{x=2,y=3}); > limit(f(x,y),{x=0,y=3}); f := (x, y) x 2 y 3 y x 15 2 undefined Se tentiamo con altre funzioni facciamo presto a mettere in difficoltà Maple. La funzione > g:=(x,y)->x^2*y^2/(x^2*y^2+(x-y)^2); g := (x, y) non ha limite in (0,0), Maple non risponde: > limit(g(x,y),{x=0,y=0}); x 2 y 2 x 2 y 2 + (x y) 2 x 2 y 2 limit(, {x = 0, y = 0}) x 2 y 2 + (x y) 2 Ma anche nel caso di una funzione con limite 0 in (0,0) Maple si arena > limit(x^3/(x^2+y^2),{x=0,y=0}); x 3 limit(, {x = 0, y = 0}) x 2 + y2 Non ci sono ovviamente problemi nel calcolo delle derivate parziali: > diff(g(x,y),x); x y 2 2 x 2 y 2 + (x y) x2 y 2 (2 x y x 2 y) 2 (x 2 y 2 + (x y) 2 ) 2 > simplify(diff(g(x,y),y)); 2 x 3 y (x y) (x 2 y 2 + x 2 2 x y + y 2 ) 2

22 Ed ecco una derivata seconda mista > simplify(diff(g(x,y),x,y)); 2 x2 y 2 (6 x y 3 x 2 + x 2 y 2 3 y 2 ) (x 2 y 2 + x 2 2 x y + y 2 ) 3 Per valutare in un punto la derivata parziale seconda appena calcolata definiamo la funzione > DDXY:=unapply(%,(x,y)); DDXY := (x, y) 2 x2 y 2 (6 x y 3 x 2 + x 2 y 2 3 y 2 ) (x 2 y 2 + x 2 2 x y + y 2 ) 3 che ora possiamo valutare dove ci interessa, ad esempio in (1,-1): > DDXY(1,-1); Grafici Le possibilità grafiche sono uno dei punti forti dei programmi tipo Maple. Analizziamo prima alcune possibilità non ancora esplorate riguardo alle funzioni di una sola variabile. Passeremo poi alle funzioni di due variabili Alcune potenzialità grafiche per funzioni di una sola variabile > plot(sin(x),x=0..2*pi,title="funzione seno");

23 1 funzione seno x Possiamo anche tentare una compressione dell asse delle x per avere un idea del comportamento della funzione per valori molto grandi dell argomento > plot(sin(x),x=0..infinity); 0 infinity x Ma attenzione all interpretazione delle proprietà geometriche del grafico. Guardate cosa accade del grafico della funzione logaritmo in base e (che è una funzione concava!): > plot(ln(x),x=0..infinity);

24 infinity 0 x infinity -infinity Per utilizzare potenzialità grafiche disponibili solo a domanda, chiediamo a Maple di caricare il modulo plots: > with(plots); Warning, the name changecoords has been redefined [animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, display3d, fieldplot, fieldplot3d, gradplot, gradplot3d, implicitplot, implicitplot3d, inequal, listcontplot, listcontplot3d, listdensityplot, listplot, listplot3d, loglogplot, logplot, matrixplot, odeplot, pareto, pointplot, pointplot3d, polarplot, polygonplot, polygonplot3d, polyhedra supported, polyhedraplot, replot, rootlocus, semilogplot, setoptions, setoptions3d, spacecurve, sparsematrixplot, sphereplot, surfdata, textplot, textplot3d, tubeplot] Possiamo ora utilizzare tutti i comandi elencati sopra. Per esempio possiamo utilizzare le coordinate polari > polarplot(1,theta=0..2*pi);

25 Per un confronto tra coordinate cartesiane e polari prendiamo la curva di equazioni parametriche x=t, y=t in coordinate cartesiane > plot([t,t,t=-2*pi..2*pi]); e in coordinate polari, vale a dire interpretando la prima coordinata come la distanza dall origine e la seconda coordinata come angolo rispetto al semiasse positivo delle ascisse > polarplot([t,t,t=-2*pi..2*pi]);

26 Veniamo ora ad un grafico in scala semilogaritmica > logplot(10^x,x=0..10); 1e+10 1e+09 1e+08 1e+07 1e+06 1e+05.1e5.1e4.1e3.1e x e ad una curva definita mediante una equazione ben nota > implicitplot(x^2+y^2=1,x=-1..1,y=-1..1);

27 1 y x Quest ultimo comando è particolarmente utile quando si hanno curve meno note che Maple traccia senza protestare > implicitplot(exp(x^2*y)-exp(y)=sin(4*x),x=-2..2,y=-5..5); 4 y x

28 Grafici per funzioni di due variabili Vediamo alcuni esempi di grafici in tre dimensioni ottenuti con il comando plot3d e come tracciare le curve di livello. > plot3d(x^2+y^2,x=-4..4,y=-4..4,style=patch,color=x,grid=[50,50],orien > tation=[160,100],axes=boxed,title= paraboloide ); paraboloide x 2 0 y 2 4 > contourplot(x^2+y^2,x=-5..5,y=-5..5,contours=25); 4 y x 4 2 4

29 > plot3d(y^2-x^2,x=-4..4,y=-4..4,style=contour,contours=50,grid=[50,50] >,orientation=[200,60],color=black,axes=boxed,title= sella ); sella y x 4 > densityplot(x^2+y^2,x=-5..5,y=-5..5); 4 y x 4 2 4

30 5 5. Algebra delle matrici Esaminiamo ora alcune delle possibilità che Maple offre nel calcolo matriciale. Anzitutto vi sono due pacchetti che possiamo richiamare per operare sulle matrici e, più in generale, su probelmi di algebra lineare: linalg elinearalgebra. Qui esamineremo solo alcune delle possibilità offerte dal primo che andiamo a caricare: > with(linalg); Warning, the protected names norm and trace have been redefined and unprotected [BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp, QRdecomp, Wronskian, addcol, addrow, adj, adjoint, angle, augment, backsub, band, basis, bezout, blockmatrix, charmat, charpoly, cholesky, col, coldim, colspace, colspan, companion, concat, cond, copyinto, crossprod, curl, definite, delcols, delrows, det, diag, diverge, dotprod, eigenvals, eigenvalues, eigenvectors, eigenvects, entermatrix, equal, exponential, extend, ffgausselim, fibonacci, forwardsub, frobenius, gausselim, gaussjord, geneqns, genmatrix, grad, hadamard, hermite, hessian, hilbert, htranspose, ihermite, indexfunc, innerprod, intbasis, inverse, ismith, issimilar, iszero, jacobian, jordan, kernel, laplacian, leastsqrs, linsolve, matadd, matrix, minor, minpoly, mulcol, mulrow, multiply, norm, normalize, nullspace, orthog, permanent, pivot, potential, randmatrix, randvector, rank, ratform, row, rowdim, rowspace, rowspan, rref, scalarmul, singularvals, smith, stackmatrix, submatrix, subvector, sumbasis, swapcol, swaprow, sylvester, toeplitz, trace, transpose, vandermonde, vecpotent, vectdim, vector, wronskian] Definiamo anzitutto due vettori di 3 componenti: > v:= vector(3,[1,2,3]);w:=vector(3,[5,6,7]); v := [1, 2, 3] w := [5, 6, 7] Possiamo ora effettuare tutte le operazioni tra vettori. Partiamo con la somma: > v+w; v + w Per vedere esplicitamente il risultato dobbiamo valutare l espressione con l istruzione evalm:

31 > evalm(%); [6, 8, 10] Ecco invece la moltiplicazione per uno scalare > evalm(3*w); [15, 18, 21] Il prodotto scalare, o prodotto interno, si scrive invece > innerprod(v,w); 38 Passiamo alle matrici. Definiamo una matrice 2 per 3 e chiamiamola A: > A := matrix( 2, 3, [[1,3,2], [-5,14,9]]); [ ] A := una matrice 3 per 3 di nome B: > B := matrix( 3, 3, [[1,-1,1], [0,20,-8], [2,0,2]]); B := e una seconda matrice 2 per 3 di nome C: > C := matrix( 2, 3, [[0,5,2], [1,2,-1]]); [ ] C := e facciamo un po di operazioni tra matrici: > evalm(a+c); > evalm(2*a); [ [ ] ] Per l operazione di moltiplicazione tra matrici (righe per colonne) dobbiamo usare il simbolo &* :

Grafici di successioni.

Grafici di successioni. Grafici di successioni. Il comando plot non e completamente adatto allo scopo, perche con esso Maple si aspetta una funzione definita sui numeri reali. Consideriamo la successione che individua il numero

Dettagli

Parte 2. Determinante e matrice inversa

Parte 2. Determinante e matrice inversa Parte. Determinante e matrice inversa A. Savo Appunti del Corso di Geometria 013-14 Indice delle sezioni 1 Determinante di una matrice, 1 Teorema di Cramer (caso particolare), 3 3 Determinante di una matrice

Dettagli

GeoGebra 4.2 Introduzione all utilizzo della Vista CAS per il secondo biennio e il quinto anno

GeoGebra 4.2 Introduzione all utilizzo della Vista CAS per il secondo biennio e il quinto anno GeoGebra 4.2 Introduzione all utilizzo della Vista CAS per il secondo biennio e il quinto anno La Vista CAS L ambiente di lavoro Le celle Assegnazione di una variabile o di una funzione / visualizzazione

Dettagli

La selezione binaria

La selezione binaria Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Introduzione L esecuzione di tutte le istruzioni in sequenza può non è sufficiente per

Dettagli

Gli algoritmi: definizioni e proprietà

Gli algoritmi: definizioni e proprietà Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Gli algoritmi: definizioni e proprietà La presente dispensa e da

Dettagli

Algebra Booleana ed Espressioni Booleane

Algebra Booleana ed Espressioni Booleane Algebra Booleana ed Espressioni Booleane Che cosa è un Algebra? Dato un insieme E di elementi (qualsiasi, non necessariamente numerico) ed una o più operazioni definite sugli elementi appartenenti a tale

Dettagli

JAVASCRIPT. Tale file è associato alla pagina web mediante il tag