Algoritmi Numerici: Gabriela Ciuprina
Algoritmi Numerici: Gabriela Ciuprina
Algoritmi numerici
- teme laborator -
2009
Cuprins
i
Capitolul 5
Vom reaminti câteva rezultate pentru cazul aproximării derivatelor unei funcţii unidi-
mensionale f : [a, b] → IR.
1
2 Capitolul 5. Derivarea numerică. Metoda diferenţelor finite.
Considerând xi punctele diviziunii intervalului [a, b], vom folosi următoarele notaţii
∂f 2 ∂2f
fi = f (xi ), Dfi = (xi ), D fi = (xi ). (5.1)
∂x ∂x2
fi+1 − fi
(progresivă) Dfi = + O(h) (5.2)
h
fi − fi−1
(regresivă) Dfi = + O(h) (5.3)
h
fi+1 − fi−1
(centrată) Dfi = + O(h2 ) (5.4)
2h
−3fi + 4fi+1 − fi+2
(progresivă) Dfi = + O(h2 ) (5.5)
2h
fi−2 − 4fi−1 + 3fi
(regresivă) Dfi = + O(h2 ) (5.6)
2h
fi+1 − 2fi + fi−1
(centrată) D2 fi = + O(h) (5.7)
h2
Exerciţiul 5.1:
Pornind de la polinomul de interpolare de grad doi, ce trece prin punctele (xi−1 , fi−1 ),
(xi , fi ), (xi+1 , fi+1 ) deduceţi una din formulele de derivare de mai sus
Exerciţiul 5.2:
a) Scrieţi ı̂ntr-un fişier următorul script:
clear all;
% calculeaza derivata numerica a functiei sinus in pct x0
x0 = pi/4;
h = pi/10; % pasul de derivare
b) Comentaţi valorile obţinute pentru cele trei formule. Schimbaţi pasul de derivare şi
comentaţi rezultatele.
Este foarte probabil ca ı̂n acest moment să fiţi tentaţi să credeţi că, cu cât pasul de
derivare este mai mic, cu atât eroarea e mai mică. Pentru a vedea dacă această afirmaţie
este adevărată, este util să reprezentaţi grafic eroarea ı̂n funcţie de pasul de derivare.
Exerciţiul 5.3:
Scrieţi un script care să permită:
a) Reprezentarea grafică a erorii formulei de derivare progresivă de ordinul 1, ı̂n funcţie de
pasul de derivare. Pentru un pas h cuprins ı̂ntre 1e-10 şi 1e-5 trebuie să obţineţi un grafic
similar celui din partea stângă a fig. 5.1. Acest grafic a fost trasat folosind 1e5 valori.
Repetaţi experienţa pentru derivarea regresivă de ordinul 1. Comentaţi rezultatul.
c) Reprezentarea grafică a erorii formulei de derivare centrată de ordinul 2, ı̂n funcţie de
pasul de derivare. Pentru un pas h cuprins ı̂ntre 1e-8 şi 1e-3 trebuie să obţineţi un grafic
similar celui din partea dreaptă a fig. 5.1. Acest grafic a fost trasat folosind 1e5 valori.
−5 −6
10 10
Eroarea absoluta a derivatei progresive de ord 1
−7
−9
−7 10
10
−10
10
−8
10 −11
10
−12
10
−9
10
−13
10
−10 −14
10 10
−10 −9 −8 −7 −6 −5 −8 −7 −6 −5 −4 −3
10 10 10 10 10 10 10 10 10 10 10 10
Pasul de derivare h Pasul de derivare h
Figura 5.1: Eroarea ı̂n funcţie de pasul de derivare pentru formula de derivare progresivă
de ordinul 1 (stânga) şi formula de derivare centrată de ordinul 2 (dreapta).
Zona de instabilităţi numerice, care apare pentru paşi mai mici decât o anumită valoare,
se datorează erorilor de rotunjire care devin mai mari decât erorile de trunchiere. Pasul
de la care ı̂ncep să predomine erorile de trunchiere se numeşte pas optim de derivare
numerică. Pasul optim nu este pasul pentru care eroarea este minimă. După cum se
poate observa, erori mai mici se pot obţine pentru paşi aflaţi ı̂n zona de instabilitate.
Totuşi lucrul ı̂n această zonă nu se recomandă. Este de preferat ca h să fie ı̂n zona ı̂n care
predomină erorile de trunchiere, zonă ı̂n care erorile de trunchiere se pot estima.
Exerciţiul 5.4:
Inspectând graficele obţinute
a) comparaţi paşii optimi de derivare numerică pentru cele trei formule pe care le-aţi
folosit până acum.
b) verificaţi că eroarea de trunchiere la formulele progresivă şi regresivă de ordinul 1 este
O(h) iar la formula centrată de ordinul 2 este O(h2 ).
Derivata centrată (5.4) oferă o acurateţe mai bună decât formulele progresivă, regresivă
de ordinul 1 (formulele (5.2) şi (5.3)). O comparaţie numerică este sugerată ı̂n exerciţiul
următor.
Exerciţiul 5.5:
Reprezentaţi pe acelaşi grafic eroarea derivatei numerice progresive de ordinul 1 şi centrate
de ordinul 2 pentru paşi cuprinşi ı̂ntre 1e-8 şi 1e-3. Trebuie să obţineţi un grafic similar
celui din figura 5.2.
−2
10
−4 Progresiva de ord. 1
10
−6
10
−8
10
−10
10
−12
10
−14
10
−8 −7 −6 −5 −4 −3
10 10 10 10 10 10
Pasul de derivare h
Aplicarea metodei diferenţelor finite pentru rezolvarea oricărei ecuaţii diferenţiale pre-
supune realizarea următorilor paşi:
• Pasul 4: Calculul altor valori, ı̂n afara celor din noduri, se face prin interpolare.
Se obişnuieşte să se spună că paşii 1 şi 2 reprezintă etapa de preprocesare, pasul 3
reprezintă rezolvarea, iar pasul 4 postprocesarea.
Cel mai simplu exemplu pe care ni-l putem imagina este cel care ne conduce matematic
la o ecuaţie diferenţială ordinară de ordinul 1. Vom considera un condensator de capacitate
C = 4µF, iniţial descărcat, care se ı̂ncarcă de la o sursă de tensiune continuă E = 20 mV
printr-un rezistor de rezistenţă R = 10 Ω.
Înlocuind ı̂n această relaţie dependenţa dintre tensiunea şi curentul prin condensator
du(t)
i(t) = C , (5.13)
dt
rezultă ecuaţia diferenţială de ordinul unu, satisfăcută de u:
du(t)
RC + u(t) = E. (5.14)
dt
Soluţia acestei ecuaţii este unică deoarece se specifică starea iniţială a condensatorului:
u(0) = u0 = 0. (5.15)
Avantajul acestui exemplu este acela că are o soluţie analitică, uşor de găsit. Vom
reaminti modul de calcul al acesteia.
unde uo (t) este soluţia ecuaţiei ”omogene” (cum zic matematicienii) adică a ecuaţiei
diferenţiale cu termen liber nul:
duo (t)
RC + uo (t) = 0. (5.17)
dt
Soluţia ecuaţiei omogene este
uo (t) = A exp(xt), (5.18)
unde x este soluţia ecuaţiei caracteristice
RCx + 1 = 0. (5.19)
τ = RC, (5.20)
mărime care se numeşte constanta de timp a circuitului, rezultă soluţia ecuaţiei omogene
Mărimea up este o soluţie particulară, de forma termenului liber al ecuaţiei, deci o con-
stantă. Să notăm această constantă cu B. Soluţia particulară (constantă) trebuie să
satisfacă ecuaţia (5.14), deci
dB
RC + B = E, (5.22)
dt
de unde rezultă
B=E (5.23)
deoarece derivata unei constante este nulă. Soluţia generală a ecuaţiei este ı̂n consecinţă
A = u0 − E. (5.25)
Exerciţiul 5.6:
a) Care este valorea spre care tinde tensiunea pe condensator?
b) Scrieţi un script Matlab main RC.m cu următorul conţinut
clear all;
% rezolva cu MDF un circuit RC simplu
E = 20e-3;
R = 10;
C = 4e-6;
u_initial = 0;
tau = R*C; % constanta de timp
tmax = 10*tau; % timp maxim de simulare
Vom rezolva acum ecuaţia diferenţială cu diferite scheme de derivare numerică. Ecuaţia
(5.14) o rescriem ca
du(t) 1 1
+ u(t) = E. (5.27)
dt τ τ
Vom urmări calculul numeric ı̂n intervalul de timp [0, tmax ] unde tmax = 10τ ı̂ntr-o
reţea echidistantă de N puncte tk , unde pasul de discretizare este
Vom nota valorile discrete obţinute prin rezolvare numerică cu uk . Ele vor fi aproximaţii
ale mărimii reale u.
uk ≈ u(tk ). (5.29)
Vom discretiza ecuaţia (5.27) prin scrierea ei ı̂n momentul de timp tk şi folosind pentru
derivată o formulă de diferenţe finite progresive de ordinul 1:
uk+1 − uk 1 1
+ uk = E, (5.30)
h τ τ
de unde
h h
uk+1 − uk + uk = E. (5.31)
τ τ
Se observă că mărimea uk+1 poate fi calculată explicit cu formula
h h
uk+1 = uk 1 − + E. (5.32)
τ τ
Această formulă este extrem de uşor de implementat.
Exerciţiul 5.7:
a) Completaţi scriptul de mai sus cu
function u = mdf_circuitRC(u_initial,N,h,tau,E,metoda)
% rezolva ecuatia diferentiala du/dt + 1/tau u = 1/tau E cu
% metoda diferentelof finite
u = zeros(N,1);
u(1) = u_initial;
switch metoda
case ’progresiv1’
% calcul explicit
for k = 1:N-1
................. completati...........
end
otherwise
error(’Metoda de discretizare necunoscuta’);
end
Exerciţiul 5.8:
a) Completaţi funcţia mdf circuitRC.m cu cazul ”regresiv1”:
case ’regresiv1’
% calcul explicit
for k = ..............completati
u(k) = ...........completati
end
ur = mdf_circuitRC(u_initial,N,h,tau,E,’regresiv1’);
Vom discretiza ecuaţia (5.27) prin scrierea ei ı̂n momentul de timp tk şi folosind pentru
derivată o formulă de diferenţe finite centrate de ordinul 2 dată de relaţia (5.4):
uk+1 − uk−1 1 1
+ uk = E, (5.36)
2h τ τ
de unde
2h 2h
−uk−1 + uk + uk+1 = E. (5.37)
τ τ
Se observă că mărimea uk nu mai poate fi calculată explicit. Relaţia (5.37) poate fi scrisă
pentru k = 2, . . . , N − 1 şi reprezintă N − 2 ecuaţii cu N necunoscute. Pentru a obţine
2
Ecuaţia generală este dy/dt = f (t, y) unde f este o funcţie ı̂n general neliniară. Folosirea derivatei
regresive pentru f conduce la o relaţie implicită pentru calculul lui uk , relaţie ce reprezintă o ecuaţie
neliniară. În cazul particular studiat, f este liniară şi de aceea soluţia se poate calcula explicit.
un sistem bine formulat, trebuie să adăugăm ı̂ncă două relaţii. Acestea sunt relaţiile la
capete. La t = 0 vom impune condiţia iniţială:
u(1) = u0 , (5.38)
iar pentru ultimul punct k = N vom scrie ecuaţia discretizată dar ı̂n care vom folosi
pentru derivată o formulă de diferenţe regresive de ordinul 2 dată de relaţia (5.6):
uN −2 − 4uN −1 + 3uN 1 1
+ uN = E, (5.39)
2h τ τ
de unde
2h 2h
uN −2 − 4uN −1 + 3 + uN = E. (5.40)
τ τ
Exerciţiul 5.9:
a) Completaţi funcţia mdf circuitRC.m cu cazul ”centrat2”:
case ’centrat2’
%% asamblare sistem
A = sparse(N,N);
tl = zeros(N,1);
A(1,1) = 1; % conditia initiala
tl(1) = u_initial;
for k = 2:N-1 % noduri interioare
A(k,k-1) = -1;
.................completati...........
end
A(N,N-2) = 1; % conditia la tmax
....................completati.............
tl(N) = 2*h*E/tau;
%% rezolvare
u = A\tl;
b) Completaţi scriptul cu apelul funcţiei ı̂n cazul centrat şi partea de postprocesare cu
reprezentarea grafică a soluţiei obţinute, pe acelaşi grafic ca soluţia analitică şi soluţia
obţinută ı̂n prima variantă.
Pentru verificare, comparaţi graficele pe care le-aţi obţinut cu cele din figurile 5.3 ÷
5.5.
Exerciţiul 5.10:
Completaţi scriptul main RC.m cu comenzi astfel ı̂ncât, ı̂ntr-o altă fereastră grafică să
obţineţi graficele erorilor absolute ı̂n funcţie de pasul de timp.
0.01
1
0.008
0.006
0.014 5
0.012
u [V]
4
0.01
0.008 3
0.006
2
0.004 analitic
prog ord 1
1
0.002 regr ord 1
centr ord 2
0 0
0 1 2 3 4 0 1 2 3 4
t [s] x 10
−4 t [s] x 10
−4
În capitolul 3, aţi văzut că asamblarea matricelor ı̂n Matlab se poate face mult mai
rapid dacă se construieşte formatul pe coordonate al matricei, după ce, ı̂n prealabil, a fost
alocat un spaţiu de memorie exact cât este necesar pentru stocarea matricei.
Exerciţiul 5.11:
a) Completaţi funcţia mdf circuitRC.m cu cazul ”centrat2b”:
case ’centrat2b’
%% asamblare sistem
0.02
0.01
0.015
0.01
0.005
0.005
0 0
0 1 2 3 4 0 1 2 3 4
t [s] x 10
−4 t [s] x 10
−4
tic;
no_nnz = 3*(N-1) + 1;
r_idx = zeros(no_nnz,1);
c_idx = zeros(no_nnz,1);
val = zeros(no_nnz,1);
tl = zeros(N,1);
m = 1;
% A(1,1) = 1 % conditia initiala
r_idx(m) = 1;
c_idx(m) = 1;
val(m) = 1;
tl(1) = u_initial;
for k = 2:N-1 % noduri interioare
%A(k,k-1) = -1;
m = m + 1;
r_idx(m) = k;
c_idx(m) = k-1;
val(m) = -1;
.................completati...........
end
....................completati.............
tl(N) = 2*h*E/tau;
A = sparse(r_idx,c_idx,val,N,N);
t2 = toc;
disp(sprintf(’centrat2b - timp asamblare matrice = %e’,t2));
%% rezolvare
u = A\tl;
b) Completaţi scriptul cu apelul funcţiei ı̂n acest caz. Pentru a verifica faptul că nu
s-au strecurat greşeli, reprezentaţi grafic ı̂ntr-o altă fereastră soluţia obţinută ı̂n cazul
”centrat2b” cu soluţia obţinută ı̂n cazul ”centrat”.
c) Introduceţi instrucţiuni pentru contorizarea timpului de asamblare al matricei ı̂n ambele
variante de implementari. Comparaţi aceşti timpi pentru cazul h = τ /1000.
y
σ=0
1V Q V=1 R dV/dn=0
b P
dV/dn=0
b/2 dV/dn=0 ∆V = 0 S
σ
0V V=0
O a/2 a x O dV/dn=0 N
Deoarece domeniul este omogen (conductivitatea σ are acceaşi valoare ı̂n orice punct
al domeniului), ecuaţia se simplifică la o ecuaţie de tip Laplace:
∆V = 0, (5.42)
unde ∆ = div grad este operatorul Laplace, care ı̂n coordonate carteziene (cazul 2D) are
expresia
∂ 2V ∂2V
∆V = + . (5.43)
∂x2 ∂y 2
În consecinţă, ecuaţia diferenţială ce trebuie rezolvată este o ecuaţie cu derivate parţiale:
∂2V ∂2V
+ = 0, (5.44)
∂x2 ∂y 2
unde V = V (x, y) : D → IR.
Pentru buna formulare a problemei, trebuie impuse pentru potenţial condiţiile de fron-
tieră. Frontierele supraconductoare (SN şi QR) au potenţial constant, şi ı̂n consecinţă pe
ele trebuie impuse codiţii Dirichlet ı̂n concordanţă cu valorile potenţialului. Pe frontierele
de lângă izolant (NOQ şi RPS), trebuie impuse condiţii Neumann nule3 .
V = V0 pe QR (Dirichlet) (5.45)
V = 0 pe SN (Dirichlet) (5.46)
∂V
= 0 pe NOQ ∪ RPS (Neumann) (5.47)
∂n
3
În izolant nu există curent de conducţie, ı̂n consecinţă J · n = 0 la frontiera cu izolantul, deci
−σgrad V · n = 0, echivalent cu −σ ∂V
∂n = 0 pe acele frontiere.
Şi pentru o astfel de problemă se pot găsi rezolvări analitice bazate de exemplu pe
metoda separării variabilelor sau pe aproximarea liniilor de câmp. Deşi nu este dificilă,
prezentarea acestor posibile soluţii nu este atât de simplă ca cea din exemplul anterior.
Scopul nostru este ı̂nsă de a prezenta modul ı̂n care se poate rezolva această problemă cu
metoda diferenţelor finite aşa ı̂ncât ı̂n cele ce urmează ne vom concentra exclusiv asupra
acestui aspect.
Faţă de cazul unidimensional discutat ı̂n exemplul anterior, aici gridul de discretizare
este unul bidimensional, iar ı̂n loc de aproximarea unei derivate totale de ordinul 1, acum
avem de aproximat derivate parţiale de ordinul 2.
Gridul de discretizare bidimensional poate fi privit ca fiind obţinut din produsul
cartezian dintre un grid de discretizare pe axa Ox şi un grid de discretizare pe axa Oy:
0 = x1 < x2 < . . . < xnx = a
0 = y1 < y2 < . . . < yny = b.
astfel ı̂ncât, un nod al gridului este identificat de poziţia proiecţiilor sale pe cele două axe:
(xi , yj ) i = 1, . . . , nx , j = 1, . . . , ny .
Metoda diferenţelor finite va determina valorile potenţialului ı̂n nodurile acestui grid:
not
V (xi , yj ) = Vi,j i = 1, nx , j = 1, ny . (5.48)
y
n
C
C
D1
D O B O B
A A
x
x
Figura 5.7: Nodurile marcate intervin ı̂n scrierea ecuaţiilor: stânga - cazul unui nod
interior; dreapta - cazul unui nod pe frontieră Neumann dreaptă.
Exerciţiul 5.12:
În cazul unor griduri neuniforme, folosind notaţiile din fig. 5.7, arătaţi că ecuaţia dis-
cretizată asociată unui nod interior este
1 1 1 1
VO + − VA − VB −
hB hD hA hC hA (hA + hC ) hB (hB + hD )
1 1
−VC − VD = 0, (5.53)
hC (hA + hC ) hD (hB + hD )
În cazul unui punct pe frontieră O (fig. 5.7- dreapta), să notăm cu g = −σ ∂V
∂n
condiţia
de frontieră Neumann şi cu gO valoarea ei medie ı̂n punctul O:
gOA hA + gOC hC
gO = (5.54)
hA + hC
unde gOA este condiţia de frontieră asociată segmenului OA iar gOC este condiţia de
frontieră asociată segmentului OC.
Pentru deducerea ecuaţiei aproximative pentru punctul O, vom considera un nod “fan-
tomă” D1 , situat ı̂n exterior, la o distanţă hD = kOD1 k de punctul O. Pentru simplitate
putem considera hD = hB .
Din condiţia de frontieră Neumann, deducem valorea potenţialului fantomă ı̂n funcţie
de valoarea acestei condiţii. Pentru cazul din figură (normala exterioară ı̂n sens contrar
axei x) rezultă:
∂V g
= . (5.55)
∂x σ
Scriind relaţia aproximativă (5.4) pentru condiţia de frontieră Neumann, rezultă că:
gO
VD1 = VB − 2hB . (5.56)
σ
Pentru nodul O se scrie acum o ecuaţie de tipul (5.53), ca pentru un nod interior şi
ı̂nlocuind expresia (5.56) rezultă ecuaţia finală (5.57):
1 1 1 1 1 gO
VO 2
+ − VA − VB 2 − VC =− . (5.57)
hB hA hC hA (hA + hC ) hB hC (hA + hC ) σhB
Nodurile situate ı̂n colţuri reprezintă o problemă pentru metoda diferenţelor finite.
Aceasta deoarece pentru un colţ nu poate fi definită direcţia normalei4 . Dacă notăm
g = −σ ∂V ∂n
, şi notăm cu gOA valoarea lui g pe segmentul OA (fără capătul O) şi cu gOB
valoarea lui g pe segmentul OB (fără capătul O), atunci vom presupune că ı̂n nodul O (fig.
5.8) este cunoscută derivata după o direcţie care rezultă din prelungirea ı̂n O a valorilor
funcţiei g.
Pentru deducerea ecuaţiei vom considera două noduri “fantomă” C1 şi D1 , situate ı̂n
exterior, la distanţele hD = kOD1 k şi hC = kOC1 k de punctul O. Pentru simplitate putem
considera hD = hB şi hC = hA .
4
În realitate, colţul reprezintă o modelare brutală a realităţii. Trecerea de la o suprafaţă la alta se
face prin racordări.
C1
n
D1
O B
A
n
x
Figura 5.8: Nodurile marcate intervin ı̂n scrierea ecuaţiei unui nod pe frontieră colţ
exterior.
Din condiţia de frontieră Neumann pe segmentul OB, scrisă ı̂n nodul O, putem deduce
valoarea potenţialului fantomă C1 :
gOB
VC1 = VA − 2hA . (5.59)
σ
Din condiţia de frontieră Neumann pe segmenul OA, scrisă ı̂n nodul O, putem deduce
valoarea potenţialului fantomă D1 :
gOA
VD1 = VB − 2hB . (5.60)
σ
Pentru nodul O se scrie acum o ecuaţie de tipul (5.53), ca pentru un nod interior, şi
ı̂nlocuind expresiile (5.59) şi (5.60) rezultă ecuaţia finală (5.61):
1 1 1 1 gOB gOA
VO 2
+ 2 − VA 2 − VB 2 = − − (5.61)
hA hB hA hB σhA σhB
k = (i − 1)ny + j, i = 1, . . . , nx , j = 1, . . . , ny . (5.63)
ny 2 ny nx ny
j k
A= t=
În acest moment putem trece la conceperea algoritmului. Vom scrie funcţii speciale
pentru: citirea datelor problemei, generarea gridului, asamblarea sistemului de ecuaţii de
rezolvat şi pentru postprocesare.
Să ı̂ncepem cu citirea datelor problemei. În principiu, am putea citi datele de la
tastatură sau din fişiere, dar cum scopul nostru este de a construi şi testa partea cea mai
complicata a algoritmului (preprocesarea), vom prefera ca datele problemei să le ”citim”
prin instanţiere, ı̂ntr-o funcţie numită citire date elcin. Datele problemei sunt grupate
ı̂ntr-o structură numită date, ce are mai multe câmpuri.
Exerciţiul 5.14:
a) Scrieţi un script mdf elcin.m cu următorul conţinut:
clear all;
c) Rulaţi codul scris până acum pentru a observa dacă s-au strecurat greşeli.
Acum ı̂ncepe partea de preprocesare. Mai ı̂ntâi trebuie pregătite informaţiile legate
de gridul de discretizare. Vom presupune că acesta este uniform pe cele două axe.
Exerciţiul 5.15:
a) Completaţi scriptul cu comenzile
% pasi de discretizare pe Ox si Oy
hx = ..................... completati............
hy = ..................... completati............
% numarul total de noduri
N = ..................... completati.............
[Link] = nx;
[Link] = ny;
[Link] = hx;
[Link] = hy;
grid.x = linspace(0,a,nx);
grid.y = linspace(0,b,ny);
grid.N = N;
Exerciţiul 5.16:
a) Completaţi scriptul cu comenzile
%% asamblare sistem
[A,tl] = asamblare_mdf_elcin(date,my_grid);
A = sparse(N,N);
tl = sparse(N,1);
%% nodurile interioare
for i = 2:nx-1
for j = 2:ny-1
k = (i-1)*ny + j;
ksus = k+1;
kjos = k-1;
kst = k - ny;
kdr = k + ny;
A(k,k) = 2*(1/hx^2+1/hy^2);
A(k,ksus) = -1/hy^2;
................. completati .................
end
end
%% cond. de frontiera Neumann - segm vertical stanga
i = 1;
for j = 2:ny-1
k = (i-1)*ny + j;
ksus = k+1;
kjos = k-1;
kdr = k + ny;
A(k,k) = 2*(1/hx^2+1/hy^2);
A(k,ksus) = -1/hy^2;
A(k,kjos) = -1/hy^2;
A(k,kdr) = -2/hx^2;
end
%% cond. de frontiera Neumann - segm orizontal jos
j = 1;
for i = 2:nx-1
.................... completati ......................
end
%% cond. de frontiera Neumann - segm orizontal sus (partial)
iT1dr = floor(T1/a*nx)+1; % idx pe i atins in dreapta de T1
j = ny;
for i = iT1dr+1:nx-1
.................... completati ......................
end
%% cond. de frontiera Neumann - segm vertical dreapta (partial)
jT2sus = floor(T2/b*ny)+1; % idx pe j atins sus de T2
i = nx;
for j = jT2sus+1:ny-1
.................... completati ......................
end
%% cond de frontiera Neumann - colt stanga jos
k = 1;
kdr = ny+1;
ksus = 2;
A(k,k) = 2*(1/hx^2+1/hy^2);
A(k,ksus) = -2/hy^2;
A(k,kdr) = -2/hx^2;
%% cond de frontiera Neumann - colt dreapta sus
.................... completati ......................
%% cond de frontiera Dirichlet - T1
j = ny;
for i = 1:iT1dr
k = (i-1)*ny + j;
A(k,k) = 1;
tl(k) = V1;
end
%% cond de frontiera Dirichlet - T2
.................... completati ......................
c) Verificaţi codul scris cu comanda mlint. Executaţi programul scris până acum şi
verificaţi că matricea coeficienţilor şi vectorul termenilor liberi au valorile pe care le-aţi
obţinut la exerciţiul 5.13
În Matlab, rezolvarea acestui sistem este extrem de uşoară din punct de vedere al
utilizatorului:
Exerciţiul 5.17:
Completaţi scriptul cu comenzile
Urmează etapa de postprocesare. Vom reprezenta liniile echipotenţiale şi vom desena
gridul de discretizare.
Exerciţiul 5.18:
a) Completaţi scriptul cu comenzile
function echipotentiale_elcin(my_grid,V)
nx = my_grid.nx;
ny = my_grid.ny;
x = my_grid.x;
y = my_grid.y;
v = zeros(nx,ny);
for i = 1:nx
for j = 1:ny
k = (i-1)*ny + j;
v(i,j) = V(k);
end
end
..................completati..........(ceva similar ati facut la capitolul 1)
function draw_my_grid(my_grid)
nx = my_grid.nx;
ny = my_grid.ny;
x = my_grid.x;
y = my_grid.y;
for i = 1:nx
xcrt = x(i);
hold on;
plot([xcrt xcrt],[y(1),y(ny)],’k:’);
end
..................completati..........
2 1 1 21 1
8 6
9 0. 7 0.
0. 0.
0.7
5 0.9
1.8 0.9 0. 1.8 0.9
0.8 5
1.6 0.8 0.4 1.6 0.
6
0.8 0.
3 0.8 0.
0.
6 0.4
1.4 0.7 1.4 0.7
5
0.7 0.
1.2 2 1.2 0.7 0.3
0.6 0. 1 5
0.
4 0. 0.6 0. 4 0.2
1 1 0.
0 .3
0.1
6 0.6
0. 5
0.8 0. 0.8
0 .3
0.6 0.6 5
0.
0.2
0.2
0.4
0.4 0.4
0.1
0.4
5
0.
0.3
0.2 0.2
0.1
5
0.
0 0
0 0.5 1 1.5 2 0 0.5 1 1.5 2
d) Verificaţi că aţi lucrat corect, comparând rezultatele cu cele din fig. 5.10.
Exerciţiul 5.19:
a) Observaţi cu atenţie fig. 5.10 - stânga şi descrieţi ideea care stă la baza algoritmului
de desenare al curbelor de echivalori.
b) Propuneţi ı̂mbunătăţiri posibile pentru funcţia de asamblare.
c) Ştiind că E = −grad V , scrieţi formulele cu care se poate calcula câmpul electric ı̂n
nodurile gridului de discretizare.
În acest paragraf vom rezolva cu metoda diferenţelor finite cel mai simplu exemplu de
ecuaţie hiperbolică, şi anume ecuaţia undei scalare:
∂ 2u 2
2∂ u
= v , (5.64)
∂t2 ∂x2
unde mărimea scalară necunoscută u(x, t) : [0, a] × [0, T ] → IR depinde de o singură
coordonată spaţială şi de timp, iar v este o constantă cunoscută. Soluţia acestei ecuaţii
este o undă care se propagă cu viteză v.
• condiţiilor la capete - relaţii ı̂n care intervin mărimile u(0, t) = h1 (t) şi u(a, t) =
h2 (t).
unde ud(x, t) se numeşte undă directă şi este o funcţie care se poate scrie sub forma
iar ui(x, t) se numeşte undă inversă şi este o funcţie care se poate scrie sub forma
Funcţiile f şi g rezultă ı̂n mod univoc, din impunerea condiţiilor iniţiale şi condiţiilor
la capete. Mărimea f (x − vt) este o undă direcţă deoarece o anumită valoare a acestei
funcţii, ı̂ntr-un anumit punct x şi ı̂ntr-un anumit moment de timp t se va regăsi după un
interval de timp ∆t ı̂n punctul x + ∆x, unde ∆x = v∆t. Unda directă se propagă deci ı̂n
sensul pozitiv al axei Ox. Un raţionament similar se poate face pentru unda inversă.
Exerciţiul 5.20:
a) Scrieţi o funcţie cu următorul conţinut
function demo_unde()
a = 1; % domeniul spatial este [0,a]
T = 1; % domeniul temporal este [0, T]
N = 500; % nr pct pentru discretizarea spatiala
M = 500; % nr pct pentru discretizarea temporala
v = 1; % viteza de propagare
dt = T/(M-1); % pas de discretizare temporal - uniform
x = linspace(0,a,N);
t = 0;
u = ud(x,t,v);
plot(x,u);
drawnow;
for j = 1:M
t = t + dt;
u = ud(x,t,v);
plot(x,u);
drawnow;
end
şi ı̂nainte de a două comandă drawnow adăugaţi doar comanda axis ca mai sus. Ceea ce
obţineţi sunt unde staţionare.
Vom concepe acum un algoritm bazat pe metoda diferenţelor finite, care rezolvă ecuaţia
(5.64). Ca exemplu numeric vom considera a = 1 m, v = 1 m/s.
Într-un prim exemplu, vom considera condiţii iniţiale nule şi condiţii Dirichlet la ambele
capete:
Mărimea u(x, t) este discretizată atât ı̂n spaţiu cât şi ı̂n timp. Prin rezolvarea cu
metoda diferenţelor finite, vom obţine aproximaţii pentru valorile reale u(xk , tj ).
(j)
u(xk , tj ) ≈ uk , k = 1, . . . , N, j = 1, . . . , M. (5.68)
Alegând pentru derivatele ce intervin ı̂n (5.64) formule de derivare ce provin din poli-
nomul de interpolare de ordin doi, rezultă următoarea relaţie discretizată:
(j−1) (j) (j+1) (j) (j) (j)
uk − 2uk + uk 2 uk−1 − 2uk + uk+1
=v , (5.69)
(∆t)2 (∆x)2
de unde rezultă că mărimea u, ı̂ntr-un anumit punct k şi la un anumit moment de timp
j + 1 depinde explicit de valoarea ı̂n acel punct şi ı̂n cele ı̂nvecinate la momentul de timp
anterior j şi de valoarea ı̂n acel punct la momentul j − 1:
2
(j+1) v∆t (j) (j) (j)
(j)
uk = uk−1 − 2uk + uk+1 +2uk −ukj−1 , k = 2, . . . , N −1, j = 0, . . . , M −1.
∆x
(5.70)
Momentul −1 ı̂l vom considera identic cu momentul iniţial 0.
Exerciţiul 5.21:
a) Scrieţi un script cu următorul conţinut
clear all;
a = 1; % domeniul spatial este [0,a]
T = 1; % intervalul de timp necesar propagarii pe distanta a
N = 500; % nr pct pentru discretizarea spatiala
M = 500; % nr pct pentru discretizarea temporala a lui T
v = 1; % viteza de propagare
dx = a/(N-1); % pas de discretizare spatial - uniform
dt = T/(M-1); % pas de discretizare temporal - uniform
r = v*dt/dx;
r2 = r^2;
% conditia initiala
x = linspace(0,1,N);
solv = zeros(1,N);
solvv = solv;
plot(x,solv);
xmin = 0; xmax = a; ymin = -2.2; ymax = 2.2;
axis([xmin, xmax,ymin,ymax]);
MM = 2*M;
b) Observaţi ce se ı̂ntâmplă după reflexie (fig. 5.11). În momentul reflexiei, apare o undă
inversă deoarece condiţia Dirichlet la capătul din dreapta impune ca mărimea să fie zero.
În consecinţă, unda inversă la capătul din dreapta este exact opusul undei directe, şi ea
se propagă ı̂n sens contrar axei Ox.
c) Cazul implementat mai sus corespunde situaţiei ∆x = v∆t. Observaţi ce se ı̂ntâmplă
dacă ∆x > v∆t. Alegeţi de exemplu N = 100, M = 500.
c) Observaţi ce se ı̂ntâmplă dacă ∆x < v∆t. Alegeţi de exemplu N = 100, M = 500.
tmax = 1.00e+000, no = 1000, idx = 400 tmax = 1.00e+000, no = 1000, idx = 600
t t t t
2 2
1.5 1.5
1 1
0.5 0.5
0 0
−0.5 −0.5
−1 −1
−1.5 −1.5
−2 −2
Figura 5.11: Propagarea unui impuls Gauss (stânga) şi rezultatul reflexiei după atingerea
unei frontiere pe care s-a impus condiţie Dirichlet nulă (dreapta).
În concluzie, atunci când o problemă necesită atât o discretizare spaţială cât şi una
temporală, pentru ca soluţia numerică să fie stabilă, este necesar să fie ı̂ndeplinită condiţia
lui Courant
|v|∆t ≤ ∆x. (5.71)
Exerciţiul 5.22:
a) Reveniţi la cazul ∆x = v∆t şi schimbaţi condiţia la capătul din stânga cu u(0, t) =
h1 (t) = sin(10πt).
b) Observaţi apariţia undelor staţionare, de data aceasta obţinute prin rezolvarea ecuaţiei
undei scalare (fig. 5.12).
tmax = 1.00e+000, no = 1000, idx = 400 tmax = 1.00e+000, no = 1000, idx = 600
t t t t
2 2
1.5 1.5
1 1
0.5 0.5
0 0
−0.5 −0.5
−1 −1
−1.5 −1.5
−2 −2
Figura 5.12: Propagarea unui unde sinusoidale (stânga) şi rezultatul reflexiei după atin-
gerea unei frontiere pe care s-a impus condiţie Dirichlet nulă (dreapta).
În problemele ı̂n care apare propagare, este util uneori ca frontiera domeniului spaţial
să fie modelată ca o frontieră absorbantă, ”invizibilă” din punct de vedere al propagării
mărimilor ı̂n domeniul spaţial modelat. O condiţie de frontieră absorbantă pentru capătul
din dreapta al problemei studiate este
∂u ∂u
+v = 0. (5.72)
∂t ∂z
Exerciţiul 5.23:
a) Implementaţi condiţia de frontieră absorbantă (5.72) folosind o discretizare cu diferenţe
progresive de ordinul 1 pentru derivata temporală şi diferenţe regresive de ordinul 1 pentru
derivata spaţială:
(j) (j)
u − uN −1 u(j+1) − uN
(j)
v N + N = 0. (5.73)
∆z ∆t
b) Verificaţi codul implementat pentru cazul ı̂n care la capătul din stânga este impusă
condiţia Dirichlet folosită la exerciţiul 5.21