Sunteți pe pagina 1din 11

Laborator 5 – Rezolvarea ecuațiilor neliniare

Problema discutata in acest laborator se poate scrie generic sub forma

f(x) = 0,

dar admite diverse interpretari, depinzand de semnificatia lui x si f. Cel mai simplu caz este cel al
unei singure ecuatii cu o singura necunoscuta, caz in care f este o functie data de o variabila reala
sau complexa si incercam sa gasim valorile acestei variabile pentru care f se anuleaza. Astfel de
valori se numesc radacini ale ecuatiei f(x) = 0 sau zerouri ale functiei f.

Anonymous functions

Cea mai simplă metodă pentru a crea funcții în Matlab este să folosim semnul @. Astfel definim
funcțiile ca handle functions sau anonymous functions.

Sintaxa:

nume_functie = @(var1,var2,..)expresie

unde expresie specifică funcția iar var1,var2,..sunt variabilele independente.

Exemplu: f=@(x) x^2-3*x+2

Inline functions

În Matalb putem defini funcții matematice simple nu numai în M-file tip funcție. O altă metodă este
de a scrie direct, în programe sau în Command Window, funcțiile folosind comanda inline.

Sintaxa:

nume_functie = inline('expresie',var1,var2,..)

unde 'expresie' specifică funcția iar var1,var2,..sunt variabilele independente.

Exemplu: f=inline('x.^2+3.*x+1','x')
Ecuatii neliniare în MATLAB

Pentru calculul soluțiilor ecuațiilor algebrice de forma f(x) = 0 vom utiliza următoarele
metode:

- Funcția Matlab fzero


- metoda înjumătăţirii intervalului - metoda bisecţiei intervalului
- metoda secantei
- metoda tangentei - metoda Newton-Raphson

0. Funcția Matlab fzero

În biblioteca Matlab găsim funcția fzero cu care putem determina zerourile ecuațiilor
algebrice și transcendente.

Sintaxa:

- x = fzero(function, x0)
- [x, fx] = fzero(function, x0)
- [x, fx] = fzero(function,x0,options)

• function este funcția care este definită anterior


• x0 este punctul inițial
• x vectorul radacinilor
• fx vectorul valorilor lui f

fzero Options

