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