Matlab PDE Toolbox - Dipartimento di Matematica
Transcript
Matlab PDE Toolbox - Dipartimento di Matematica
UNIVERSITÀ DEGLI STUDI DI ROMA LA SAPIENZA Facoltà di Scienze Matematiche Fisiche e Naturali Corso di Laurea in Matematica Metodi Numerici per Equazioni alle Derivate Parziali Matlab PDE Toolbox Risoluzione di equazioni alle derivate parziali utilizzando Matlab Luca Cerone A.A. 2005-2006 Introduzione Questa tesina ha lo scopo di presentare l'uso di Matlab per la risoluzione numerica di equazioni alle derivate parziali lineari(da qui in avanti EDP). In particolare presenterò il PDE Toolbox, un insieme di funzioni e di utilities dedicate a questo tipo di problema. Nelle prossime pagine spiegherò quali tipi di EDP è possibile risolvere e delineerò una strategia generale per farlo. Dopodiché presenterò in dettaglio sia come sfruttare l'interfaccia graca del toolbox (G.U.I., graphic user interface), sia come eseguire le principali operazioni da linea di comando (C.L., command line), mettendo in risalto i vantaggi e i difetti dei due approcci. Nell'ultima parte applicherò quanto spiegato a due problemi specici e commenterò i risultati così ottenuti. Quanto detto in questa tesina si riferisce alla versione 7.0 di Matlab e alla versione 1.01 del PDE Toolbox. Rispetto alle versioni precedenti ci sono infatti stati dei cambiamenti che potrebbero creare dei problemi di retrocompatibilità. 1 EDP in Matlab: il solver pdepe Prima di introdurre il PDE Toolbox descrivo brevemente una funzione dedicata alle EDP che fa parte del Matlab di base, utile per la risoluzione di sistemi di EDP, in una variabile spaziale e tempo, di tipo ellittico e parabolico. La funzione (che in gergo viene detta questi problemi si chiama pdepe : solver ) in grado di risolvere permette di approssimare numericamente la soluzione di sistemi di EDP del tipo c(x, t, u, ∂u ∂u ∂ ∂u ∂u ) = x−m (xm f (x, t, u, )) + s(x, t, u, ) ∂x ∂t ∂x ∂x ∂x (1.1) trasformandoli in sistemi di equazioni dierenziali ordinarie che risolve poi con il solver ode15 (per informazioni su ode15 si rimanda all'help in linea di Matlab). 1 L'equazione (1.1) si suppone valida per a, b, t0 , tf ∈ R. s(x, t, u, ∂u ∂x ) Il termine f (x, t, u, ∂u ∂x ) è una sorgente. c t 0 ≤ t ≤ tf e a ≤ x ≤ b, con è un termine di usso, mentre invece è una matrice diagonale che rappresenta il modo di interagire delle equazioni del sistema. Gli elementi sulla diagonale possono essere identicamente nulli oppure positivi, ma ce ne deve essere almeno uno positivo: il caso di una singola equazione ellittica non è infatti contemplato dal solver specie) delle funzioni discontinuità. trie, a 1 m c ed pdepe. s, Sono permesse discontinuità (di prima a patto però che la griglia contenga i punti di deve essere uguale a 0 se il problema non presenta simme- se presenta simmetria cilindrica, oppure a radiale. Si suppone inoltre che la soluzione 2 se presenta simmetria u dell'EDP soddis la condizione iniziale u(x, t0 ) = u0 (x) (1.2) e che negli estremi, soddis le seguenti condizioni al bordo per ogni valore di t: ∂u )=0 ∂x ∂u p(b, t, u) + q(b, t)f (a, t, u, )=0 ∂x p(a, t, u) + q(a, t)f (a, t, u, q(x, t) (1.3) (1.4) è una matrice diagonale con elementi che sono o identicamente nulli, o sempre diversi da zero. Una volta riscritta la propria EDP nella forma prevista, la si può risolvere numericamente usando il seguente comando: sol=pdepe(m,pdefun,icfun,bcfun,xmesh,tspan) Il signicato dei parametri da passare alla funzione pdepe è il seguente: - m è il termine che compare in (1.1) e che rappresenta il tipo di simmetria del problema; - pdefun è una funzione denita dall'utente e che, ricevuti in input x, t, u, ∂u ∂x , genera c, f e s. È cioè una funzione del tipo 2 [c,f,s]=pdefun(x,t,u,dudx) con x e t scalari ed u e dudx vettori che approssimano la soluzione e la derivata parziale, c deve essere un vettore che contiene gli elementi della diagonale della matrice c, f ed s devono essere vettori; - icfun deve essere una funzione che calcola le condizioni iniziali, deve avere la forma u=icfun(x); - bcfun è una funzione che calcola i termini p e q in (1.3) e in (1.4). Ha la forma [pl,ql,pr,qr]=bcfun(xl,ul,xr,ur,t) ul è la soluzione che approssima approssima a p u u in xl= a, ur è la soluzione che in xr=b. pl e ql sono vettori colonna che corrispondono e agli elementi della diagonale di corrispondono ai valori di p q in a. Analogamente pr e qr e della diagonale di q in b; - xmesh è il vettore che contiene i nodi della griglia di [a, b] (il solver richiede che xmesh contenga almeno 3 valori); - tspan è il vettore che contiene i valori degli istanti temporali in cui si vuole conoscere la soluzione. La variabile sol così ottenuta sarà una matrice tridimensionale, dove il generico elemento u, sol(i, j, k) approssima la k−ma componente della soluzione all'istante tspan(i) e nel nodo xmesh(j). A titolo di esempio, supponiamo di voler risolvere la seguente EDP parabolica scalare: ∂u ∂ 2 u − 2 =x ∂x ∂t u(x, 0) = sin(x) u(0, t) = u(2π, t) = 0 3 (1.5) con x ∈ (0, 2π) e per t = 0, . . . , 1. La prima cosa da fare è riscrivere l'equazione nella forma (1.1) e individuare il valore dei coecienti. Nel nostro caso possiamo riscrivere l'EDP come 1· da cui deduciamo che ∂u ∂2u +x = ∂t ∂x2 m = 0, c = 1, f = ∂u ∂x e s = x. Analogamente guardando alla forma (1.2) e (1.3), (1.4) delle condizioni iniziali e al bordo rispettivamente, possiamo dedurre che p(b, t, u) = u e inoltre u0 (x) = sin(x), p(a, t, u) = u = q(a, t, u) = 0 = q(b, t, u). A questo punto si possono scrivere le funzioni da passare come argomenti al solver per la risoluzione numerica dell'equazione. Qui di seguito è riportato il listato del codice da implementare in Matlab per calcolare la soluzione, visualizzarne il prolo al variare del tempo e generare un lmato che mostra l'andamento della soluzione nel tempo. function sol=senzapdetool %generazione dei nodi su x e t. m = 0; x = linspace(0,2*pi,30); t = linspace(0,1,10); sol = pdepe(m,@pdefun,@initcon,@boundcon,x,t); u = sol(:,:,1); surf(x,t,u) %profilo della soluzione al variare del tempo figure plot(x,u(end,:)) %grafico della soluzione per t=1 %---------------------------------------------------%le prossime istruzioni servono a generare un filmato che %mostra l'andamento della soluzione nel tempo umax=max(max(sol)); umin=min(min(sol)); [n,m]=size(sol); 4 newplot Mpdepe=moviein(n); for i=1:n plot(x,u(i,:)) axis([0 2*pi umin umax]); caxis([umin umax]); Mpdepe(:,i)=getframe; end % -------------------------------------------------------------% funzione che definisce i valori di c,f ed s function [c,f,s] = pdefun(x,t,u,DuDx) c = 1; f = DuDx; s = x; % -------------------------------------------------------------%funzione che definisce la condizione iniziale function u0 = initcon(x) u0 = sin(x); % -------------------------------------------------------------%funzione che definisce le condizioni al bordo function [pl,ql,pr,qr] = boundcon(xl,ul,xr,ur,t) pl = ul; ql = 0; pr = ur; qr = 0; Dovrebbe essere chiaro a questo punto che la risoluzione di una EDP utilizzando il solver di base risulta un po' dicoltosa e inoltre, pur essendo adatta in molte situazioni, non permette di risolvere EDP denite su un dominio bidimensionale, né tantomeno di risolvere EDP ellittiche o iperboliche. Come vedremo nelle prossime sezioni, il PDE Toolbox permette innanzitutto di risolvere problemi più complessi e, nella stragrande maggioranza dei casi, in maniera estremamente semplice tramite GUI. 2 Il PDE Toolbox Il PDE Toolbox estende le capacità del solver di base pdepe, permettendo di risolvere EDP e sistemi di EDP ellittiche, paraboliche e iperboliche, denite 5 su un dominio limitato Ω ⊂ R2 (con condizioni di Dirichlét, condizioni di Neumann e condizioni miste), problemi agli autovalori e anche una classe di equazioni non lineari. In queste pagine mi occuperò principalmente dei tre tipi di EDP lineari seguenti: −∇ · (c∇u) + au = f ∂u d − ∇ · (c∇u) + au = f ∂t ∂2u d 2 − ∇ · (c∇u) + au = f ∂t equazioni ellittiche equazioni paraboliche equazioni iperboliche (2.1) (2.2) (2.3) Le equazioni (2.1), (2.2) e (2.3), possono essere viste anche come una notazione compatta per sistemi di EDP rispettivamente ellttici, parabolici o iperbolici. Il Matlab è in gradi di risolvere sistemi che si presentino in forma (2.1), (2.2) e (2.3), anche se non sono, matematicamente parlando, eettivamente del tipo indicato. Da qui in avanti, mi riferirò esclusivamente al caso di EDP scalari e non di sistemi. Nell'equazione (2.1) su Ω. In (2.2) e (2.3) c, a, f c, a, f, d e u sono funzioni a valori complessi denite , sono funzioni a valori complessi che posso- no eventualmente dipendere anche da t, mentre u è una funzione a valori complessi. Dopo queste informazioni preliminari non rimane che vedere come usare eettivamente il PDE Toolbox per la risoluzione di un problema. 3 L'interfaccia graca: un primo semplice problema Il modo più semplice per risolvere una EDP usando il Toolbox è senza dubbio usare l'interfaccia graca. Dopo aver caricato la GUI tramite il comando pdetool, ci si troverà davanti a una schermata che si presenta come mostrato in gura 3.1. 6 Figura 3.1: Come si presenta la GUI del PDE Toolbox Per illustrare le funzioni disponibili è conveniente supporre di voler risolvere un problema, ad esempio la seguente equazione ellittica con condizioni al bordo di Dirichlet: −∆u = 1 dove Ω ⊂ R2 u=0 in su Ω (3.1) δΩ è la sfera di centro l'origine e raggio 1. La prima cosa da fare è disegnare il dominio Ω. Per fare ciò è suciente premere l'icona rappresentante l'ellisse con la croce al centro (vedi gura 3.2), dopodiché si posiziona il cursore sull'origine e, tenendo il tasto destro del mouse, lo si trascina no ad aver ottenuto una circonferenza del raggio desiderato. Il cerchio così ottenuto apparirà con l'interno colorato in grigio, e sarà contrassegnato dall'etichetta C1. Per essere sicuri di aver disegnato proprio il dominio desiderato, si può cliccare due volte sul cerchio e inserire i 7 Figura 3.2: Barra degli strumenti del PDE Toolbox dati giusti (coordinate del cerchio e lunghezza del raggio) tramite l'interfaccia che compare. Dopo aver disegnato il dominio si devono specicare le condizioni al bordo. Cliccando sull'icona δΩ, nell'area di lavoro verrà mostrato il bordo di C1 come composto da 4 archi. Tale rappresentazione del bordo è molto comoda qualora si vogliano imporre condizioni al bordo miste, permettendo di specicare per ogni arco il tipo di condizione desiderata: cliccando due volte su un arco si apre, infatti, un menù che permette di scegliere le condizioni relative a quell'arco. Ciò mette in luce da un lato la semplicità di utilizzo per risolvere problemi con condizioni miste, dall'altro il limite di dover imporre condizioni al bordo solamente su archi pressati. Per ovviare a questo inconveniente si dovrà agire da linea di comando, come spiegherò più avanti. In ogni caso, nel problema che stiamo risolvendo, le condizioni sono dello stesso tipo su tutti gli archi ed è conveniente inserirle tutte in una volta nel modo che segue: aprire il menù di scelta Boundary dunque selezionare Speci- fy Boundary Conditions, e dunque il tipo di condizione che si vuole imporre: nel nostro caso Dirichlet di parametri h=1 ed r = 0. Dopo aver specicato il dominio e le condizioni al bordo è necessario indicare che tipo di EDP si sta risolvendo e con che parametri. dunque sull'icona f = 1. PDE e si sceglie elliptic con coecienti Si clicca c = 1, a = 0, A questo punto è suciente creare la griglia cliccando sull'icona col triangolo, eventualmente ranarla cliccando sull'icona con più triangolini uno dentro l'altro, e risolvere l'EDP cliccando sull'icona con l'uguale. Di default apparirà una rappresentazione bidimensionale della soluzione. Se si vuole il graco 3d basta premere il bottone con la supercie, selezionare la 8 Figura 3.3: Come appare il Boundary Mode casella Height (3d plot) e quindi fare clic su plot. Abbiamo sin qui delineato le linee guida da seguire nell'arontare una EDP con Matlab, usando perlopiù impostazioni di default. Il Matlab, però, permette di scegliere molti parametri che possono portare a una più eciente risoluzione dei problemi, sia in termini di tempo, che della precisione ottenuta, come mostrerò nella prossima sezione. 4 GUI impostazioni generiche Ho n qui mostrato come risolvere una semplice EDP, adesso approfondirò le caratteristiche della GUI per risolvere problemi un po' più complessi e avere un maggior controllo dei parametri in gioco. Innanzitutto vediamo le opzioni che sono comuni per i tre tipi di EDP (2.1), (2.2), (2.3). 9 Iniziamo dalla creazione del dominio, nel caso precedente Ω era un og- getto estremamente semplice, ma si possono denire domini più complessi ottenuti dall'unione e intersezione di poligoni ed ellissi. Per un dominio che non si possa decomporre in questa maniera sarà necessario denire delle funzioni che lo descrivono e agire da linea di comandi come mostrerò in seguito. Innanzitutto si procede col disegnare le gure di base che compongono il dominio, ad esempio un'ellisse, un triangolo e un rettangolo. Per disegnare un'ellisse generica si clicca su una delle due icone che rappresenta un'ellisse (con o senza croce a seconda che la si voglia tracciare a partire dal centro o delineando i semiassi) e si trascina il cursore nell'area dedicata alla graca. Si può notare la dierenza col caso precedente in cui si voleva disegnare un cerchio: usando il tasto destro del mouse si garantisce che i semiassi siano uguali, il tasto destro garantisce anche che i lati di un rettangolo siano uguali e permette quindi disegnare dei quadrati. Clicchiamo poi sull'icona col rettangolo per tracciare il rettangolo e sull'icona con il poligono per disegnare i tre lati del triangolo (questo pulsante permette inoltre di creare poligoni generici). I tre oggetti sono contrassegnati dalle etichette E1,R1,P1 rispettivamente, e di default il Matlab considera l'unione di questi oggetti come dominio Ω. Suppongo però, che Ω sia dato dall'unione dell'ellisse e del rettangolo alla quale viene tolto il triangolo. Per specicare questo dominio è semplice: in alto, subito sotto la barra degli strumenti, c'è infatti una barra che contiene la cosiddetta SET FORMULA, che indica quale tipo di operazione insiemistica si deve fare con gli oggetti disegnati. sarà E1 + R1 + P 1 Subito dopo il disegno la formula che rappresenta l'unione dei tre oggetti. E' suciente modicare la formula in (E1 + R1) − P 1 per ottenere il dominio desiderato (vedi gura 4.1). In generale, le parentesi servono a gestire la precedenza delle operazioni 10 Figura 4.1: Composizione di un dominio 11 da svolgere sugli insiemi, il + indica l'unione di insiemi, l'∗ l'intersezione e il − che l'insieme va tolto da ciò che lo precede. In questo modo si possono creare insiemi anche abbastanza complessi con uno sforzo relativamente modesto. Per quanto riguarda la creazione di un dominio l'unica cosa che resta da dire è che gli elementi che compongono il dominio possono essere ruotati. Per farlo bisogna prima selezionare l'elemento che si desidera ruotare, dopodiché nel menù Draw si sceglie Rotate. A questo punto bisogna scegliere l'angolo di rotazione in gradi (ricordando che un numero positivo indica una rotazione antioraria e un numero negativo una rotazione oraria) e le coordinate del punto che fa da centro della rotazione (di default è il centro di massa dell'oggetto). Analizziamo ora i menù restanti. Sul menù File c'è poco da dire, permette di iniziare una nuova sessione di lavoro, caricarne una, salvarla, salvarla con un nuovo nome, e stamparla. Il menù Edit si attiva solamente quando si stanno disegnando gli ogget- ti che compongono il dominio, o si stanno modicando le impostazioni del bordo. Ecco il signicato delle opzioni nell'ordine: Undo quando si sta disegnando un poligono, permette di cancellare l'ultimo segmento disegnato; Cut rimuove gli oggetti disegnati ma li conserva in memoria per poterli incollare nella posizione desiderata con Paste; Copy copia gli oggetti in memoria per poterli incollare nella posizione desiderata con Paste, e lascia l'originale dove si trova; Paste incolla gli oggetti in memoria nella posizione desiderata; Clear cancella tutti gli oggetti selezionati; Select All seleziona tutti gli oggetti disegnati. Il menù Options permette di scegliere delle impostazioni utili: Grid visualizza una griglia nell'area di disegno; Grid Spacing permette di scegliere quanto deve essere tta la griglia; 12 Snap se questa opzione è selezionata, quando si prova a disegnare un oggetto questo è costretto ad aderire alla griglia (ad esempio i centri delle circonferenze verrano poste sul nodo più vicino, e lo stesso per i vertici di rettangoli e poligoni); Axis Limits della permette di selezionare la lunghezza dell'intervallo della x e y; Axis Equal impone la stessa scala sugli assi x e y; Turn o Toolbar Help disabilita il messaggio di aiuto che compare soermandosi col mouse sulle icone; Zoom permette di ingrandire porzioni dell'area di disegno; Application è l'opzione più interessante: andando con il cursore su Ap- plication si apre un menù a tendina che permette di scegliere la modalità desiderata. Quella predenita è Generic Equation, generica EDP, ma ve ne sono molte altre per i generici sistemi di EDP e per le principali applicazioni delle EDP ai problemi della sica e della meccanica. In sostanza, i parametri da inserire negli altri menù non saranno più quelli delle formule (2.1), (2.2), (2.3), ma saranno legati alla forma standard dell'equazione per lo specico problema considerato. Ad esempio per l'equazione stazionaria del calore (Heath Equation), la forma standard dell'EDP con condizioni al bordo di Dirichlet è: −∇ · (k∇T ) = Q + h · (Text − T ) T = Tbound dove T è la temperatura, la sorgente di calore, h la temperatura esterna, k in su Ω (4.1) δΩ è il coeciente di conduzione, Q rappresenta è il coeciente di conduzione per convezione, Tbound Text è è la funzione della temperatura T sul bordo. L'equazione in questione è un'equazione ellittica, ma in questo caso anziché i coecienti visti in precedenza, si dovranno inserire i valori di e Tbound . k, Q, h, Text , La trattazione dettagliata di tutte le modalità per le applicazioni esula dallo scopo di questa tesina, ma informazioni approfondite possono 13 essere trovate nell'Help in linea di Matlab; Refresh aggiorna e ridisegna tutti gli oggetti graci. I menù che restano sono quelli che maggiormente ci interessano dal punto di vista matematico. Tuttavia le schermate potrebbero variare a seconda del tipo di problema che si aronta, pertanto per spiegarli converrà fare riferimento a problemi specici. 5 GUI impostazioni avanzate per EDP ellittiche Torniamo a considerare l'equazione (3.1) di pagina 7. Abbiamo già visto come risolverla usando le impostazioni di base, vediamo ora qualche opzione più avanzata. Dopo aver disegnato il cerchio unitario, aver settato le condizioni al bordo, scelto il tipo di equazione e inserito i coecienti, apriamo il menù Abbiamo già visto gli eetti di Initialize Mesh e Rene Mesh Mesh. (rispettivamen- te la crezione della griglia e il suo ranamento), saltiamo per il momento l'opzione Jiggle Mesh e clicchiamo su Parameters. Nella schermata che si apre è possibile impostare alcuni parametri: Maximum Edge Size permette di impostare la lunghezza massima dei lati dei triangoli che compongono la griglia; Mesh Growth Rate deve essere un numero compreso tra 1 e 2, indica la velocità di crescita della griglia, e dà un'indicazione della dierenza di di- mensione tra i più piccoli triangoli che compongono la griglia e i più grandi; Jiggle Mode selezionando questa opzione si abilita la funzione di jiggling (da jiggle, scuotere), ossia dopo aver generato la griglia si cerca di far sì che i triangoli siano per quanto più possibile equilateri, in maniera da evitare problemi di malcondizionamento. A ogni triangolo della griglia viene associato un valore di qualità che dipende proprio dalla forma del triangolo. Tra le modalità di Jiggling si può scegliere, una sola volta, ON per eettuare questa operazione Optimize minimum per ripetere l'operazione no a quando 14 il più basso valore di qualità dei triangoli non smette di crescere, oppure no a quando non si è raggiunto il numero massimo di iterazioni che si può specicare più in basso, Optimize mean si comporta come Optimize minimum, ma prendendo come riferimento la qualità media dei triangoli; rene methods permette di scegliere se avere una griglia per quanto più possibile uniforme (opzione regular), oppure se suddividere ad ogni ranamento solamente i lati più lunghi dei triangoli (opzione longest). Sempre dal menù dei triangoli con Draw è possibile visualizzare gracamente la qualità Display Triangle Quality (sono accettabili valori superiori a 0.6), ed eventualmente eseguire manualmente l'operazione di Jiggling cliccando su Jiggling. É inoltre possibile mostrare i numeri dei vertici dei triangoli, e il numero associato ad ogni triangolo, scegliendo Triangle Labels Show Node Labels e Show rispettivamente. Tuttavia, specie quando si lavora con una griglia composta di un numero elevato di triangoli, sconsiglio di abilitare queste opzioni perché richiedono l'uso di una notevole quantità di memoria che potrebbe rallentare in maniera drastica le operazioni da compiere. Andiamo ora ad analizzare il menù Solve. Cliccando su Solve, si lan- cia il solver che risolve numericamente l'equazione. I parametri utilizzati dal solver possono esere specicati cliccando su Parameters. Nel caso di equazio- ni ellittiche, si aprirà una nestra che prevede l'abilitazione di due opzioni: Adaptive mesh renement e Use Non Linear Solver. Di default non sono selezionate, tuttavia risultano utili in molte occasioni. Adaptive mesh mode, permette di calcolare la soluzione numerica an- dando a ranare la griglia solo in quei triangoli dove non si è raggiunta l'accuratezza desiderata. Se lo si seleziona si potrà decidere il numero massimo di triangoli che può essere aggiunto ad ogni ranamento della griglia (Maximum Numbers of Triangles), griglia da eseguire il numero massimo di ranamenti della (Maximum Number of renements), quali scegliere: 15 i criteri in base ai Worst Triangles si basa sul peggiore valore di qualità dei triangoli per selezionare i triangoli da ranare, e su una funzione nativa del PDE Tool pdejmps,che ( vedremo quando parlerò di C.L.) che fornisce una stima del- l'errore sui vari triangoli; il valore indicato in Worst Triangle Fraction deve essere compreso tra 0 e 1, tantò più sarà alto tanti meno triangoli necessiteranno un ranamento, tanto più sarà vicino a 0 tanti più triangoli saranno ranati; Relative Tolerance esegue il ranamento su quei triangoli per i quali l'errore relativo stimato è maggiore della tolleranza indicata nella casella Re- lative Tolerance ; User dened function per indicare un'eventuale funzione creata dall'u- tente per la selezione dei triangoli; Renement Method, si può scegliere regular o longest cato visto per i parametri del menù Per quanto riguarda con lo stesso signi- Mesh. Use Non Linear Solver è necessario selezionarlo quan- do ci si trova di fronte a un'equazione non lineare, i parametri da denire solo la tolleranza per l'errore, una eventuale soluzione inziale da cui far cominciare partire l'algoritmo (il solver non lineare si basa sull'algoritmo di Newton che ha convergenza solo locale), il modo di approssimare lo Jacobiano della xed, funzione ( usando un metodo di punto sso, con una matrice diagonale, Le opzioni full Adaptive mode e lumped approssimandolo calcolo completo dello Jacobiano. Use Non Linear Solver possono essere atti- vate sia indipendentemente l'una dall'altra che contemporaneamente. Dopo aver settato tutte queste impostazioni, cliccando sull'icona con l'uguale si procede alla risoluzione numerica. Restano solamente da impostare le proprietà di visualizzazione. Per fare ciò si apra il menù Plot e si clicchi su Parameters. Ecco brevemente il signi- cato dei parametri: Color permette di scegliere in base a quale valore assegnare il colore a quanto 16 disegnato nel graco (di default è la soluzione approssimata u); plot style ser- interpolated shad.), ve per decidere se il colore dovrà sfumare gradatamente ( at shad.; o se riferirsi al valor medio della funzione su ciascun triangolo ( contour se selezionato mostra le curve di livello nel graco; arrows disegna delle frecce per indicare l'andamento del campo vettoriale, le si può scegliere di lunghezza ssa ( modulo del campo vettoriale deformed mesh normalized ) oppure proporzionale al (proportional) ; dà una rappresentazione deformata del dominio, la de- formazione dipende dal modulo del gradiente; questa opzione deve essere attivata da sola ed è pensata principalmente per problemi di meccanica; Height 3d di default disegna la supercie (x, y, u(x, y)), tuttavia è possibile scegliere la grandezza che si desidera rappresentare sull'asse delle zando il menù a tendina (ad esempio z utiliz- |∇u|; plot in x-y grid disegna il graco anziché sulla griglia triangolare di partenza, su una griglia rettangolare; contour plot levels indica quante curve di livello disegnare; show mesh rappresenta la griglia nel graco; colormap indica quali colori usare per la rappresentazione graca. Dopo aver congurato tutti i parametri desiderati è suciente cliccare su Plot per visualizzare i risultati nella maniera voluta. Come si sarà notato nel menù di scelta non era possibile selezionare l'opzione Animation, questo perché in una equazione ellittica la soluzione non dipende da una variabile temporale. Tale dipendenza è invece in generale presente in equazioni paraboliche e iperboliche, e per esse sarà possibile ottenere un'animazione che mostra come varia la soluzione in funzione del tempo. 17 6 GUI impostazioni avanzate per EDP paraboliche iperboliche In questo paragrafo mostrerò qualche impostazione specica per le equazioni paraboliche e iperboliche. Tratterò insieme i due casi in quanto sono molto simili da spiegare. Sia per il caso parabolico che per quello iperbolico, le uniche cose che dieriscono da quanto visto no ad adesso sono i menù e Solve Plot. Supponiamo di avere un'equazione parabolica. Aprendo il menù dunque Solve e Parameters, apparirà una schermata in cui sarà possibile impostare le seguenti opzioni: Time, deve essere un vettore che rappresenta gli istanti temporali per i quali si vuole calcolare la soluzione; u(t0), funzione che rappresenta la soluzione all'istante iniziale t0 , può essere una funzione di x e y, ad esempio sin(x + y); Relative Tolerance e Absolute Tolerance sono rispettivamente l'errore relativo e quello assoluto che si vuole commettere. Per un'equazione iperbolica il menù Solve si presenterà in maniera pres- soché identica, salvo per il fatto che si dovrà inserire anche il valore di u0 (t0 ). Sia per le equazioni paraboliche che per quelle iperboliche il menù Plot apparirà identico e, rispetto al caso ellittico ci sono due sole dierenze: si può scegliere l'istante temporale per cui si vuole disegnare il graco, e si può creare una animazione (sia 2D che 3D) dell'evolvere nel tempo della soluzione. Per scegliere il valore del tempo t per il quale si vuole disegnare la soluzione, sarà suciente aprire il menù a tendina time for plot che si trova in basso a destra e selezionare il tempo desiderato. Naturalmente si potranno scegliere tutte le opzioni a disposizione, come visto per il caso ellittico. Per generare un'animazione bidimensionale della soluzione si deve invece 18 selezionare pulsante Animation. Options Si può accedere a un menù di opzioni cliccando sul vicino alla casella Animation. Si potranno così impostare Fps) da visualizzare e per quante volte ripetere il lmato (Number of repeats). Nel caso fosse già stato creato un lmato, sarà possibile selezionare Replay, in maniera da visualizzare quello il numero di fotogrammi al secondo ( già esistente senza crearne uno nuovo (questa opzione è molto comoda in quanto, soprattutto con griglie tte e intervalli temporali molto lunghi, la generazione di un lmato può richiedere molto tempo e risorse). Per generare una animazione tridimensionale basta selezionare Height 3d e procedere come nel caso bidimensionale. Per vedere come applicare in pratica quanto detto n qui, aronterò ora il seguente problema: ∂2u − ∇u + u = 1 ∂t2 u=0 su δΩ (6.1) u(x, y, 0) = sin(x + y) u0 (x, y, 0) = x − y dove Ω è il dominio mostrato in gura 6.1, dato dall'unione delle due cir- conferenze C1 e C2 di raggio 1 e centri rispettivamente Cercherò la soluzione per gli istanti Dopo aver disegnato il dominio bordo. Clicchiamo sull'icona Boundary Condition. (−0.5, 0) e (0.5, 0). tn = n, n = 0, . . . , 5. Ω, andiamo a specicare le condizioni al δΩ, quindi apriamo il menù Boundary e Specify Nel nostro caso sono condizioni di Dirchlét, e basterà impostare i seguenti valori h=1, r=0. Per avere una rappresentazione dei bordi più pulita clicchiamo anche, sempre dal menù Boundary su Remove all subdomain borders. Andiamo ora a specicare il tipo di EDP che si vuole risolvere. menù PDE, apriamo PDE specication, selezioniamo Hyperbolic i seguenti valori per i coecienti: c=1, a=1, f=1, d=1. 19 Dal e inseriamo Figura 6.1: Griglia sul dominio Ω del problema (6.1) Prima di generare la griglia e ranarla, apriamo il menù Parameters Solve e in imponiamo le condizioni iniziali: u(t0)=sin(x+y), u'(t0)=x-y. Specichiamo inoltre l'intervallo temporale, nel nostro caso basta inserire la stringa [0 : 1 : 5], nella casella Time. Per la griglia lasciamo le impostazioni predenite, generiamo la griglia cliccando sul triangolo e la raniamo cliccando sull'icona con più triangolini. Mesh Per evitare problemi di malcondizionamento dal menù eettuiamo il jiggling per due volte. Possiamo quindi cliccare sull'uguale per far calcolare la soluzione approssimata. Per impostazione predenita apparirà disegnata una rappresentazione bidimensionale della soluzione all'istante temporale t5 . Vogliamo invece visualizzare un graco tridimensionale per ciascuno degli istanti mo il menù Plot e quindi Parameters. Selezioniamo Height 3d tn . e l'istante temporale per cui vogliamo visualizzare il graco (vedi gura 6.2). 20 Apria- Figura 6.2: Soluzione approssimata del problema (6.1) all'istante t=5 Volendo si può visualizzare l'andamento della soluzione rispetto al tempo, selezionando l'opzione Animation. Cambiamo le opzioni in 2 fps e visualizziamo il risultato cliccando su Plot. 7 Da GUI a CL Dopo aver spiegato dettagliatamente l'uso dell'interfaccia graca, vedremo come usare le funzioni del PDE Toolbox direttamente da linea di comando. Ogni operazione compiuta tramite GUI può essere eettuata anche da linea di comando. I vantaggi di risolvere una EDP da linea di comando sono essenzialmente tre: si può risolvere l'EDP anche su domini che sono rappresentabili in forma parmetrica, ma non con unioni e intersezioni nite di insiemi; si ha accesso a tutte le fasi di risoluzione numerica e non solo a quelle per cui c'è un apposito pulsante nell'interfaccia graca; nel caso di 21 sistemi di EDP, si può gestire il caso generico di dimensione n e non solo quello di due equazioni. L'uso della GUI e della CL non si escludono a vicenda l'uno con l'altro: è possibile infatti esportare le informazioni generate tramite GUI nell'area di lavoro di Matlab, ed elaborarle nella maniera desiderata da linea di comando. Si sarà infatti notato che in ognuno dei menù Plot, è presente un'opzione Export Draw, Boundary, PDE, Solve, relativa all'oggetto da esportare nell'area di lavoro. Per chiarire meglio l'utilità di questa possibilità, e cominciare a muovere i primi passi nella CL, risolverò ora l'equazione (6.1) servendomi delle opzioni di esportazione per il dominio, le condizioni al bordo e i coecienti della EDP. Tramite linea di comando genererò invece la griglia e lancerò il solver per ottenere la soluzione approssimata. Dopo aver aperto l'interfaccia graca, disegniamo il dominio Ω e, tramite i menù, inseriamo i parametri del nostro problema. A questo punto, da ciascuno dei menù Plot, Boundary e Pde, esportiamo le informazioni. Volendo è possibile esportare le informazioni con nomi diversi da quelli predeniti (semplicemente modicando i nomi nella schermata che si apre), ma per il momento lasciamo le cose come stanno. Dopo aver fatto tutto ciò è possibile chiudere la GUI. Andiamo adesso nell'area di lavoro di Matlab e notiamo che nell'elenco delle variabili sono comparse quelle che abbiamo esportato. In particolare avremo: gd, sf, ns relative alla descrizione del dominio: gd è una matrice che con- tiene informazioni relative alle regioni semplici che compongono il dominio, sf è una stringa che contiene la formula insiemistica che dice come unire e intersecare le regioni che compongono il dominio (nel nostro caso C1 e C2), ns è un matrice che in ogni colonna contiene i codici asci delle lettere con cui sono contrassegnate le regioni (nel nostro caso 67 è la C, 49 e 50 corrispondono ai numeri 1 e 2); 22 a,c,d,f sono i coecienti che appaiono nell'equazione dierenziale; g,b sono matrici che contengono le informazioni relative al bordo e alle condizioni su di esso. Eventuali altre variabili presenti, sono variabili di appoggio create dall'interfaccia graca e possono essere cancellate. Per risolvere (6.1) è a questo punto necessario generare la griglia e lanciare il solver adatto. Una panoramica delle funzioni disponibili, dei solver esistenti e della sintassi dei vari comandi, sarà oggetto delle prossime sezioni, per ora mi limito solamente a mostrare come, sfruttando le informazioni create tramite interfaccia graca, sia possibile utilizzare la CL per terminare il lavoro. Per generare la griglia digitiamo il comando [p,e,trian]=initmesh(g). Abbiamo bisogno di memorizzare le coordinate x e y dei nodi della griglia, per fare ciò diamo i seguenti comandi x=p(1,:) , y=p(2,:). Possiamo ora creare i vettori u0 e uprimo0 contenenti i valore di u(x, y, t0 ) e di u0 (x, y, t0 ) nei nodi. Nel nostro caso dobbiamo dare i seguenti comandi: u0=sin(x+y), uprimo0=x-y. Generiamo ora il vettore tempi, contenente i valori di t per cui si vuole conoscere la soluzione: tempi=[0:1:5]. Lanciando il solver hyperbolic è ora possibile calcolare la soluzione approssimata e memorizzarla in uapp digitando il seguente comando: uapp=hyperbolic(u0,uprimo0,tempi,b,p,e,trian,c,a,f,d); . Per avere ora un graco della soluzione all'istante ti è suciente digitare il comando pdeplot(p,e,t,'xydata',uapp(:,i),'zdata',uapp(:,i)) . 8 CL: descrizione del dominio A partire da questa sezione descriverò i comandi che è possibile lanciare direttamente da linea di comando per risolvere numericamente diversi tipi di 23 EDP. Riassumo brevemente, per chiarezza, i passi da seguire nell'arontare la risoluzione di una EDP: Ω; I disegnare il dominio I specicare le condizioni al bordo; I specicare il tipo di equazione che si vuole risolvere e inserire i coecienti; I creare la griglia; I ranare la griglia; I lanciare il solver per la risoluzione; I visualizzare i risultati. L'oggetto di questo paragrafo è il modo di indicare al PDE Toolbox su quale dominio si intende lavorare. Le informazioni sul dominio possono essere descritte in due modi: per mezzo di una matrice che rappresenta le regioni (ellissi e poligoni) che compongono il dominio, oppure per mezzo di una funzione che descrive una parametrizzazione del bordo del dominio. Il primo modo non aggiunge nulla di nuovo a ciò che si può ottenere esportando tali matrici per mezzo dell'interfaccia graca, e una descrizione dettagliata si ridurrebbe a fare un noioso elenco di regole per costruire tale matrice. Vista l'inutilità di tale metodo, io non lo tratterò in questa tesina. Chi fosse interessato può trovare informazioni nel manuale del Toolbox, nella parte dedicata al comando decsg. L'utilizzo di una funzione per la descrizione del proprio dominio è invece molto utile, in particolare in tutti quei casi in cui è impossibile decomporlo in unioni e intersezioni di poligoni ed ellissi, ma si dispone di una rappresentazione in forma parametrica del bordo. Prima di scrivere una funzione che descriva il bordo, è necessario studiare il dominio e fare alcune scelte. Innanzitutto il dominio deve essere limitato, per cui la curva deve essere chiusa. La curva non può autointersecarsi, in casi del genere si dovrà indicare a Matlab che il bordo è dato dall'unione di due o 24 più curve. Si deve assegnare un numero intero positivo alle regioni chiuse che compongono il dominio (utile soprattutto nel caso di domini non connessi), al complementare del dominio sarà assegnato il numero 0. Inoltre occorre decidere da quanti segmenti di bordo ( boundary segments ) è composto il bordo del dominio, questo serve per poter imporre condizioni diverse a diverse zone del bordo, (ad esempio u = sin(x·y) se x ≥ 0 e u = ex 2 +y 2 se x ≤ 0). I segmenti di bordo non devono essere mai meno di quattro, per evitare che le funzioni predenite del PDE Toolbox abbiano problemi. Bisogna inoltre riconoscere il verso di percorrenza del bordo indotto dalla parametrizzazione. Figura 8.1: Studio di In gura 8.1 è mostrata la regione Ω Ω il cui bordo è descritto da una lemniscata di equazioni parametriche x(t) = sin(t) · cos(t) t ∈ (0, 2π) (8.1) y(t) = sin(t) Come si può vedere ho assegnato il valore 1 alla regione descritta al variare di t da 0 a π , 2 a quella descritta da t che varia tra π e 2π , al complementare del dominio è assegnato il valore 0. Sempre in gura 8.1 è indicato il verso di percorrenza del bordo. Vado ora a spiegare come descrivere tale dominio per mezzo di una funzio- 25 ne. Per comodità considererò il mio dominio composto da quattro segmenti di bordo. Ecco il codice della funzione lemniscatag che permette al Matlab di capire su che dominio stiamo lavorando: function [x,y]=lemniscatag(bs,s) nbs=4 ; if nargin==0 x=nbs; return end dl=[0 pi/2 pi 1.5*pi; pi/2 pi 1.5*pi 2*pi; 1 1 0 0; 0 0 2 2]; if nargin==1 x=dl(:,bs); return end x=zeros(size(s)); y=zeros(size(s)); [m,n]=size(bs); if m==1 & n==1 bs=bs*ones(size(s)); elseif m~=size(s,1) | n~=size(s,2) error('bs deve essere uno scalare,... oppure avere la stessa dimensione di s'); end n=400; t=[0:(2*pi)/n:2*pi]; a=sin(t).*cos(t); b=sin(t); t=pdearcl(t,[a;b],s,0,2*pi); a=sin(t).*cos(t); b=sin(t); x(:)=a; y(:)=b; Una funzione che descrive il bordo di Ω, deve sempre prevedere in output le due variabili x ed y, e in ingresso le variabili bs e s. Alcune porzioni di codice di lemniscatag non servono alla descrizione del dominio, ma devono sempre essere presenti perché necessarie alle funzioni del Toolbox che utilizzeranno lemniscatag (o, più in generale, la funzione che descrive Ω). In particolare le parti di codice che devono essere sempre presenti e scritte nello stesso 26 modo sono: if nargin==0 x=nbs; return end if nargin==1 x=dl(:,bs); return end x=zeros(size(s)); y=zeros(size(s)); [m,n]=size(bs); if m==1 & n==1 bs=bs*ones(size(s)); elseif m~=size(s,1) | n~=size(s,2) error('bs deve essere uno scalare,... oppure avere la stessa dimensione di s'); end Tutto il resto dipende da δΩ e varierà in funzione ad esso, ma per un corretto funzionamento devono essere rispettate le posizioni all'interno del codice di eventuali comandi che si vorrà sostituire (ad esempio il valore di nbs deve sempre essere dichiarato prima di if nargin==0 ). Alla variabile nbs all'inizio del programma va assegnato il numero di segmenti di bordo, nel nostro esempio 4. Quello che resta da capire è come creare la matrice dl, e come eettuare in maniera corretta la parametrizzazione. Nella variabile dl dell'esempio è memorizzata la matrice: 0 π 2 dl = 1 0 π 2 π π 3 2π 1 0 0 2 3 2π 2π 0 2 Ogni colonna di dl si riferisce a un segmento di bordo. Nella prima riga si mette il valore del parametro t da cui inizia il segmento, nella seconda riga 27 il valore di t che segna la ne del segmento. Nella terza riga si deve mettere il numero della regione che si trova a sinistra del segmento, percorrendolo nel verso indotto dalla parametrizzazione. Nella quarta riga il numero della regione che si trova a destra. Ad esempio, la terza colonna di dl ci dice che il terzo segmento di bordo è quello che viene descritto quando il parametro t varia tra (π, 32 π), che alla sua sinistra si trova la regione 0 e alla sua destra la regione 2. In generale la matrice dl deve essere costruita seguendo queste direttive. δΩ, Per quanto riguarda la parametrizzazione di divide uniformemente l'intervallo su cui varia elevato di parti, nel nostro caso in n = 400. dei nodi risultanti dalla suddivisione ( t come prima cosa si sud- in un numero abbastanza In t si memorizzano i valori t=[0:2*pi/n:2*pi] ). Nelle due variabili di appoggio a e b si memorizzano i valori delle coordinate della curva corrispondenti ai valori dei nodi memorizzati in t ( Il comando t=pdearcl(t,[a;b],s,0,2*pi); a=sin(t).*cos(t); b=sin(t) ). serve ad ottenere una suddivisione dell'intervallo che non è più uniforme, ma dipende dal parametro s che viene passato alla funzione. Anche questo comando è necessario perché tutte le funzioni del toolbox gestiscano bene lemniscatag, in generale bisognerà modicare gli ultimi due parametri passati a pdearcl, che sono l'estremo sinistro e quello destro dell'intervallo su cui varia t. Dopodiché si ricalcolano a e b nei nodi così ottenuti, e si possono nalmente assegnare tali valori ad x e ad y. I : nei comandi x(:)=a; y(:)=b;, servono per dire a Matlab di mantenere per x ed y la stessa struttura delle variabili a e b, anche questo è un accorgimento essenziale perché tutte le cose funzionino bene. Per visualizzare ora il dominio appena creato è suciente utilizzare il comando pdegplot('lemniscatag'). Se si dovesse incorrere in qualche errore, signica che la funzione che descrive il bordo non è stata costruita bene! Una volta visualizzata la gura, si possono usare i soliti comandi del Matlab per modicare i graci (scegliere la lunghezza degli assi, impostare la stessa 28 scala, inserire una griglia etc. etc.). 9 CL: condizioni al bordo Dopo aver visto come gestire il dominio, vediamo ora come specicare le condizioni al bordo. Per fare ciò è necessario creare una matrice che abbia una colonna per ogni segmento di bordo che costituisce δΩ. In questa tesina tratterò solamente il caso di una EDP, e non il caso di sistemi. Comunque, dopo aver capito il principio di base, non è dicile estendere quanto detto al caso dei sistemi di EDP. Per una descrizione dettagliata della costruzione di tale matrice, si guardi quanto riportato nel manuale del Toolbox sotto la voce assemb . Per il caso scalare, il PDE Toolbox è in grado di trattare condizioni al bordo dei due seguenti tipi: − → n · (c∇u) + qu = g (9.1) hu = r (9.2) La (9.1) è detta condizione di Neumann generalizzata (o anche condizione di Robin), la (9.2) è nota come condizione di Dirichlét. Per il PDE Toolbox q, g, h ed r possono essere funzioni che contengano le variabili x,y, ux e uy (derivate parziali della soluzione rispetto ad x ed y rispettivamente). Elenco ora le regole da seguire per la costruzione della matrice che contiene le informazioni sulle condizioni al bordo. Come anticipato la matrice b delle condizioni al bordo, deve avere tante colonne quanti sono i segmen- ti di bordo che costituiscono il dominio. La prima colonna di b si riferisce alle condizioni al bordo sul primo segmento di bordo, la seconda colonna si riferisce al secondo segmento e così via. La prima riga di ogni colonna deve contenere la dimensione del sistema (nel caso scalare che trattiamo noi, sarà sempre uguale ad 1), la seconda riga il numero di condizioni di Dirichlèt da imporre (nel caso scalare, conterrà 0 per Neumann, 1 per Dirichlèt), la 29 terza riga contiene il numero di caratteri che compongono l'espressione di q, la quarta riga contiene il numero di caratteri che compongono l'espressione di g, la quinta il numero di caratteri che compongono l'espressione sesta il numero di caratteri che compongono l'espressione di r. h, e la Nelle righe successive vanno scritti i codici ascii corrispondenti ai caratteri usati per le espressioni di q, g, h e r. Per chiarire meglio quanto detto, supponiamo di voler imporre sulla lemniscata costruita precedentemente, la condizione al bordo di Dirichlét u = 2 ∗ x. La matrice b sarà allora: b= 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 48 48 48 48 48 48 48 48 49 49 49 49 50 50 50 50 42 42 42 42 120 120 120 120 Notiamo innanzitutto che le colonne sono tutte uguali in quanto abbiamo imposto la stessa condizione al bordo su tutti i segmenti, volendo si sarebbero potute imporre condizioni al bordo di tipo diverso su ciascuno dei diversi segmenti. Soermiamo ora la nostra attenzione su una qualsiasi delle colonne. La prima riga contiene 1, la dimensione del sistema. La seconda riga contiene il numero di condizioni di Dirichlèt che stiamo andando a imporre, cioè 1. Anche se in una condizione di Dirichlét non appaiono i coecienti q e g, nella terza e quarta riga abbiamo comunque messo il valore 1, perché 30 dovremo comunque specicare che q = 0, g = 0 (e necessiteremo quindi di un carattere). Nella quinta riga abbiamo detto che l'espressione di mata da un carattere, e nella sesta che l'espressione di r h è for- è formata da tre caratteri. Nella settima e ottava riga andiamo a specicare i valori per g, q e ma anziché inserire il valore come numero, abbiamo inserito il codice ascii corrispondente al numero 0, cioè 48. Analogamente nella nona riga abbiamo inserito il codice ascii corrispondente a 1 (il valore di h) ossia 49. Nelle tre righe successive, 50 è il codice ascii che corrisponde a 2, 42 è il codice ascii per * e 120 quello per x, ossia abbiamo inserito in colonna i codici ascii dei caratteri che formano l'espressione di r. Nel caso di una condizione di tipo Neumann, dopo aver inserito il numero di caratteri relativi a q e g, si può passare a scrivere la loro espressione tramite codici ascii, saltando le righe relative ad h ed r. A titolo di esempio, fornisco qui di seguito la matrice b1 che descrive, la condizione di Neumann − → n · (c∇u) = sin(xy), lemniscata introdotta nel paragrafo precedente. b1 = 1 1 1 0 0 0 1 1 1 9 9 9 48 48 48 115 115 115 105 105 105 110 110 110 40 40 40 120 120 120 46 46 46 42 42 42 121 121 121 41 41 31 41 1 0 1 9 48 115 105 110 40 120 46 42 121 41 sempre sulla Vista la sua utilità, in appendice è riportata la tabella dei codici ascii. 10 CL: Risoluzione di una EDP Dopo aver visto come specicare il dominio e imporre le condizioni al bordo, non ci resta che vedere come creare una griglia, ranarla e quali sono i solver da utilizzare per i diversi tipi di EDP. Una griglia è denita per mezzo di tre variabili che chiameremo La variabile p contiene le coordinate dei nodi della griglia, formazioni sui bordi dei triangoli, mentre t e p,e,t. contiene in- contiene le etichette dei trian- goli, vale a dire un numero che individua in maniera univoca il triangolo in questione. Queste tre variabili vengono create per mezzo del comando initmesh, ad esempio per creare una griglia per la regione delimitata dalla lemniscata delle sezioni precedenti, sarà suciente scrivere il comando [p,e,t]=initmesh('lemniscatag');. Se dovessero esserci degli errori, signi- ca che non è scritta bene la funzione che descrive δΩ. Per visualizzare la gri- pdemesh, e la sintassi è la seguente:pdemesh(p,e,t). Al comando initmesh si possono passare anche degli argomenti opzionali, glia si usa il comando analogamente a quanto si era visto nel cado della GUI, ad esempio la massima lunghezza dei lati dei triangoli, la velocità di crescita della griglia, se eettuare o meno il jiggling. L'uso di initmesh con argomenti opzionali va fatto con questa sintassi: [p,e,t]=initmesh('lemniscatag','nome-argomento',valoreargomento...);. Gli argomenti possibili sono: Hmax, rappresenta la lunghezza massima dei lati, il valore deve essere un numero; Hgrad è la velocità di crescita della griglia, il valore deve essere un numero compreso tra 1 e 2, ma si può lasciare decidere tale valore a Matlab usando l'opzione estimate; Jiggle per eettuare o meno il jiggling. 32 I possibili valori sono o,mean, minimum e hanno lo stesso signicato esposto per la GUI; JigglIter indica quante volte si vuole eseguire il jiggling, il valore deve essere un intero. Ecco un possibile modo di creare una griglia [p,e,t]=initmesh('lemniscatag','Hmax','estimate','Jiggle','minimum,'JiggleIter',5); Una volta generata una griglia si può eettuare il jiggling con il comando jigglemesh: p=jigglemesh(p,e,t,'Opt',valore,'Iter',valore); dove il valore per Opt può esere o, minimum, mean e quello per Iter deve essere un valore numerico. Per ranare la griglia si usa il seguente comando [p,e,t]=renemesh('lemniscatag',p,e,t,'opzione'); dove opzione può essere regular o longest, con il signicato già spiegato per la GUI. Per concludere questa sezione bisogna vedere i solver utilizzabili per le di- assempde e adaptmesh; per equazioni di tipo iperbolico c'è il solver hyperbolic e per equazioni di tipo parabolico il solver parabolic. verse EDP. Per equazioni di tipo ellittico sono a disposizione i solver Cominciamo col considerare il problema ellittico −∆u = 1 dove Ω u=0 in su Ω (10.1) δΩ è la regione delimitata dalla lemniscata. Memorizziamo le informa- zioni sulla condizione al bordo nella variabile b2, seguendo le direttive della sezione precedente. Ricordiamo la forma (2.1) per EDP ellittiche, signica che i coecienti dell'equazione (10.1) sono c = 1, a = 0, f = 1. Il solver assempde, risolve il problema con il metodo degli elementi niti; usando il comando uell1=assempde(b2,p,e,t,1,0,1) si otterrà una variabile uell1 che contiene i valori della soluzione approssimata. In generale la sintassi di assempde è 33 u=assempde(b,p,e,t,c,a,f) dove b è la matrice delle condizioni al bordo, p,e,t sono le variabili ottenute dalla triangolazione della grglia, c,a,f sono i coecienti della EDP. La funzione assempde, può essere richiamata inoltre con sintassi diverse per ottenere ulteriori informazioni sulla EDP, quale ad esempio la matrice di rigidità generata per ottenere la soluzione. La descrizione completa di tutti i possibili modi di usare assempde, esula dallo scopo di questa tesina, ma tutte le informazioni sono disponibili sul manuale del Toolbox. Il solver adaptmesh lancia più volte il solver assempde, andando even- tualmente a inttire la griglia in quei triangoli per cui non si sia raggiunta la tolleranza voluta. Si può risolvere il problema con il comando [uell2,pell2,eell2,tell2]=adaptmesh('lemniscatag',b2,1,0,1); In generale la sintassi da utilizzare è [u,p,e,t]=adaptmesh(g,b,c,a,f,opzioni), dove g è la funzione che descrive il dominio, o la matrice esportata da GUI, b è la matrice delle condizioni al bordo, c,a,f sono i coecienti della EDP e le principali opzioni sono elencate qui di seguito (per un elenco completo si rimanda al manuale): Ngen, indica il numero massimo di ranamenti della griglia; Rmethod, per scegliere il metodo di ranamento dei triangoli, può assu- mere i valori longest o regular con il signicato già spiegato; Nonlin, per la risoluzione di EDP ellittiche non lineari, può avere valore on oppure o. Si noti come nelle variabili pell2,eell2,tell2 siano stati memorizzati i dati relativi alla griglia creata dal solver. I solver parabolic e hyperbolic hanno sintassi analoga. Per quanto riguarda parabolic è u=parabolic(u0,tlist,b,p,e,t,c,a,f,d,rtol,atol); per hyperbolic invece è u=hyperbolic(u0,ut0,tlist,b,p,e,t,c,a,f,d,rtol,atol); dove u0 e ut0 sono le funzioni che descrivono le condizioni iniziali, tlist è il vettore che contiene i tempi per i quali si vuole conoscere la soluzione approssimata, b è 34 la matrice delle condizioni al bordo, p,e,t sono le variabili relative alla griglia, c,a,f,d sono i coecienti delle EDP, rtol indica la tolleranza relativa e atol la tolleranza assoluta. Ad esempio, per risolvere la EDP (6.1) sul dominio la lemniscata per i tempi tn = n, n = 0 . . . 5, Ω il cui bordo è si deve scrivere il seguente comando: uipe=hyperbolic('sin(x+y)','x-y',[0:1:5],b2,p,e,t,1,1,1,1); Nella prossima sezione vedremo come visualizzare gracamente i risultati ottenuti e, nel caso di EDP iperboliche e paraboliche, come creare un lmato. 11 CL: visualizzazione dei risultati Nella sezione precedente abbiamo trovato le soluzioni approssimate per un problema ellittico e per un problema iperbolico. Non ci resta che vedere come visualizzare tali risultati. Vogliamo innanzitutto visualizzare le soluzioni approssimate del problema ellittico memorizzate nelle variabili uell1 e uell2. Per disegnare il graco 3d della funzione, senza specicare alcuna opzione si può lanciare il comando pdesurf(p,t,uell1). Se invece si è interessati a poter disporre di più opzio- pdeplot. La sintassi generale di tale comando è pdeplot(p,e,t,opzione,valoreopzione,...). Vi sono moltissime opzioni ni si dovrà usare il comando disponibili, per un elenco completo si rimanda al manuale, ma quelle usate più di frequente sono: xydata, per scegliere quali valori rappresentare nel graco nel caso di un graco bidimensionale; zdata, per scegliere quale valore rappresentare sull'asse delle z; mesh, per mostrare o meno la griglia, si possono scegliere i due valori on e o; xygrid serve se si vuole convertire la griglia triangolare creata in una griglia 35 rettangolare, è utile quando la griglia è formata di molti rettangoli e il tempo di creazione del graco risulta estremamente lungo; se si sceglie o si utilizza la griglia triangolare, se si sceglie on si userà una griglia rettangolare; owdata serve per scegliere i dati per rappresentare il usso del campo vettoriale, tipicamente come valore si sceglie -grad(u), per indicare la direzione opposta al gradiente; owstyle può assumere il valore o, per non visualizzare il usso del campo vettoriale, arrow per visualizzarlo con delle frecce; contour può assumere i valori on e o, serve a mostrare o meno le curve di livello. Ad esempio, visualizziamo il graco 3d della soluzione approssimata uell1, sulla griglia triangolare, e mostrando la griglia lanciando il seguente comando: pdeplot(p,e,t,'xydata',uell1,'zdata',uell1,'mesh','on'); Per quanto riguarda la soluzione del problema iperbolico, la variabile uipe è una matrice che contiene in ogni colonna la soluzione per un certo istante t, la prima colonna contiene la soluzione all'istante t1 e così via. t0 , la seconda all'istante Se si vuole visualizzare la soluzione al tempo ti−1 , sarà suciente lanciare il comando pdeplot specicandogli di usare come dati la colonna esempio per visualizzare la soluzione all'istante t3 = 3, i−ma. Ad si userà il comando nel seguente modo: pdeplot(p,e,t,'xydata',uipe(:,4),'zdata',uipe(:,4),'xygrid','o ','mesh','on'); Per creare invece un'animazione che mostra la soluzione al variare del tempo, si dovrà invece creare uno script, simile al seguente: umax=max(max(uipe)); umin=min(min(uipe)); [m,n]=size(uipe); for i=1:n pdeplot(p,e,t,'xydata',uipe(:,i),'zdata',uipe(:,i),... 36 'mesh','off','xygrid','off','colorbar','off','zstyle','continuous'); axis([-1 1 -1 1 umin umax]); caxis([umin umax]); Mipe(:,i)=getframe; end Questo script crea semplicemente il graco per ogni istante t(i−1) e tramite il comando getframe, memorizza i dati nella colonna i-ma della matrice Mipe. Per visualizzare il lmato così creato è suciente digitare il comando vie(Mipe,10). In generale mo- movie(M,n,fps), serve per visualizzare n volte il lmato memorizzato in M, riproducendo fps fotogrammi al secondo. A questo punto si dispone di tutte le informazioni necessarie per poter risolvere equazioni di tipo ellittico, parabolico e iperbolico usando i parametri voluti e visualizzare i risultati in più modi per avere un'idea dell'andamento della soluzione. 12 CL: spunti per approfondimenti Il PDE Toolbox dispone di un numero così grande di funzioni, che è impossibile, oltre che fuori luogo ai ni di questa tesina, riportarne un elenco completo e una descrizione dettagliata di ciascuna. La maggior parte di queste funzioni nasce, inoltre, con lo scopo di essere utilizzata all'interno delle funzioni più importanti che abbiamo visto nel corso di queste pagine. Ve ne sono però alcune che potrebbero rivelarsi interessanti e utili per approfondire il discorso qui presentato. In questa sezione, accennerò solamente a quali sono queste funzioni, rimandando al manuale di Matlab per ulteriori approfondimenti. Innanzitutto, per l'equazione di Poisson −∆u = 1 in Ω u=0 su δΩ dove Ω è una regione di R2 , (12.1) si dispone del solver poisolv, che sfrutta la particolare forma del problema per risolverlo in maniera più accurata e 37 con un minor costo computazionale, a patto però di lavorare su una griglia rettangolare. Per lavorare su griglie rettangolari può venire in aiuto il comando initmesh, che serve a convertire le griglie triangolari create da tri2grid, in griglie rettangolari gestibili da Matlab. Se si vuole conoscere il usso e il gradiente delle soluzioni approssimate, pdecgrad e pdegrad. Per equazioni ellittiche è a disposizione pdejmps che, con una stima a sono a disposizione rispettivamente i comandi priori, calcola una stima per l'errore su ogni triangolo della griglia, le funzioni pdeadgsc e pdeadworst servono invece per selezionare i triagoli su cui non si è raggiunta suciente accuratezza. 13 Due semplici problemi Per concludere questa tesina, aronterò ora lo studio di un problema ellittico e di un problema parabolico. Per entrambi i problemi L mostrato in gura 13.1 e denito da lato 2 con vertice inferiore a sinistra in Q1 T QC 2, (−1; −1), Ω dove mentre sarà il dominio a Q1 Q2 è il quadrato di è il quadrato di lato 1 e con vertice inferiore a sinistra nell'origine. L'interesse di un tale dominio ha ragioni perlopiù storiche. Il suo utilizzo si diuse largamente durante i primi tentativi (1950 ca.) di calcolare numericamente la soluzione di una EDP. La presenza della rientranza nell'origine aveva infatti un duplice scopo: da un lato simulare bruschi cambiamenti di direzione del bordo del dominio, cosa che capita spesso nelle applicazioni reali, dall'altro studiare la convergenza dei vari metodi in tali situazioni, permettendo di capirne i limiti e studiare dierenti approcci al problema. Inoltre questo è il più semplice dominio sul quale la soluzione dell'equazione delle onde non è esprimibile analiticamente. Il lettore più attento avrà notato che il simbolo di Matlab riproduce una funzione denita su un dominio a L: non è un caso che il creatore di Matlab Cleve Moler, ab- 38 Figura 13.1: Dominio a L bia a lungo studiato la risoluzione numerica di EDP su domini a L, e che la sua tesi di dottorato vertesse proprio su questo argomento! Nel corso degli anni lo studio di tecniche sempre più ranate ha contribuito a risolvere i problemi emersi con i primi metodi, e oggi il Matlab dispone di funzioni che si comportano bene su domini di questa forma. Dopo questa breve introduzione sulla scelta del dominio cominciamo col risolvere il problema ellittico: − ∆u + 2u = 0 u = ex+y su in Ω (13.1) δΩ Data l'estrema semplicità del dominio conviene lavorare tramite interfaccia graca. Dopo aver aperto pdetool, disegno il dominio Ω e imposto i valori dei coecienti della EDP e i valori al bordo nel modo descritto nelle sezioni precedenti. Nel menù Solve scelgo di usare l' adaptive mode, impostando il numero massimo dei triangoli a 40000, il numero massimo dei ranamenti 39 Figura 13.2: Soluzione approssimata di (13.1) a 100 e di volere una tolleranza relativa di di ranamento a 10−4 . Lascio invariato il metodo longest. Posso nalmente lanciare il solver per la risoluzione. Dopo qualche secondo apparirà una rappresentazione bidimensionale della soluzione. Prima di procedere col disegnare il graco tridimensionale, andiamo nell'area di lavoro di Matlab: qui appariranno dei messaggi lasciati dal solver, che ci informa del termine della strategia adattativa e che sono stati generati circa 1900 triangoli (il valore varia un po' di volta in volta, a seconda di come il Matlab genera la griglia di partenza). Visualizziamo ora il graco tridimensionale della soluzione e facciamo disegnare la griglia insieme ad esso (gura 13.2. È interessante notare come la griglia si inttisce nelle zone in cui la funzione varia maggiormente (in particolare nelle vicinanze dei vertici (0,1) e (1,0)), mentre rimane più rada nella zona in cui la funzione è più piatta (vicino a (-1,-1)). 40 Risolvo ora lo stesso problema tramite linea di comando, ranando tutti i triangoli della griglia no ad arrivare alla tolleranza desiderata. Innanzitutto esporto le informazioni relative al dominio, al bordo e ai coecienti dell'EDP. Dopodiché creo il seguente script: [p,e,t]=initmesh(g); error=[]; err=1; while err>1e-4 [p,e,t]=refinemesh(g,p,e,t,longest'); p=jigglemesh(p,e,t); u=assempde(b,p,e,t,c,a,f); err=pdejmps(p,t,1,2,0,u,1,1,1); % N.B. i valori 1,2,0 nel comando precedente, corrispondono ai % valori dei coefficienti c,a,f: per la funzione assempde % devono infatti essere memorizzati come caratteri, mentre % pdejmps vuole che siano valori numerici. error=[error err]; end Tale script non fa altro che ranare la griglia e risolvere numericamente il problema, no a quando la stima a posteriori dell'errore calcolata da non risulta minore di pdejmps 10−4 . Dopo averlo eseguito, il numero di colonne della variabile t corrisponde al numero di triangoli della griglia nale. In particolare per il nostro problema il numero dei triangoli sarà approssimativamente di 49000 e si nota un aumento del tempo di esecuzione. Questo fatto mette in luce l'importanza dell'algoritmo adattativo adaptmesh, che consente di risolvere, a parità di precisione, uno stesso problema in maniera più intelligente ed eciente. 41 Figura 13.3: Griglia adattativa (sopra) e griglia non adattativa (sotto) 42 Figura 13.4: Soluzione dell'EDP (13.2) all'istante t=1 Andiamo ora a risolvere il problema parabolico: ∂u − ∆u + 2u = 0.0001 in Ω ∂t u(x, y, 0) = 0 in Ω u(x, y, t) = 0 sui lati di lunghezza 2 u(x, y, t) = 10 sui lati di lunghezza 1 con (13.2) t ∈ (0, 1). Anche per questo problema è conveniente usare l'interfaccia graca: pro- cedendo dunque nella maniera illustrata nelle precedenti sezioni, è facile impostare tutti i parametri e risolverlo numericamente. Per la risoluzione di questa EDP ho adottato un passo temporale ∆t = 0.01. La cosa interessante in questo caso è notare come, pur essendo partiti da una discontinuità iniziale delle condizioni al bordo, la soluzione si regolarizzi al tendere verso la congurazione di equilibrio (vedi gura 13.4). Non ci si deve invece lasciare 43 ingannare dall'impressione che all'istante t = 0, il Matlab non consideri le condizioni al bordo e la condizione iniziale da noi impostata. Il Matlab, infatti, colora gradatamente i triangoli in base ai valori calcolati nei nodi della griglia, e questo è il motivo per cui, usando una griglia con pochi nodi, può sembrare che la soluzione sia diversa da 0 in Ω e non valga quanto deve valere sui bordi. In gura 13.5, è mostrata una rappresentazione bidimensionale di u all'istante t=0 ottenuta con una griglia con pochi triangoli (sopra) e con una griglia più tta (sotto). 44 Figura 13.5: Come cambia la rappresentazione delle condizioni iniziali in base alla griglia. 45 A Tabella dei codici Ascii Figura A.1: Tabella dei codici Ascii 46