You are on page 1of 10

UNIVERSITATEA DE STAT DIN MOLDOVA

FACULTATEA “MATEMATICA SI INFORMATICA”


SPECIALITATEA “INFORMATICA APLICATA”

Dare de seama
La: Calcul numeric
Laboratorul 1

Efectuat de: Ho Ngoc Trung


Verificat de: Capcelea Titu

Chisinau 2018
1) Cerințe pentru lucrarea de laborator N1 la disciplina Calcul Numeric
Se consideră ecuația f (x)  0, x [a,b] , unde funcția f x este definită interactiv sau este

selectată dintr-o colecție de funcții date. În baza pseudocodurilor elaborate pentru


rezolvarea prin metode iterative a ecuațiilor neliniare scalare, realizați o interfață grafică de
utilizator (GUI) MATLAB, care permite efectuarea următoarelor acțiuni:
I. Utilizatorului i se oferă posibilitatea să precizeze următoarele date:
1) Informația cu privire la ecuația f  x   0 , care este definită sau interactiv, sau se

selectează dintr-o colecție de probleme test. Colecția de ecuații va include următoarele date:
1a. 2sin 3x  ln(x3 1)  4  0; [a;b]  [2;9];
2a. sin( x 6)  cos(x 1)  0; [a;b]  [7;8];
3a. e x  x3  8cos 4x  0; [a;b]  [4; 4];

1b. x6  5.5x5  6.18x4 18.54x3  56.9592x2  55.9872x 19.3156  0; [a;b]  [3; 4];
2b. x6  0.7x5  8.7x4  5.58x3  22.356x2  8.39808x 19.3156  0; [a;b]  [3; 4];
3b. x6  2.4x5 18.27x4  23.216x3 115.7x2 19.5804x 164.818  0; [a;b]  [3; 4];

2) precizia de calcul   0 al rădăcinilor ecuației (  va varia între 105 1010 );


3) metoda iterativă ce urmează a fi aplicată la rezolvarea ecuației. Pentru calculul
rădăcinilor utilizatorul va selecta una dintre metodele iterative:
a) metoda bisecției; b) metoda Newton; c) metoda secantelor; d) metoda coardelor.
II) Localizarea tuturor rădăcinilor reale de pe intervalul [a,b] ale ecuației f (x)  0 , folosind
metoda tabelară în combinație cu metoda grafică;
III) Folosind metoda selectată, calculul cu precizia  a fiecărei rădăcini ce a fost localizată
pe [a,b] , valoarea  fiind definită de către utilizator. Se vor preciza inclusiv rădăcinile de
multiplicitate pară [a,b] .
IV) Afișarea în subferestrele interfeței grafice a următoarei informații:
 rădăcinile ecuației;
 valorile funcției f (x) în rădăcini;

 numărul de iterații efectuate cu metoda aplicată, necesar pentru a atinge exactitatea


cerută  ;
 pentru fiecare rădăcină se va indica timpul scurs până aceasta a fost determinată cu
precizia  ;
 pentru fiecare metodă afișați și reprezentați grafic variația erorii Cauchy xk 1  xk

(distanța dintre două iterații succesive) și a reziduului f (xk 1 ) pe parcursul iterațiilor.


2) Prezentarea metodelor și algoritmilor de soluționare.

Structura program:

Functia localize.m:
function [interval,i] = localize( a,b,h,f )
i=1;

x1=a;

x2=x1+h;
while(x2<b)

f1=f(x1);
f2=f(x2);
if f1*f2<0

interval(i,:)=[x1,x2];

x1=x2;
i=i+1;
end

x2=x2+h;
f1=f2;
end
end
Functia bisection.m:
function [data,err,m] = bisection(a, b, eps,f)
err=0;
y1 = f(a);
y2 = f(b);
i = 0;

if y1 * y2 > 0
disp('N-a gasit radicina');
m = 9999999999999999;
data(1,:)=[0,0,0,0];

err(1)=9999999999999999;
return;
end
while (abs(a - b) >= eps)
i = i + 1;
y1 = f(a);
y2 = f(b);
tic;
m = (a + b)/2;
y3 = f(m);
if y3 == 0

data(i,:)=[m,y3,i,toc];
radicina=m;
return
end

data(i,:)=[m,y3,i,toc];
% Update the limits
if y1 * y3 > 0

a = m;

else
b = m;
end

if i>1
err(i-1)=abs(m-m1);
end
m1=m;
end
Functia coardelor.m:
function [data,err,m] = coardelor( a,b,f,df2,eps )
if f(a)*df2(a)>0
x=b;
xf=a;
else
x=a;
xf=b;
end
tic;
k=0;
fx=f(x);
fxf=f(xf);
d=double((x-xf)*fx/(fx-fxf));
x=x-d;
fx=f(x);
k=k+1;

