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