Derivata de ordin I#
Pentru a înțelege mai bine soluționarea numerică a derivatelor de ordin I, vom explica inițial de unde provine conceptul de derivare din punct de vedere matematic, iar apoi vom face legătura cu diferențele finite.
Derivarea matematică#
Fie \(f:[a,b]\subset\mathbb{R}\rightarrow\mathbb{R}\) o funcție derivabilă pe întreg intervalul de definiție. Atunci, funcția \(f':[a,b]\rightarrow\mathbb{R}\) reprezintă derivata funcției \(f\) și se calculează prin:
\[ \boxed{f'(x)=\lim_{h\rightarrow0}\frac{f(x+h)-f(x)}{h}}\,,\,\,\forall x\in[a,b] \]Sunt conștient că am folosit, în definiția anterioară, noțiunea de funcție derivabilă - nu este însă nevoie, pentru a studia metodele numerice, de o definiție riguroasă a ceea ce înseamnă derivabilitatea.
Conceptul este, pentru curioși, explicat încă din liceu - existența și egalitatea limitelor la stânga și la dreapta în orice punct al domeniului de definiție al funcției.
Experiența însă ne amintește că, din punct de vedere matematic, foarte rar asociem unei derivate această definiție - adesea se utilizează regulile obișnuite, tabelare, mult mai prietenoase calculului.
Cu toate acestea, este foarte impractic, uneori chiar imposibil, să folosim aceeași gândire în cazul calculatoarelor, așadar trebuie găsită o alternativă numerică.
Diferențe finite#
Diferențele finite sunt menite să transpună lumea continuă a matematicii într-un univers discret, anume lumea calculatoarelor.
Fie \(f:[a,b]\subset\mathbb{R}\rightarrow\mathbb{R}\) o funcție continuă. Suplimentar, considerăm constanta \(h\in\mathbb{R}\), de obicei aleasă astfel încât \(|h|\rightarrow0\). În acest context, se definesc următoarele concepte:
-
Diferența finită înainte (\(\Delta\)), cunoscută și drept diferența directă:
\[ \boxed{\Delta_h[f](x)=f(x+h)-f(x)} \] -
Diferența finită înapoi (\(\nabla\)), denumită și diferența înapoi:
\[ \boxed{\nabla_h[f](x)=f(x)-f(x-h)}\,=\Delta_h[f](x-h) \] -
Diferența finită centrată (\(\delta\)), ce leagă conceptele anterioare:
\[\begin{split} \boxed{\delta_h[f](x)=f\left(x+\frac{h}{2}\right)-f\left(x-\frac{h}{2}\right)}\,&=\Delta_{h/2}[f](x)+\nabla_{h/2}[f](x)\\ &=\Delta_{h/2}[f](x)+\Delta_{h/2}[f]\left(x-{h}/{2}\right) \end{split}\]
Aceste diferențe finite sunt utilizate, în general, în contextul discretizării derivatelor. Într-adevăr, în acest capitol, le vom folosi pentru a realiza calculul derivatei din punct de vedere numeric.
Derivarea numerică simplă#
Să înțelegem întâi cum derivăm numeric o funcție a cărei formă (formulă) este cunoscută, iar apoi să generalizăm pentru funcții numerice.
Pentru o funcție cunoscută#
Fie \(f:[a,b]\subset\mathbb{R}\rightarrow\mathbb{R}\) o funcție derivabilă pe întreg intervalul de definiție.
Folosind ecuația matematică alături de un \(h\) constant și suficient de mic (în acest context, suficient de mic înseamnă o valoarea care tinde către \(0\) numeric) și considerând funcția \(f\) cunoscută, se poate folosi aproximarea (utilizată anterior în cadrul metodei secantei):
\[ \boxed{f'(x)\approx\frac{f(x+h)-f(x)}{h}}\,,\,\,\forall x\in[a,b] \]Într-adevăr, aceasta este aproximarea cu diferențe finite a derivării. Amintindu-ne formula diferenței finite, și anume \(\Delta_h[f](x)=f(x+h)-f(x)\), putem rescrie ecuația drept:
\[ \boxed{f'(x)\approx\frac{\Delta_h[f](x)}{h}}\,,\,\,\forall x\in[a,b] \]Această formulă este utilă în momentul în care funcția \(f\) este cunoscută și poate fi evaluată rapid în orice punct din intervalul dat.
Cu toate acestea, aproximarea trebuie adaptată la contextul numeric în care funcția \(f\) este descrisă printr-o mulțime de puncte, evaluări ale sale, ce trebuie interpolate sau aproximate.
Pentru o funcție necunoscută#
Fie \(f:[a,b]\subset\mathbb{R}\rightarrow\mathbb{R}\) o funcție derivabilă pe întreg intervalul de definiție. Totodată, fie mulțimea \(M=\Big\{(x_k,y_k)\in\mathbb{R}^2\,|\,y_k=f(x_k),\,k\in\overline{0,n}\Big\}\), unde \(n\in\mathbb{N}^*\) și \(x_k\lt x_{k+1}\), \(\forall k\lt n\), o mulțime de \(n+1\) puncte distincte ordonate crescător, reprezentând evaluări ale funcției \(f\).
Dacă \(f\) nu se cunoaște, pentru a se calcula valoarea \(f'(x_0)\), unde \(x_0\in[a,b]\), se procedează astfel:
-
Se interpolează punctele:
Se interpolează punctele din mulțimea \(M\) folosind orice metodă cunoscută, adesea creându-se un polinom Lagrange de grad \(1\), să zicem \(L\in\mathbb{P}_1\).
Este de menționat însă că, în locul interpolării, se poate utiliza o aproximare a funcției.
-
Se calculează derivata:
Se utilizează polinomul \(L\) alături de aproximarea derivatei descrisă anterior.
Alternativ, dacă se pot construi coeficienții polinomului unic ce interpolează punctele din mulțimea \(M\) (precum este cazul interpolării Lagrange), derivata se poate calcula mult mai precis, întrucât operația de derivare a unui polinom este simplă din punct de vedere computațional.
Estimarea erorii#
Fie \(f:[a,b]\subset\mathbb{R}\rightarrow\mathbb{R}\) o funcție derivabilă pe întreg intervalul de definiție. Atunci, eroarea calculării lui \(f'(x)\), \(x\in[a,b]\), folosind metoda standard și interpolarea Lagrange se poate demonstra că este dată de următoarea relație:
\[ \boxed{\varepsilon(x)\approx\frac{f''(x)}{2} h}\,,\,\,\forall x\in[a,b] \]Vom sparge \(f(x+h)\) într-o serie Taylor, în jurul lui \(x\). Putem face acest lucru deoarece \(h\to0\) nu ar trebui să fie un impediment (considerăm seria Maclaurin):
\[\begin{split} f(x+h)&=f(x)+f'(x)h+\frac{f''(x)}{2!}h^2+\frac{f^{(3)}(x)}{3!}h^3+\dots\\ &= f(x)+f'(x)h+\frac{f''(x)}{2!}h^2+O(h^3) \end{split}\]Se face apoi înlocuirea în ecuația \(f'(x)\approx\frac{f(x+h)-f(x)}{h}\) și se obține:
\[\begin{split} f'(x)&\approx\frac{f(x+h)-f(x)}{h}=\frac{f(x)+f'(x)h+\frac{f''(x)}{2!}h^2+O(h^3)-f(x)}{h}\\ &= f'(x)+\frac{f''(x)}{2} h+O(h^2) \end{split}\]Cum eroarea este de ordinul \(O(h)\), se obține că \(\varepsilon(x)\approx\frac{f''(x)}{2}h\).
Cod ilustrativ#
Derivarea numerică simplă va fi implementată în Matlab sub forma funcției deriv1
. Aceasta primește ca parametri:
-
f
- funcția pe care vrem să o derivăm; -
x
- punctul în care se cere derivata; -
h
- mărimea pasului utilizat (de obicei, aproximativ \(10^{-4}\)).
Funcția va returna df
, derivata în punctul x
.
function df = deriv1(f, x, h)
df = (f(x+h) - f(x)) / h;
end
Derivarea numerică în 3 puncte#
Vom adapta acum ideea deja descrisă pentru a obține o formulă mai bună de aproximare a derivatei. Această metodă este cunoscută drept metoda celor 3 puncte.
Fie \(f:[a,b]\subset\mathbb{R}\rightarrow\mathbb{R}\) o funcție derivabilă pe întreg intervalul de definiție. Folosind relația \(f'(x)\approx\frac{f(x+h)-f(x)}{h}\), se pot obține următoarele două relații, a doua provenind din transformarea \(h\to-h\):
\[ \boxed{f'(x)\approx\frac{f(x+h)-f(x)}{h}}\,\text{ și }\, \boxed{f'(x)\approx\frac{f(x-h)-f(x)}{-h}}\,,\,\,\forall x\in[a,b] \]Prin însumarea acestor două aproximări, se obține relația:
\[ 2f'(x)\approx\frac{f(x+h)-f(x-h)}{h}\Rightarrow\boxed{f'(x)\approx\frac{f(x+h)-f(x-h)}{2h}}\,,\,\,\forall x\in[a,b] \]Observăm totodată legătura cu diferențele finite (amintim că \(\delta_{2h}[f](x)=f(x+h)-f(x-h)\)):
\[ \boxed{f'(x)\approx\frac{\delta_{2h}[f](x)}{2h}} \]Această metodă presupune faptul că se cunoaște și se poate evalua funcția \(f\), dar ea poate fi adaptată și în situația în care nu știm cine este \(f\). Asemănător derivării numerice obișnuite, se vor interpola polinomial punctele pentru a se obține un polinom Lagrange de grad \(2\), \(L\in\mathbb{P}_2\), care va înlocui funcția \(f\) peste tot în formulă.
În practică, o valoare potrivită pentru \(h\) este, de obicei, \(h\approx10^{-4}\). Aceasta este suficient de mică pentru a nu ne îndepărta prea mult de rezultat, dar suficient de mare pentru a nu rezulta în erori numerice mari.
Estimarea erorii#
Fie \(f:[a,b]\subset\mathbb{R}\rightarrow\mathbb{R}\) o funcție derivabilă pe întreg intervalul de definiție. Atunci, eroarea calculării lui \(f'(x)\), \(x\in[a,b]\), folosind metoda celor 3 puncte este dată de următoarea relație:
\[ \boxed{\varepsilon(x)\approx-\frac{f^{(3)}(x)}{6}h^2}\,,\,\,\forall x\in[a,b] \]Vom sparge \(f(x+h)\) într-o serie Taylor, în jurul lui \(x\). Putem face acest lucru deoarece \(h\to0\) nu ar trebui să fie un impediment (considerăm seria Maclaurin):
\[\begin{split} f(x+h)&=f(x)+f'(x)h+\frac{f''(x)}{2!}h^2+\frac{f^{(3)}(x)}{3!}h^3+\frac{f^{(4)}(x)}{4!}h^4+\dots\\ &=f(x)+f'(x)h+\frac{f''(x)}{2!}h^2+\frac{f^{(3)}(x)}{3!}h^3+\frac{f^{(4)}(x)}{4!}h^4+O(h^5) \end{split}\]În același scop, vom sparge și \(f(x-h)\) într-o serie Taylor (Maclaurin), în jurul lui \(x\):
\[\begin{split} f(x-h)&=f(x)-f'(x)h+\frac{f''(x)}{2!}h^2-\frac{f^{(3)}(x)}{3!}h^3+\frac{f^{(4)}(x)}{4!}h^4-\dots\\ &=f(x)-f'(x)h+\frac{f''(x)}{2!}h^2-\frac{f^{(3)}(x)}{3!}h^3+\frac{f^{(4)}(x)}{4!}h^4-O(h^5) \end{split}\]Scăzând aceste ecuații între ele, se reduc unii termeni și se obține:
\[ f(x+h)-f(x-h)=2f'(x)h+2\frac{f^{(3)}(x)}{3!}h^3+2O(h^5) \]Separând \(f'(x)\), se ajunge la următoarea formulă:
\[ f'(x)=\frac{f(x+h)-f(x-h)}{2h}-\frac{f^{(3)}(x)}{3!}h^2-O(h^4) \]Cum eroarea este de ordinul \(O(h^2)\), se obține că \(\varepsilon(x)\approx-\frac{f^{(3)}(x)}{6}h^2\).
Cod ilustrativ#
Vom implementa în funcția deriv3
derivarea numerică folosind metoda celor 3 puncte în Matlab. Aceasta primește ca parametri:
-
f
- funcția pe care vrem să o derivăm; -
x
- punctul în care se cere derivata; -
h
- mărimea pasului utilizat (de obicei, aproximativ \(10^{-4}\)).
Funcția va returna df
, derivata în punctul x
.
function df = deriv3(f, x, h)
df = (f(x+h) - f(x-h)) / (2*h);
end
Licență#
The book "Metode Numerice", written by Valentin-Ioan Vintilă, is licensed under CC BY-NC-SA 4.0