data(k,:)=[x,fx,k,toc];
m=x;
while(abs(d)>=eps || abs(fx)>=eps)

tic;
x0=x;
d=double((x-xf)*fx/(fx-fxf));
x=x-d;
fx=f(x);

data(k,:)=[x,fx,k,toc];
m=x;
err(k)=abs(x-x0);
k=k+1;
end
end

Functia newton.m:
function [data,err,x] = newton(a,b,eps, f, d1f, d2f)
i = 0;
if f(a) * d2f(a) > 0
x = a;
else
x = b;
end
d=1;
while(abs(d) >= eps)
i=i+1;

tic;
xs=x;
d=double(f(x)/d1f(x));
x=x-d;

err(i) = abs(xs-x);
y=f(x);

data(i,:)=[x,y,i,toc];
end

end
Functia scantelor.m:
function [data,err,m] = secantelor( a,b,f,df2,eps )
if f(a)*df2(a)>0
x0=a;
x=a+eps;
else
x0=b;
x=b-eps;
end
k=0;
tic;
d=x-x0;
fx0=f(x0);
fx=f(x);
d=double(d*fx/(fx0-fx));
x=x-d;
fx0=fx;
fx=f(x);

k=k+1;
data(k,:)=[x,fx,k,toc];
m=x;
while(abs(d)>=eps & abs(fx)>=eps)
tic;
x0=x;
d=double(d*fx/(fx0-fx));
x=x-d;
fx0=fx;
fx=f(x);

data(k,:)=[x,fx,k,toc];
m=x;
err(k)=abs(x-x0);
k=k+1;
end
end

In fisierul United.m , am creat codul pentru function cal_Callback()

function cal_Callback(hObject, eventdata, handles)


% hObject handle to cal (see GCBO)
% eventdata reserved - to be defined in a1 future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
a=str2double(get(handles.a1, 'String'));
b=str2double(get(handles.b, 'String'));
eps=str2double(get(handles.eps, 'String'));
contents = cellstr(get(handles.metoda,'String'));
metoda=contents{get(handles.metoda,'Value')}
if get(handles.colect,'Value')==1
contents = cellstr(get(handles.popupmenu2,'String'));
functia=contents{get(handles.popupmenu2,'Value')}
else
functia=get(handles.edit10,'String');
end

f=@(x) eval(functia);
syms x;
%tinh dao ham bac 1 va 2
df1(x)=diff(f,x);
df2(x)=diff(df1,x);
cla;
if strcmpi(metoda,'Metoda bisectie')
axes(handles.axes1);
[loc,i]=localize(a,b,0.01,f);
for k = 1:i-1
[data,err,rad]=bisection(loc(k,1),loc(k,2),eps,f);
set(handles.dit,'Data',data);
xx=[a:b];
plot(rad,0,'r*','linewidth',7);
hold on;
end;

fplot(f ,[a b]);


hold off;
elseif strcmpi(metoda,'Metoda Newton')

[loc,i]=localize(a,b,0.01,f);
cla;
fplot(f ,[a b]);

for k = 1:i-1

[data,err,rad]=newton(loc(k,1),loc(k,2),eps, f, df1, df2);


set(handles.dit,'Data',data);
axes(handles.axes1);f=@(x) eval(functia);
i=i+1;
hold on;
xx=[a:b];
plot(rad,0,'r*','linewidth',7);

hold off;

end;

elseif strcmpi(metoda,'Metoda secantelor')


[data,err,rad]=secantelor(a,b,f,df2,eps);
set(handles.dit,'Data',data);
axes(handles.axes1);f=@(x) eval(functia);

elseif strcmpi(metoda,'Metoda coardelor')


[data,err,rad]=coardelor(a,b,f,df2,eps);
set(handles.dit,'Data',data);
axes(handles.axes1);f=@(x) eval(functia);

end;

axes(handles.axes5);
plot(err,'r*','linewidth',7);
xlabel('Nr de interatii');
ylabel('Error');
3) Analiza rezultatelor și concluzii cu privire la eficiența metodelor
implementate. Se vor compara rezultatele obținute prin diferite metode
(eficiența lor relativă în rezolvarea problemei date) și se va evidenția
metoda optimă pentru rezolvarea ecuațiilor considerate.

Rezultatul: Pentru functia x*cos(x) – sin(x)

Metoda Bisectie

Metoda Newton:
Metoda Secantelor:

Metoda Coardelor:
Concluzii

Prin exemplu rezvolvare functiei x*cos(x) – sin(x), metoda optimă


pentru rezolvarea ecuatie este metoda Newton

You might also like