20.07.2013 Views

Software matematic

Software matematic

Software matematic

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

120 Funct¸ii de funct¸ii<br />

function y=xsin(x) y=x.*sin(x);<br />

Aproximanta se obt¸ine astfel:<br />

>> quad(@xsin,0,pi)<br />

ans =<br />

3.1416<br />

Rutina quad este o implementare a unei cuadraturi adaptive de tip Simpson, as¸a<br />

cum se descrie în sect¸iunea ?? sau în [15]. quadl este mai precisă s¸i se bazează pe<br />

o cuadratură de tip Gauss-Lobatto cu 4 puncte (s¸i grad de exactitate 5) s¸i o extensie<br />

a ei de tip Kronrod cu 7 puncte (s¸i grad de exactitate 9), ambele descrise în [3]. Cuadratura<br />

este adaptivă. Ambele funct¸ii dau mesaje de avertisment dacă subintervalele<br />

devin prea mici sau dacă s-au făcut excesiv de multe evaluări. Astfel de mesaje indică<br />

posibile singularităt¸i.<br />

Pentru a ilustra modul de lucru al lui quad s¸i quadl vom aproxima integrala<br />

1<br />

0<br />

<br />

1<br />

(x−0.3) 2 +0.01 +<br />

1<br />

(x−0.09) 2 +0.04 −6<br />

<br />

dx.<br />

Integrandul este funct¸ia MATLAB humps, folosită la testarea rutinelor de integrare<br />

numerică sau de demo-urile din MATLAB. Vom aplica quad acestei funct¸ii cu<br />

tol=1e-4. Figura 5.1 reprezintă integrandul s¸i marchează punctele de pe axa x<br />

în care se evaluează integrandul; cercurile corespund valorilor integrandului. Figura<br />

arată că subintervalele sunt mai mici acolo unde integrandul variază mai rapid. Ea<br />

a fost obt¸inută modificând funct¸ia quad din MATLAB. Următorul exemplu aproximează<br />

integralele lui Fresnel<br />

x(t) =<br />

t<br />

0<br />

cos(u 2 )du, y(t) =<br />

t<br />

0<br />

sin(u 2 )du.<br />

Acestea sunt ecuat¸iile parametrice ale unei curbe, numită spirala lui Fresnel. Ea a fost<br />

reprezentată în figura 5.2, considerând 1000 de puncte t echidistante din intervalul<br />

[−4π,4π]. Din motive de eficient¸ă, vom exploata simetria s¸i vom evita integrarea<br />

repetată pe[0,t], integrând pe fiecare subinterval s¸i evaluând integralele cu cumsum:<br />

n = 1000; x = zeros(1,n); y = x;<br />

i1 = inline(’cos(x.ˆ2)’); i2 = inline(’sin(x.ˆ2)’);<br />

t=linspace(0,4*pi,n);<br />

for i=1:n-1<br />

x(i) = quadl(i1,t(i),t(i+1),1e-3);<br />

y(i) = quadl(i2,t(i),t(i+1),1e-3);<br />

end<br />

x = cumsum(x); y = cumsum(y);<br />

plot([-x(end:-1:1),0,x], [-y(end:-1:1),0,y])<br />

axis equal

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!