Metoda secantei#

Deoarece nu avem întotdeauna posibilitatea calculării derivatei funcției ale cărei rădăcini încercăm să le găsim, o alternativă discretă ne-ar prinde bine.

Metoda secantei reprezintă o reinterpretare a metodei Newton-Raphson ce preferă să utilizeze diferențe finite în locul derivării (metoda îl precede însă pe Newton cu mai bine de 3000 ani).

Pentru moment însă, vom evita utilizarea diferențelor finite drept instrument matematic - acestea vor apărea când vom discuta despre derivarea numerică.

Explicația matematică#

Pornind de la metoda Newton-Raphson, cunoaștem deja următaorea recurență a șirului convergent ce caracterizează algoritmul:

\[ x_k=x_{k-1}-\frac{f(x_{k-1})}{f'(x_{k-1})},\,\forall k\geq1 \]

Există însă metode de a aproxima derivatele, fără a le calcula propriu-zis. Acest tip de metode folosesc în spate conceptul de diferență finită, pe care îl vom discuta și noi în cadrul capitolului dedicat derivării numerice.

Până atunci, ne amintim definiția derivatei într-un punct \(x_0\), așa cum a fost predată la liceu:

\[ f'(x_0)=\lim_{x\rightarrow x_0}\frac{f(x)-f(x_0)}{x-x_0}\Leftrightarrow\, \boxed{f'(x_0)=\lim_{h\rightarrow0}\frac{f(x_0+h)-f(x_0)}{h}} \]

Așadar, deducem că o aproximare bună a derivatei este dată de relația:

\[ f'(x)\approx\frac{f(x+h)-f(x)}{x},\text{ unde }h\rightarrow0 \]

Cu toate acestea, cunoaștem recurența șirului \((x_n)_{n\in\mathbb{N}}\) descrisă de metoda tangentei, recurență despre care am stabilit că este convergentă. Așadar, diferența dintre doi termeni oarecare se apropie pe cât posibil de \(0\) (sau \(0\) numeric).

În acest context, vom defini aproximarea derivatei în punctul \(x_{k-1}\) în funcție de el însuși și de predecesorul său, \(x_{k-2}\):

\[ \boxed{f'(x_{k-1})\approx\frac{f(x_{k-1})-f(x_{k-2})}{x_{k-1}-x_{k-2}}}\,,\,\,\forall k\geq2 \]

Ne vom întoarce în relația noastră de recurență cu acest rezultat pentru a obține:

\[ \boxed{x_k=\begin{cases} \text{o aproximație bună inițială},&k\in\{0,1\}\\ x_{k-1}-f(x_{k-1})\cdot\dfrac{x_{k-1}-x_{k-2}}{f(x_{k-1})-f(x_{k-2})},&k\geq2 \end{cases}} \]

Dacă \(k\to+\infty\), se obține \(p=x_k\), unde \(p\) reprezintă soluția ecuației \(f(x)=0\). Metoda presupune calcularea unui număr suficient de mare de termeni, apropiindu-se treptat de valoarea \(p\).

Interpretare geometrică#

Acest algoritm are o vizualizare ușor de înțeles din punct de vedere geometric. Să considerăm funcția \(f\) definită astfel:

\[ f(x)=\left(x-0.1\right)^{3}-x^{2}-x+0.5 \]

Să considerăm totodată \(x_0=-2\) și \(x_1=2\) și să desenăm funcția, respectiv dreapta care trece prin punctele \(\big(x_0,f(x_0)\big)\) și \(\big(x_1,f(x_1)\big)\):

Graficul funcției \(f(x)\)

Dreapta care trece prin \(\big(x_0,f(x_0)\big)\) și \(\big(x_1,f(x_1)\big)\)

Vom trasa acum punctat o paralelă la axa \(Oy\) care trece prin punctul de intersecție al dreptei care trece prin \(\big(x_0,f(x_0)\big)\) și \(\big(x_1,f(x_1)\big)\) și axa \(Ox\). Această paralelă se va intersecta la rândul său cu graficul funcției \(f(x)\); numim acest punct \(x_2\) și ducem dreapta care trece prin \(\big(x_1,f(x_1)\big)\) și \(\big(x_2,f(x_2)\big)\):

Paralela la \(Oy\) care trece prin \(x_2\approx-1.16\)

Dreapta care trece prin \(\big(x_1,f(x_1)\big)\) și \(\big(x_2,f(x_2)\big)\)

Se poate vedea cu ochiul liber cum, în urma acestor iterații, ne-am apropiat de punctul în care \(f(x)\) se anulează. Pentru efect, ducem și paralela la \(Oy\) care trece prin \(x_3\):

Paralela cu \(Oy\) care trece prin \(x_3\approx0.590766\)

Am obținut: \(\begin{cases} f(x_0)=f(-0.7)&=0.198\\ f(x_1)=f(2)&=1.359\\ f(x_2)\approx f(-1.160465)&\approx-1.688806\\ f(x_3)\approx f(0.590766)&\approx-0.321568 \end{cases}\)

Punctul cel mai apropiat în care \(f(x)\) se anulează este dat de abscisa \(p\approx0.378\).

Convergență#

Această metodă are ordinul de convergență (vezi metoda bisecției) egal cu \(q=\varphi=\frac{1+\sqrt{5}}{2}=\approx1.618\) (proporția de aur) în cazul în care valorile \(x_0\) și \(x_1\) sunt alese atent.

Cu toate că ordinul de convergență este mai mic decât în cazul metodei Newton-Raphson, amintim cititorilor scopul acestei metode, anume de a renunța la derivate.

Cod ilustrativ#

Vom implementa metoda secantei în Matlab (funcția metoda_secantei). Aceasta primește:

  • x_0 - echivalentul elementului \(x_0\);

  • x_1 - echivalentul elementului \(x_1\);

  • f - funcția pentru care căutăm o rădăcină;

  • err - eroarea maximă acceptată pentru evaluarea lui \(f\) față de \(0\);

  • max_iter - numărul maxim de pași pe care îi poate executa algoritmul până se renunțe.

Codul de mai jos returnează x, echivalentul punctului în care \(f(x)\approx0\).

function x2 = metoda_secantei(x0, x1, f, err, max_iter)
    y0 = f(x0);
    if abs(y0) < err
        x2 = x0;
        return
    end

    y1 = f(x1);
    if abs(y1) < err
        x2 = x1;
        return
    end

    for k = [1 : max_iter]
        x2 = x1 - y1 * (x1 - x0) / (y1 - y0);
        x0 = x1; y0 = y1;
        x1 = x2; y1 = f(x1);
        if abs(y1) < err
            return
        end
    end
end

Licență#

The book "Metode Numerice", written by Valentin-Ioan Vintilă, is licensed under CC BY-NC-SA 4.0