% preg 3, lab 9, 521230, S2-2011

% 3.1
% graficando las funciones f y g
x = -3:.1:3;
plot(x,exp(x-x.^2));
hold on
plot(x,atan(x.^2),'r')
figure(2)
% grafiquemos la diferencia
plot(x,exp(x-x.^2)-atan(x.^2))
% se observa que x0 esta entre -2 y 0 y x1 esta entre 0 y 2
% o un cero esta cerca de -1 y el otro cerca de 1
% con ayuda de fzero buscaremos x0 y x1, dando intervalo inicial
x0i = fzero(@(x) exp(x-x^2)-atan(x^2),[-2,0],optimset('TolX',1e-10));
x1i = fzero(@(x) exp(x-x^2)-atan(x^2),[0,2],optimset('TolX',1e-10));
% o dando aproximacion inicial
x0 = fzero(@(x) exp(x-x^2)-atan(x^2),-1,optimset('TolX',1e-10));
x1 = fzero(@(x) exp(x-x^2)-atan(x^2),1,optimset('TolX',1e-10));

% area entre las curvas usando x0i, x1i
quad(@(x)atan(x.^2)-exp(x-x.^2),-3,x0i)+...
    quad(@(x)exp(x-x.^2)-atan(x.^2),x0i,x1i)+...
    quad(@(x)atan(x.^2)-exp(x-x.^2),x1i,3)
% area entre las curvas usando x0, x1
quad(@(x)atan(x.^2)-exp(x-x.^2),-3,x0)+...
    quad(@(x)exp(x-x.^2)-atan(x.^2),x0,x1)+...
    quad(@(x)atan(x.^2)-exp(x-x.^2),x1,3)

% 3.2
% mirar en func3_lab9.m funcion, cuyo cero quiere buscarse
x = -3:.01:3;
x = x';
y = zeros(length(x),1);
for i = 1:length(x)
    % no se evalua func3_lab9 en cero porque quad da un warning, pero
    % el valor de la funcion en 0 puede calcularse de manera exacta
    if x(i) ~= 0
        y(i) = feval('func3_lab9',x(i));
    else
        y(i) = -sqrt(pi)/4;
    end
end
plot(x,y)
hold on
% recta x=0 para que sea mas facil distinguir donde estan los ceros de f
plot(x,zeros(length(x),1),'k')
% segun grafico la funcion tiene un cero entre 0 y 2 y dos entre 2 y 3
% llamando a fzero con intervalo inicial
% comprobando que f cambia de sigo entre 0.1 y 2
% no se da [0,2] como intervalo inicial porque quad da warning al aproximar
% integral con x = 0
feval('func3_lab9',0.1)
feval('func3_lab9',2)
fzero('func3_lab9',[0.1,2],optimset('TolX',1e-10))
% tambien puede darse aproximacion inicial, en lugar de intervalo inicial
fzero('func3_lab9',1,optimset('TolX',1e-10))

% refinando el grafico entre 2 y 3
x = 2:.001:3;
x = x';
y = zeros(length(x),1);
for i = 1:length(x)
    y(i) = feval('func3_lab9',x(i));
end
figure(2)
plot(x,y)
hold on
plot(x,zeros(length(x),1),'k')
% un cero esta entre 2.4 y 2.5 y el otro entre 2.5 y 2.6
% comprobando que f cambia de signo
feval('func3_lab9',2.4)
feval('func3_lab9',2.5)
% llamando a fzero con intervalo que contiene a cero
fzero('func3_lab9',[2.4,2.5],optimset('TolX',1e-10))
% llamando a fzero con aproximacion inicial a cero
fzero('func3_lab9',2.4,optimset('TolX',1e-10))

% comprobando que f cambia de signo
feval('func3_lab9',2.5)
feval('func3_lab9',2.6)
% llamando a fzero con intervalo que contiene a cero
fzero('func3_lab9',[2.5,2.6],optimset('TolX',1e-10))
% llamando a fzero con aproximacion inicial a cero
fzero('func3_lab9',2.6,optimset('TolX',1e-10))

% si se da 2.5 como aproximacion inicial, el metodo converge a cero
% calculado dando 2.4 como aproximacion inicial
fzero('func3_lab9',2.5,optimset('TolX',1e-10))