- options = optimset('par1,val1, par2,val2,...)

– par n este numele parametrului care va fi definit

– val n este valoarea atribuită acestui parametru

Parametrii folosiți uzual cu fzero sunt:

Display: care se setează cu valorea 'iter'

- options = optimset('Display','iter')

Astfel se tipăresc toate detaliile pentru fiecare iterație.


Exemplul 0:

Să se determine rădăcinile funcției𝑓(𝑥) = 𝑒 𝑥 − 𝑥

>> [X, fx] = fzero(@(x) exp(-x)-


x,0.1,optimset('Display','iter'))

1. Metoda înjumătăţirii intervalului - metoda bisecţiei;

Metoda bisecţiei sau metoda ȋnjumătăţirii intervalului este una din primele metode dezvoltate
pentru determinarea rădacinilor ecuaţiei f(x) = 0. Pentru determinarea unei rădăcini, din
intervalul [a,b] prin metoda bisecţiei, funcţia f(x) trebuie să satisfacă condiţiile:

- f:[a,b]→R continuă și strict monotonă


- f(a) • f(b) < 0;
-  f(x) are o singură rădăcină xr  (a,b), f(xr)=0

Algoritmul metodei bisecției:

pasul 1:

verificăm daca f(a) • f(b) < 0;

dacă nu algoritmul se oprește

stop;

dacă da se trece la pasul 2;

pasul 2:

inițializăm numărul iterației : k=1;

calculăm mijlocul intervalului [a, b], c = (a + b)/2

dacă f (c)  0 sau (b-a)/2 = 0

stop ;

pasul 3:

(căutarea rădăcinii se va face ȋn subintervalele ȋn care funcţia ȋşi schimbă semnul)

dacă f (a) • f (c) > 0  a c  rădăcina este în intervalul [c,b]


altfel f (a) • f (c)  0  b  c  rădăcina este în intervalul [a,c]

pasul 4: înapoi la pasul 2.

Algoritmul se opreşte după n iteraţii dacă este satisfăcută o anumită condiţie stabilită asupra
erorii, de exemplu condiţia de a avea valoarea  ca ordin de convergenţă.

Numărul iteraţiilor necesare, dacă dorim ca eroarea să fie mai mică decât , se determină din
condiţia ca mărimea intervalului după n paşi să fie mai mică ca .

Metoda bisecției – MATLAB: metoda_bisectiei.m

function [c fc er] = metoda_bisectiei(f,a,b,tol)

% metoda_bisectiei.m

% Inputs: f -- functie inline

% a,b -- capetele intervalului

% tol -- toleranta (ordinul) convergentei

% Outputs: c -- radacina aproximata

% fc -- valoarea functiei f(c)

% er – eroarea format short

fa = f(a); fb = f(b);

if fa*fb > 0.0

error('Functia are acelasi semn in capetele intervalului')

return

end

niter = 1 + round((log(b-a)-log(tol))/log(2))

for i = 1:niter

c = (a + b)/2;

fc = f(c);

if fc == 0.0
a = c;

b = c;

elseif fb*fc > 0

b = c;

fb = fc;

else

a = c;

fa = fc;

end

if b-a < tol

break

end

end

c =(a+b)/2;

fc = feval(f,c);

er = abs(b-a)/2

Exercițiul 1:

Să se determine rădăcina ecuaţiei 𝒇(𝒙) = 𝟎. 𝟓𝒙𝟑 − 𝟒𝒙𝟐 + 𝟔𝒙 − 𝟐 = 𝟎, aflată în


intervalul [0, 1] folosind metoda bisecției.

Vom defini funcția ca funcție inline:

>> f = inline('0.5*x.^3 - 4*x.^2+6*x -2','x')

Apelăm m-fila metoda_bisectiei.m, în care introducem capetele intervalului în care


căutăm radăcina și ordinul de convergență tol.

>> [c fc er] = metoda_bisectiei(f,0,1,1e-5)

Valoarea aproximată a rădăcinii din intervalul [0, 1] este x = 0.4746 şi a fost obţinută
după n = 18 iterații, cu eroarea e = 3.8147e-006.
Observaţi:. Metoda bisecţiei eşuează dacă:

- Funcţia are mai mult de o rădăcină în intervalul [a,b];

- Funcţia are rădăcină dublă;

- Funcţia are singularităţi (este discontinuă într-un punct din intervalul în care se caută
rădăcina).

2. Metoda secantei

Algoritmul metodei secantei

pasul 1: verificăm daca

f(a) • f(b) < 0;

dacă nu algoritmul se opreşte: stop;

dacă da se trece la pasul 2;

pasul 2:

iniţializăm numarul iteraţiei : k=1;

calculăm un punct x1, la intersecţia dreptei (secanta) care trece prin punctele A şi B cu
axa Ox;

Ecuaţia secantei este:


𝑓(𝑏)−𝑓(𝑎)
𝑦 − 𝑓(𝑎) = (𝑥 − 𝑎)
𝑏−𝑎

Din ecuația de mai sus se obţine abscisa x1 a punctului de intersecţie al secantei cu axa Ox

𝑏−𝑎
𝑥1 = 𝑎 − 𝑓(𝑎)
𝑓(𝑏) − 𝑓(𝑎)

dacă 𝑓(𝑥1 ) ≈ 0 stop ;

pasul 3:

(căutarea rădăcinii se va face ȋn subintervalele ȋn care funcţia ȋşi schimbă semnul)

dacă f(a) • f(b) < 0  noul subinterval este [a, x1]

altfel f(a) • f(b) > 0  noul subinterval este [x1, b]

pasul 4:
înapoi la pasul 2.
𝑥 −𝑥
Procedeul se repetă dupa relaţia de recurenţă 𝑥𝑛+1 = 𝑥𝑛 − 𝑓(𝑥𝑛 ) 𝑓(𝑥 𝑛)−𝑓(𝑥
𝑛−1
𝑛 𝑛−1 )

Metoda secantei – MATLAB – metoda_secantei.m

% metoda_secantei.m

% Inputs:

% f = functia

% x0; x1 = valorile initiale intre care este localizata solutia

% tol = criteriul de convergenta (tol > 100*eps)

% maxiter = numarul maxim de iteratii

% Outputs: x = estimarile pentru radacinile f(x) = 0

% k = numarul iteratiilor

% apelare

% >> metoda_secantei(f, x0, x1, tol, maxiter)

function [x,k] = metoda_secantei(f,x0,x1,tol,maxiter)

fx0 = f(x0);

fx1 = f(x1);

if fx0*fx1 > 0.0

error('Functia are acelasi semn in ambele capete')

end

% Formula iteratiilor (formula (2.10)

% x1 <-- x1 - ( (x1 - x0)/(f(x1) - fx(0)) * f(x1)

disp(' k x eroare')

k = 1;

while k <= maxiter


dfx = fx1 - fx0;

if dfx == 0

error('impartire cu zero');

end

x2 = x1-fx1*(x1 - x0) / dfx; fx2 = feval(f,x2);

eroare = abs(fx2);

x0 = x1;

fx0 = fx1;

x1 = x2;

fx1 = fx2;

disp([ k x1 eroare])

if eroare < tol

break;

end

k = k + 1;

end

x = x1; k = k-1;

if k > maxiter

fprintf('convergenta la solutie nu s-a obtinut in %d


iteratii\n', maxiter);

end

Exercițiul 2:

Să se determine rădăcina ecuaţiei f(x)=0.5x^3-4x^2+6x-2=0, aflată în intervalul [0, 1]


folosind metoda secantei.

Daca funcţia este dată prin comanda inline


>> f = inline('0.5*x.^3 - 4*x.^2+6*x -2','x')

apelarea metodei secantei se face cu comanda:

>> [x k] = metoda_secantei(f,0,1,1e-5,10)

Daca funcţia este dată ca anonymus function, apelarea metodei secantei se face cu
comanda:

>> [x k] = metoda_secantei(@(x)0.5*x.^3-4*x.^2+6*x-
2,0,1,1e-5,10)

3. Metoda tangentei

Metoda Newton-Raphson poate fi folosită pentru a rezolva problemele la care metodele


bisecţiei sau secantei nu se pot aplica. Metoda cere ca să existe prima derivată a funcţiei f(x) şi să
fie continuă în vecinătatea soluţiei. Strategia metodei Newton-Raphson constă în aproximarea
curbei f(x) prin tangenta sa într-o estimare oarecare.

Metoda tangentei – MATLAB – metoda_newton.m

% metoda_newton.m

% metoda_newton.m pentru determinarea radacinilor ecuației

% f(x) = 0 folosind metoda Newton

function [x,fx,xx] = metoda_newton(f,df,x0,TolX,MaxIter)

%input: f = functia care se va defini printr-o M-fila sau inline

% df = df(x)/dx (daca nu este data derivata de utilizator)

% x0 = valoarea initiala de start al algoritmului

% TolX = limita superioara pentru |x(k) - x(k-1)|

% MaxIter = maximum pentru numarul de iteratii

%output: x = valoarea (punctul) solutiei aproximate


% fx = f(x(final)), xx = istoria lui x

h = 1e-4; h2 = 2*h; TolFun=eps;

if nargin == 4 & isnumeric(df)

MaxIter = TolX; TolX = x0; x0 = df;

end

xx(1) = x0; fx = feval(f,x0);

for k = 1: MaxIter

if ~isnumeric(df), dfdx = feval(df,xx(k)); % derivata

else dfdx = (feval(f,xx(k) + h)-feval(f,xx(k) - h))/h2;

%derivarea numerica

end

dx = -fx/dfdx;

xx(k+1) = xx(k)+dx;

fx = feval(f,xx(k + 1));

if abs(fx)<TolFun | abs(dx) < TolX,

break;

end

end

xx = xx'

x = xx(k + 1);

if k <= MaxIter, fprintf('Aproximatia dupa %d iteratii\n',k)

end

În acest cod Matlab avem două variante de a introduce funcția și derivata ei:

- varianta1 : scriem un script funcție M-file în care vom defini funcția și derivata ei.
- varianta2 : funcția se introduce ca funcție inline și derivata ei este calculată numeric în
codul Matlab.

Exemplul 3:

Fie ecuația 𝒇(𝒙) = 𝒙𝟑 − 𝟑𝒙 − 𝟐 = 𝟎. Aceasta are rădăcina dublă x1 = x2 = -1.

Vom ȋncerca determinarea acestei rădăcini cu metoda tangentei.

Varianta 1: x0 = 0

x0=0;

f=inline('x.^3-3*x-2','x')
[x,fx,xx] = metoda_newton(f,x0,1e-4,10)

Varianta 2: x0 = -2

Creem fisierul script funcție f_ex_3.m pentru introducerea funcției și a derivatei funcției:

function f = f_ex_3(x)

f = x.^3-3*x-2;

df = 3*x.^2-3;

Apoi in consolă apelăm metoda tangentei astfel:

>> [x,fx,xx] = metoda_newton(@f_ex_3,-2,1e-4,20)

Exerciții

1. Determinați folosind metoda secantei soluțiile ecuației 𝑒 𝑥 − 3𝑥 2 =0, pe intervalul [3,5].


2. Determinați cu o eroare de 10-4 folosind metoda Newton-Raphson zerourile polinoamelor
𝑓(𝑥) = 𝑥 5 − 𝑥 4 + 2𝑥 3 − 3𝑥 2 + 𝑥 − 4 și 𝑔(𝑥) = 𝑥 3 − 2𝑥 2 − 5, pentru x0 = 0. Utilizați
ambele versiuni de utilizare a metodei tangentei.
3. Determinați cu o eroare de 10-4 o soluție a ecuației 600𝑥 4 − 550𝑥 3 + 200𝑥 2 − 20𝑥 −
1 = 0 𝑝𝑒𝑛𝑡𝑟𝑢 0.1 ≤ 𝑥 ≤ 1 utilizând metoda bisecției.
4. Determinați folosind metoda secantei soluțiile ecuației 2𝑥 cos(𝑥) − (𝑥 − 2)2 =0, pe
intervalul [2,3].
5. Determinați cu metoda bisecției pentru a determina cu o eroare de 10-2 soluția ecuației
𝑥 4 − 2𝑥 3 − 4𝑥 2 + 4𝑥 + 4 = 0

S-ar putea să vă placă și