EPSEM-UPC
Dep. Matemática Aplicada III E.T.S Minas: Métodos matemáticos Octubre, 2008 Versión 1.3
Profesor: Francisco Palacios
Práctica Tema 6: Integración numérica
Contenido• Cálculo de primitivas • Integrales definidas
• Aproximación de integrales usando polinomios interpoladores • Fórmulas simples
• Librería student: sumas de Riemman • Cálculo de trapecio compuesto con trapezoid • Cálculo de Simpson compuesto con simpson
Cálculo de primitivas, comando int
Integral de una expresión.> f:=x*exp(x); F:=int(f,x); := f x ex := F x ex − ex Integral de una función: es preciso incluir la variable.
> g:=x->x^2*ln(x);
:=
g x → x2ln x( )
> G:=int(g,x);#no funciona, g es función, debemos escribir g(x)
:= G g x > G:=int(g(x),x); := G 1 − 3x 3 ( ) ln x 1 9x 3
Si Maple no puede calcular una primitiva, la devuelve indicada. > int(sin(x^3)*cos(x^2),x); d ⌠ ⌡ ⎮ ⎮ ( )sin x3 cos x( 2) x > int(x^3*cos(x^3),x); d ⌠ ⌡ ⎮ ⎮x3 ( ) cos x3 x
Maple incorpora algunas funciones especiales que son primitivas de funciones. > int(sin(x)/x,x); ( ) Si x > int(exp(x^2),x); −1 2I πerf I x( ) > int(x^4*sin(x^2),x); −1 + − 2x 3 ( ) cos x2 3 4xsin x( ) 2 3 8 2 π ⎛ ⎝ ⎜ ⎜⎜ ⎞⎠⎟⎟⎟ FresnelS 2 x π >
Cálculo de integrales definidas
Cálculo exacto. Integral de una expresión. > f:=x^2;v:=int(f,x=a..b);
:= f x2 := v 1 − 3b 3 1 3a 3
Cálculo exacto. Integral de una función. > g:=x->x^3*cos(x^3); v:=int(g(x),x=1..4); := g x → x3cos x( 3) := v ⌠ d ⌡ ⎮ ⎮ 1 4 x3cos x( 3) x
Cálculo numérico. Usar límites decimales, o usar evalf > g:=x->x^3*cos(x^3); v:=int(g(x),x=1..4); vf:=evalf(v); := g x → x3cos x( 3) := v ⌠ d ⌡ ⎮ ⎮ 1 4 x3cos x( 3) x := vf .8781165278 > f:=x^4*sin(x^3); v:=int(f,x=2..4); vf:=evalf(v); := f x4sin x( 3) := v ⌠ d ⌡ ⎮ ⎮ 2 4 x4sin x( 3) x := vf -2.342794504 >
Aproximación usando polinomios interpoladores
Podemos aproximar una integral definida integrando un polinomio interpolador del integrando. > f:=x->x^4*sin(x^3); := f x → x4sin x( 3) > plot(f(x),x=0..1); x 0.6 0.8 1 0.4 0.2 0.8 0.6 0.4 0.2 0
Interpolador de f con 6 nodos, paso h=(b-a)/5=0.2 > xx:=[0,0.2,0.4,0.6,0.8,1.0]; yy:=map(f,xx); p:=interp(xx,yy,x); := xx [0 .2 .4 .6 .8 1.0, , , , , ] := yy [0 .00001279986347 .001637281748 .02777642901 .2006719522 .8414709848, , , , , ] := p 2.592882701 x5 − 2.598819381 x4 + 1.002846043 x3 − .1650380980 x2 + .009599719913 x
Valor aproximado de la integral. > vp:=int(p,x=0..1);
:=
vp .1128819120
Valor exacto. > v:=int(f(x),x=0..1); := v ⌠ d ⌡ ⎮ ⎮ 0 1 x4sin x( 3) x > vf:=evalf(v); := vf .1135043590 Error. > er:=vf-vp; := er .0006224470 >
Fórmulas simples
Fórmula del trapecio> f:=x->x^2*sin(x^2); a:=0; b:=1.0; plot(f(x),x=a..b); := f x → x2sin x( 2) := a 0 := b 1.0 x 0.6 0.8 1 0.4 0.2 0.8 0.6 0.4 0.2 0
A la vista del gráfico, podemos predecir que la aproximación usando el trapecio simple será poco precisa. > h:=b-a; vt:=h/2*(f(a)+f(b)); vtf:=evalf(vt); := h 1.0 := vt .4207354924 := vtf .4207354924
Calculamos el valor exacto y el error. > v:=int(f(x),x=a..b); vf:=evalf(v); er:=vf-vtf; := v .1821109658 := vf .1821109658 := er -.2386245266 Fórmula de Simpson
Para la misma integral, la fórmula de Simpson ha de tener un comportamiento notablemente mejor. > f:=x->x^2*sin(x^2); a:=0; b:=1.0; h:=(b-a)/2; vs:=h/3*(f(a)+4*f(a+h)+f(b)); := f x → x2sin x( 2) := a 0
Page 3
:= b 1.0 := h .5000000000 := vs .1814791573 Calculamos el error > v:=int(f(x),x=a..b); vf:=evalf(v); er:=vf-vs; := v .1821109658 := vf .1821109658 := er .0006318085 >
Librería student; sumas de Riemman
La librería student contiene comandos útiles para la aprendizaje de algunos conceptos. > with(student);
D Diff Doubleint Int Limit Lineint Product Sum Tripleint changevar combine completesquare distance equate, , , , , , , , , , , , , , [
extrema integrand intercept intparts isolate leftbox leftsum makeproc maximize middlebox middlesum midpoint, , , , , , , , , , , ,
minimize powsubs rightbox rightsum showtangent simpson slope trapezoid value, , , , , , , , ]
El comando middlebox dibuja una suma de Riemman de n tramos evaluando la función en el punto central de cada tramo. El comando middlesum calcula el valor de la suma de Riemman representada por middlebox.
> f:=x->x^2*sin(x^2); a:=0;
b:=1;
n:=10;#número de intervalos
middlebox(f(x),x=a..b,n,title=`Aproximación con punto central`); `******** cálculo de la suma con punto central *******`;
ms:=middlesum(f(x),x=a..b,n); msf:=evalf(ms);
`********* valor exacto y error *****`; v:=int(f(x),x=a..b); vf:=evalf(v); er:=vf-msf; := f x → x2sin x( 2) := a 0 := b 1 := n 10 x 1 0.8 0.6 0.4 0.2 0.8 0.6 0.4 0.2 0
Aproximación con punto central
******** cálculo de la suma con punto central *******
Page 4
:= ms 1 10 ⎛ ⎝ ⎜ ⎜⎜
∑
⎞⎠⎟⎟⎟ = i 0 9 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ + 1 10i 1 20 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ + 1 10i 1 20 2 := msf .1809568712********* valor exacto y error *****
:= v −1 + 2cos 1( ) 1 4 2 π ⎛ ⎝ ⎜ ⎜⎜ ⎞⎠⎟⎟⎟ FresnelC 2 π := vf .1821109658 := er .0011540946
Acotación de error para funciones crecientes
Si la función a integrar es creciente en el intervalo de integración, el comando leftsum proporciona una aproximación por defecto y el comando rightsum proporciona una aproximación por exceso, por lo tanto, la diferencia nos proporciona una estimación del error.
> f:=x->x^2*sin(x^2); a:=0;
b:=1;
n:=30;#número de intervalos
leftbox(f(x),x=a..b,n,title=`Aproximación con punto izquierdo`); rightbox(f(x),x=a..b,n,title=`Aproximación con punto derecho`); `******** cálculo de la suma con punto central *******`;
ms:=middlesum(f(x),x=a..b,n); msf:=evalf(ms); `********* cota de error *****`; ls:=leftsum(f(x),x=a..b,n); rs:=rightsum(f(x),x=a..b,n); cota_err:=evalf(rs-ls);
`********* valor exacto y error *****`; v:=int(f(x),x=a..b); vf:=evalf(v); er:=vf-msf; := f x → x2sin x( 2) := a 0 := b 1 := n 30 x 0.6 0.8 1 0.4 0.2 0.8 0.6 0.4 0.2 0
Aproximación con punto izquierdo
x 0.6 0.8 1 0.4 0.2 0.8 0.6 0.4 0.2 0
Aproximación con punto derecho
******** cálculo de la suma con punto central *******
:= ms 1 30 ⎛ ⎝ ⎜ ⎜⎜
∑
⎞⎠⎟⎟⎟ = i 0 29 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ + 1 30i 1 60 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ + 1 30i 1 60 2 := msf .1819829916 ********* cota de error ***** := ls 1 30 ⎛ ⎝ ⎜ ⎜⎜∑
⎞⎠⎟⎟⎟ = i 0 29 ⎛ ⎝ ⎜⎜ 1 ⎞⎠⎟⎟ 900i 2 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 1 900i 2 := rs 1 30 ⎛ ⎝ ⎜ ⎜⎜∑
⎞⎠⎟⎟⎟ = i 1 30 ⎛ ⎝ ⎜⎜ 1 ⎞⎠⎟⎟ 900i 2 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 1 900i 2 := cota_err .0280490328********* valor exacto y error *****
:= v −1 + 2cos 1( ) 1 4 2 π ⎛ ⎝ ⎜ ⎜⎜ ⎞⎠⎟⎟⎟ FresnelC 2 π := vf .1821109658 := er .0001279742
Repetimos los cálculos con 60 tramos. > f:=x->x^2*sin(x^2);
a:=0; b:=1;
n:=60;#número de intervalos
leftbox(f(x),x=a..b,n,title=`Aproximación con punto izquierdo`); rightbox(f(x),x=a..b,n,title=`Aproximación con punto derecho`); `******** cálculo de la suma con punto central *******`;
ms:=middlesum(f(x),x=a..b,n); msf:=evalf(ms); `********* cota de error *****`; ls:=leftsum(f(x),x=a..b,n); rs:=rightsum(f(x),x=a..b,n); cota_err:=evalf(rs-ls);
`********* valor exacto y error *****`; v:=int(f(x),x=a..b); vf:=evalf(v); er:=vf-msf; := f x → x2sin x( 2) := a 0 := b 1 := n 60
Page 6
x 1 0.8 0.6 0.4 0.2 0.8 0.6 0.4 0.2 0
Aproximación con punto izquierdo
x 1 0.8 0.6 0.4 0.2 0.8 0.6 0.4 0.2 0
Aproximación con punto derecho
******** cálculo de la suma con punto central *******
:= ms 1 60 ⎛ ⎝ ⎜ ⎜⎜
∑
⎞⎠⎟⎟⎟ = i 0 59 ⎛ ⎝ ⎜⎜ 1 + ⎞⎠⎟⎟ 60i 1 120 2 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin ⎛ ⎝ ⎜⎜ 1 + ⎞⎠⎟⎟ 60i 1 120 2 := msf .1820789785 ********* cota de error ***** := ls 1 60 ⎛ ⎝ ⎜ ⎜⎜∑
⎞⎠⎟⎟⎟ = i 0 59 ⎛ ⎝ ⎜⎜ 1 ⎞⎠⎟⎟ 3600i 2 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 1 3600i 2 := rs 1 60 ⎛ ⎝ ⎜ ⎜⎜∑
⎞⎠⎟⎟⎟ = i 1 60 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ 1 3600i 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin 1 3600i 2 := cota_err .0140245163********* valor exacto y error *****
:= v −1 + 2cos 1( ) 1 4 2 π ⎛ ⎝ ⎜ ⎜⎜ ⎞⎠⎟⎟⎟ FresnelC 2 π := vf .1821109658 := er .0000319873
Vemos que la cota de error calculada es muy conservadora. >
El comando trapezoid nos permite calcular el valor de la regla del trapecio compuesto. Trapecio compuesto con 3 tramos. Cálculo directo usando la fórmula.
> f:=x->x^2*sin(x^2); a:=0; b:=1; n:=3; h:=(b-a)/n; vtc:=h/2*(f(a)+2*f(a+h)+2*f(a+2*h)+f(b)); vtcf:=evalf(vtc); := f x → x2sin x( 2) := a 0 := b 1 := n 3 := h 1 3 := vtc 1 + + 27 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 1 9 4 27 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 4 9 1 6sin 1( ) := vtcf .2080491672
Cálculo usando el comando trapezoid de la librería student. > vt3:=trapezoid(f(x),x=a..b,3); vt3f:=evalf(vt3); := vt3 1 + 3 ⎛ ⎝ ⎜ ⎜⎜
∑
⎞⎠⎟⎟⎟ = i 1 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ 1 9i 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin 1 9i 2 1 6sin 1( ) := vt3f .2080491673Determinanción del número de tramos para asegurar 5 decimales exactos usando trapecio compuesto. La cota de error es Etc<=M2/12*(b-a)*h^2, con h=(b-a)/n, n=número de tramos.
Empezamos determinando M2 gráficamente. > restart; with(student): > f:=x->x^2*sin(x^2); a:=0; b:=1; f2:=diff(f(x),x$2); plot(abs(f2),x=a..b); := f x → x2sin x( 2) := a 0 := b 1 :=
f2 2sin x( 2) + 10 x2cos x( 2) − 4 x4sin x( 2)
x 0.6 0.8 1 0.4 0.2 5 4 3 2 1 0
Observando el gráfico, podemos tomar m2=5.4. > m2:=5.4;
h:=(b-a)/n; ineq:=m2/12*(b-a)*h^2<0.5*10^(-5); solve(ineq,n); := m2 5.4 := h 1 n := ineq .4500000000 < n2 .5000000000 10 -5 , ( )
RealRange −∞,Open -300.( ) RealRange(Open 300.( ),∞)
Necesitamos calcular trapecio compuesto con 300 tramos. > n:=300; vt.n:=trapezoid(f(x),x=a..b,n); vtf.n:=evalf(vt.n); := n 300 := vt300 1 + 300 ⎛ ⎝ ⎜ ⎜⎜
∑
⎞⎠⎟⎟⎟ = i 1 299 ⎛ ⎝ ⎜⎜ 1 ⎞⎠⎟⎟ 90000i 2 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 1 90000i 2 1 600sin 1( ) := vtf300 .1821135248Calculamos el valor exacto y el error. > v:=int(f(x),x=a..b); vf:=evalf(v); er.n:=abs(vf-vtf.n); := v −1 + 2cos 1( ) 1 4 2 π ⎛ ⎝ ⎜ ⎜⎜ ⎞⎠⎟⎟⎟ FresnelC 2 π := vf .1821109658 := er300 .25590 10-5
Vemos que, efectivamente, nuestra aproximación tiene 5 decimales exactos.
Librería student, comando simpson
El comando simpson nos permite calcular el valor de la regla compuesta de Simpson. Se indica el número de subintervalos que es el doble del número de tramos. El número de subintervalos debe de ser par.
Empezamos calculando el valor de Simpson doble usando la fórmula. > f:=x->x^2*sin(x^2); a:=0; b:=1; m:=2;# número de tramos h:=(b-a)/(2*m); vsc:=h/3*(f(a)+4*f(a+h)+2*f(a+2*h)+4*f(a+3*h)+f(b)); vscf:=evalf(vsc); := f x → x2sin x( 2) := a 0 := b 1 := m 2 := h 1 4 := vsc 1 + + + 48 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 1 16 1 24 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 1 4 3 16 ⎛ ⎝ ⎜⎜ ⎞⎠⎟⎟ sin 9 16 1 12sin 1( ) := vscf .1817265675
Ahora calculamos el mismo valor usando la librería student. > with(student);
Warning, new definition for D
D Diff Doubleint Int Limit Lineint Product Sum Tripleint changevar combine completesquare distance equate, , , , , , , , , , , , , , [
extrema integrand intercept intparts isolate leftbox leftsum makeproc maximize middlebox middlesum midpoint, , , , , , , , , , , ,
minimize powsubs rightbox rightsum showtangent simpson slope trapezoid value, , , , , , , , ]
Para m=2 tramos, el número de subintervalos es n=2*m=4. > vs2:=simpson(f(x),x=a..b,4);
Page 10
vtf2:=evalf(vs2); := vs2 1 + + 12sin 1( ) 1 3 ⎛ ⎝ ⎜ ⎜⎜
∑
⎞⎠⎟⎟⎟ = i 1 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ − 1 2i 1 4 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ − 1 2i 1 4 2 1 6 ⎛ ⎝ ⎜ ⎜⎜∑
⎞⎠⎟⎟⎟ = i 1 1 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ 1 4i 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin 1 4i 2 := vtf2 .1817265675A continuación, vamoa a determinar el número de tramos necesario para aproximar la integral con 5 decimales exactos mediante Simpson compuesto.
La cota de error es Etc<=M4/180*(b-a)*h^4 h=(b-a)/(2*m) Determinamos gráficamente M4. > restart; with(student): f:=x->x^2*sin(x^2); a:=0; b:=1; f4:=diff(f(x),x$4); plot(abs(f4),x=a..b); := f x → x2sin x( 2) := a 0 := b 1 :=
f4 −156 x2sin x( 2) + 24cos x( 2) − 112 x4cos x( 2) + 16 x6sin x( 2)
x 1 0.8 0.6 0.4 0.2 160 140 120 100 80 60 40 20 0
podemos tomar m4=166. Calculamos el número de tramos m. > m4:=166; h:=(b-a)/(2*m); ineq:=m4/180*(b-a)*h^4<0.5*10^(-5); solve(ineq,m); := m4 166 := h 1 2 1 m := ineq 83 < 1440 1 m4 .5000000000 10 -5 , ( )
RealRange −∞,Open -10.36182848( ) RealRange(Open 10.36182848( ),∞)
Vemos que necesitamos m=11 tramos. Calculamos el valor de Simpson compuesto de 11 tramos. > m:=11; vs.m:=simpson(f(x),x=a..b,2*m); vsf.m:=evalf(vs.m); := m 11
Page 11
:= vs11 1 + + 66sin 1( ) 2 33 ⎛ ⎝ ⎜ ⎜⎜
∑
⎞⎠⎟⎟⎟ = i 1 11 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ − 1 11i 1 22 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ − 1 11i 1 22 2 1 33 ⎛ ⎝ ⎜ ⎜⎜∑
⎞⎠⎟⎟⎟ = i 1 10 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ 1 121i 2 ⎛ ⎝ ⎜⎜ ⎞ ⎠ ⎟⎟ sin 1 121i 2 := vsf11 .1821104551Para acabar, comparamos nuestro valor con el valor de la integral calculado con . > v:=int(f(x),x=a..b); vf:=evalf(v); er:=vf-vsf.m; := v −1 + 2cos 1( ) 1 4 2 π ⎛ ⎝ ⎜ ⎜⎜ ⎞⎠⎟⎟⎟ FresnelC 2 π := vf .1821109658 := er .5107 10-6 >