CÁLCULO NUMÉRICO (521230)
LABORATORIO 6 - 2017-2
Integración Numérica
Contents
EJERCICIO 1
1.2 Testee su programa con las siguientes integrales y :
clc;clear;close all N = [10;20;40;80]; f_1=@(x)x^2; f_2=@(x)exp(-x^2); f_3=@(x)log(x); f_4=@(x)sqrt(x); for i=1:4 I(i,1) = trap(f_1,0,3,N(i)); I(i,2) = trap(f_1,-1,1,N(i)); I(i,3) = trap(f_1,1,2,N(i)); I(i,4) = trap(f_1,0,1,N(i)); end format short disp('I = ') disp(I)
clc;clear;close all N = [10;20;40;80]; f_1=@(x)x^2; f_2=@(x)exp(-x^2); f_3=@(x)log(x); f_4=@(x)sqrt(x); for i=1:4 I(i,1) = simpson(f_1,0,3,N(i)); I(i,2) = simpson(f_1,-1,1,N(i)); I(i,3) = simpson(f_1,1,2,N(i)); I(i,4) = simpson(f_1,0,1,N(i)); end format short disp('I = ') disp(I)
EJERCICIO 2
2.2 Calcule mediante quad las integrales y del Ejercicio 1.2, primero con la tolerancia prefijada por el comando y después con error menor que .
clc;clear;close all f_1 = @(x)exp(-x.^2); f_2 = @(x)sqrt(x); I(1,1) = quad(f_1,-1,1); I(2,1) = quad(f_1,-1,1,1e-10); I(1,2) = quad(f_2,0,1); I(2,2) = quad(f_2,0,1,1e-10); format long disp('I = ') disp(I)
I = 1.493648276062878 0.666659569272020 1.493648265653887 0.666666666030499
EJERCICIO 4
4.1 Haga un programa que calcule la integral por la regla de los trapecios con subintervalos y almacene los errores respectivos. En este caso, para calcular el error utilice el valor verdadero de la integral, el cual puede calcularse exactamente.
clc;clear;close all e = exp(1); vreal = (e-1)/e; N = 10:10:100; f = @(x)exp(-x); for i=1:10 err(i) = abs(vreal - trap(f,0,1,N(i))); end
4.2 Grafique en escala logarítmica estos errores versus y la función .
Sugerencia: para graficar en escala logarítmica utilice el comando loglog en lugar de plot; la sintaxis de ambos comandos es la misma.
loglog(N,err,'r',N,(1./N).^2,'b'); title('Error de integraci\''on'); legend('Error','$O(h^2)$')
EJERCICIO 5
5.1 Repita el ejercicio anterior con la integral .
clc;clear;close all vreal = 2/3; N = 10:10:100; f = @(x)sqrt(x); for i=1:10 err(i) = abs(vreal - trap(f,0,1,N(i))); end figure loglog(N,err,'r',N,(1./N).^2,'b'); legend('Error','$O(h^2)$')
5.2 Para estimar el orden de convergencia del método en este caso, determine por cuadrados mínimos las constantes y que mejor ajustan los errores mediante el modelo
b = log(err)';
A = [ones(10,1) log(1./N)'];
x = A\b;
C = x(1);
alpha = x(2);
disp('alpha = ');
disp(alpha)
alpha = 1.481113215549433
5.3 Grafique en escala logarítmica los errores versus y la función .
figure loglog(N,err,'r',N,(1./N).^(alpha),'b'); title('Error de integraci\''on'); legend('Error','$O(h^\alpha)$')
EJERCICIO 6
6.1. Encuentre el área entre las curvas (x,f(x)) y (x,g(x)) con f(x) = exp(x - x^2), g(x) = arctan(x^2), x in [-3, 3].
clc;clear;close all f = @(x)exp(x - x.^2); g = @(x)atan(x.^2); xx = linspace(-3,3); plot(xx,f(xx),'b-',xx,g(xx),'r-'); grid on legend('$f(x)$','$g(x)$'); h1 = @(x)f(x) - g(x); %dado que f > g h2 = @(x)g(x) - f(x); %dado que g < f a = fzero(h1,[-1 0]); %se puede encontrar las raíces de h1 o h2 b = fzero(h2,[1 2]); area = quad(h2,-3,a) + quad(h1,a,b) + quad(h2,b,3); disp('El área entre las curvas f y g es: '); disp(area);
El área entre las curvas f y g es: 5.847004659652072
6.2 Encuentre todos los valores de x in [-3,3] tales que $ Utilice para ello fzero y quad de manera adecuada.
clc;clear;close all I = @(x)quad(@(t)sin(t.^2),0,x); xx = linspace(-3,3); plot(xx,arrayfun(I,xx),'b',[-3 3],[sqrt(pi)/4 sqrt(pi)/4],'r--'); grid on legend({'$I(x)$','$\frac{\sqrt{\pi}}{4}$'},'FontSize',12,'Location','southeast'); grid on v1 = fzero(@(x)I(x) - sqrt(pi)/4,1); v2 = fzero(@(x)I(x) - sqrt(pi)/4,2.5); fprintf('La función I(x), definida por la integral propuesta, alcanza el valor pedido en x = %f y x = %f \n',v1,v2);
La función I(x), definida por la integral propuesta, alcanza el valor pedido en x = 1.145941 y x = 2.434710
EJERCICIO 7
7.2 Pruebe su función para distintos valores y las siguientes funciones:
- .
- .
Observe qué ocurre a medida que crecen los valores de .
clc;clear;close all f_1 = @(x)ones(1,numel(x)); f_2 = @(x)x; f_3 = @(x)(x < 0).*1 + (x >= 0).*x.^2; N = [1;2;5;10]; figure k = linspace(0,1,1000); hold on plot(k,f_1(k),'k','linewidth',0.5) for i=1:numel(N) SFn(f_1,0,1,N(i)) end hold off legend('$f(x)$','$SF_1$','$SF_2$','$SF_5$','$SF_{10}$') figure k = linspace(-1,2,1000); hold on plot(k,f_2(k),'k','linewidth',1.5) for i=1:numel(N) SFn(f_2,-1,2,N(i)) end hold off legend('$g(x)$','$SF_1$','$SF_2$','$SF_5$','$SF_{10}$') figure k = linspace(-2,1,1000); hold on plot(k,f_3(k),'k','linewidth',1.5) for i=1:numel(N) SFn(f_3,-2,1,N(i)) end hold off legend('$h(x)$','$SF_1$','$SF_2$','$SF_5$','$SF_{10}$')
7.3 Modifique la función anterior para que calcule la Suma parcial de Fourier en el intervalo , pero que grafique dicha suma en el intervalo , con . ¿Qué se puede observar?
Cambiando el linspace de SFn, de k = linspace(a,b,1000) a k = linspace(a - L, b + L,1000), en una función SFn2, tenemos:
figure k = linspace(0,1,1000); hold on plot(k,f_1(k),'k','linewidth',0.5) for i=1:numel(N) SFn2(f_1,0,1,N(i)) end hold off legend('$f(x)$','$SF_1$','$SF_2$','$SF_5$','$SF_{10}$') figure k = linspace(-1,2,1000); hold on plot(k,f_2(k),'k','linewidth',1.5) for i=1:numel(N) SFn2(f_2,-1,2,N(i)) end hold off legend('$g(x)$','$SF_1$','$SF_2$','$SF_5$','$SF_{10}$') figure k = linspace(-2,1,1000); hold on plot(k,f_3(k),'k','linewidth',1.5) for i=1:numel(N) SFn2(f_3,-2,1,N(i)) end hold off legend('$h(x)$','$SF_1$','$SF_2$','$SF_5$','$SF_{10}$')
EJERCICIO 8
Escriba un rutero MATLAB en el que:
- Grafique 200 puntos sobre la elipse de ecuacion paramétrica .
- Encuentre, con ayuda del comando quad o del comando quadl una aproximación al perímetro de la elipse antes graficada. Tenga en cuenta que éste es igual a
clc;clear;close all x = @(t)3*cos(t); y = @(t)5*sin(t); t = linspace(-pi,pi,200); plot(x(t),y(t),'m'); title('Elipse') axis([-5 5 -5 5]) grid on p = @(t)(sqrt((-3.*sin(t)).^2 + (5.*cos(t)).^2)); per = quad(p,-pi,pi); disp('El perímetro de la elipse es =') disp(per)
El perímetro de la elipse es = 25.526998885744735
FUNCIONES
1.1 Escriba en un archivo trap.m un programa tipo function que calcule la aproximación de la integral de una función dada en un intervalo genérico por la regla de los trapecios con subintervalos.
function int = trap(f,a,b,N) h = (b-a)/N; %tamaño de paso x = a:h:b; sum = 0; %variable que almacena el valor de la suma for i=2:N %considerar que x(1) = a, x(2) = a + h, ... x(N) = b - h sum = sum + f(x(i)); end int = h*((f(a)+f(b))/2 + sum); end
I = 9.0450 0.6800 2.3350 0.3350 9.0112 0.6700 2.3337 0.3337 9.0028 0.6675 2.3334 0.3334 9.0007 0.6669 2.3334 0.3334
1.3 Haga un programa semejante para la regla de Simpson. Guárdelo en un archivo simpson.m y testeelo con las mismas funciones.
function int = simpson(f,a,b,N) x = linspace(a,b,2*N+1); sumi = f(x(2*N)); %suma impar, con valor inicial f(x_2n-1) sump = 0; %suma par for i=3:2:(2*N)-1 sumi = sumi + f(x(i-1)); sump = sump + f(x(i)); end int = ((b-a)/(2*N))/3 * (f(a) + f(b) + 4*sumi + 2*sump); end
I = 9.0000 0.6667 2.3333 0.3333 9.0000 0.6667 2.3333 0.3333 9.0000 0.6667 2.3333 0.3333 9.0000 0.6667 2.3333 0.3333
Versión alternativa
function int = simpson2(f,a,b,N) h = (b-a)/(2*N); x = a:h:b; sumi = 0; %suma impar, notar que nodos impares son pares pues x_1 <-> x(2) for i = 2:2:(2*N - 1) sumi = sumi + f(x(i)); end sump = 0; %suma par, notar que nodos pares son impares pues x_2 <-> x(3) for i = 3:2:(2*N - 2) sump = sump + f(x(i)); end int = (h/3) * (f(a) + f(b) + 4*sumi + 2*sump); end
Versión alternativa (2)
function int = simpson3(f,a,b,N) h = (b-a)/(2*N); sumi = 0; %suma impar, notar que nodos impares son pares pues x_1 <-> x(2) for i = 1:N sumi = sumi + f(a + (2*i-1)*h); end sump = 0; %suma par, notar que nodos pares son impares pues x_2 <-> x(3) for i = 1:N-1 sump = sump + f(a + (2*i)*h); end int = (h/3) * (f(a) + f(b) + 4*sumi + 2*sump); end
EJERCICIO 3 Escriba un programa tipo function en MATLAB que reciba como entrada una función de 2 variables , y los valores y y cuya salida sea el valor de la integral:
donde la integral respecto a sea resuelta mediante la regla de los trapecios y la integral con respecto a sea resuelta con la regla de Simpson.
function int = intmultiple(f,a,b,c,d,N) X = linspace(a,b,N+1); Y = linspace(c,d,N+1); h1 = (b-a)/N; h2 = (d-c)/N; A = [h1/2 h1/2]; B = [h2/6 4*h2/6 h2/6]; int = 0; for s1 = 1:N for s2 = 1:N x = [X(s1) X(s1+1)]; y = [Y(s2) (Y(s2)+Y(s2+1))/2 Y(s2+1)]; for i=1:2 for j=1:3 int = int + A(i)*B(j)*f(x(i),y(j)); end end end end end
7.1 Escriba una función en MATLAB cuyas entradas sean , el intervalo y . Esta función debe dibujar en un mismo gráfico y la -ésima Suma Parcial de Fourier en el intervalo .
function SFn(f,a,b,N) L = (b-a); a_0 = 2/L * integral(f,a,b); for n = 1:N a_n(n) = 2/L * integral(@(x)f(x).*cos((2*pi/L)*n*x),a,b); b_n(n) = 2/L * integral(@(x)f(x).*sin((2*pi/L)*n*x),a,b); end SF = @(x)a_0/2 + sum(a_n.*cos((2*pi/L)*(1:N).*x)) + sum(b_n.*sin((2*pi/L)*(1:N).*x)); pp = linspace(a,b,250); plot(pp,arrayfun(SF,pp),'--'); end
7.3 Modifique la función anterior (...)
function SFn2(f,a,b,N) L = (b-a); a_0 = 2/L * integral(f,a,b); for n = 1:N a_n(n) = 2/L * integral(@(x)f(x).*cos((2*pi/L)*n*x),a,b); b_n(n) = 2/L * integral(@(x)f(x).*sin((2*pi/L)*n*x),a,b); end SF = @(x)a_0/2 + sum(a_n.*cos((2*pi/L)*(1:N).*x)) + sum(b_n.*sin((2*pi/L)*(1:N).*x)); pp = linspace(a-L,b+L,250); plot(pp,arrayfun(SF,pp),'--'); end