%% Práctica 3. Resolución de ecuaciones (I)
% Muchos problemas de las ciencias y las ingenierías requieren hallar una 
% solución de una ecuación, o equivalentemente, una raíz de una función. 
%
% Así pues, dada una función f, nos plantearemos encontrar valores x que 
% hagan f(x)=0. En esta práctica veremos métodos para hallar con Matlab las 
% raíces de una función. En concreto trataremos los métodos de bisección,
% regula-falsi, secante, los métodos de iteración funcional y el de Newton-Raphson.

%%
% Antes de estudiar estos métodos, veremos dos maneras de definir una 
% función, mediante un archivo .m o como una función anónima y también 
% veremos maneras de representar el eje OX.

%% Funciones en archivos .m
% Pueden definirse funciones en Matlab mediante archivos .m cuya primera
% linea comienza con |function|. Una linea como la siguiente serviría para definir
% una función llamada |nombrefuncion| con dos argumentos:
%
%  function valorsalida=nombrefuncion (argumento1,argumento2)
%
% dentro del código del archivo se debe dar a |valorsalida| el valor que
% devuelve la función. Dentro del archivo de la función deben incluirse sólo 
% las instrucciones necesarias para calcular el valor que toma la función, 
% todas las instrucciones que usen la función deben ir fuera del archivo.
%
% Es posible definir una función con varias salidas:
%
%  function [salida1 salida2]=nombrefuncion (argumento1,argumento2)

%%
% Observe en el siguiente ejemplo una función f.m, que tiene sólo una entrada 
% (la variable x) y sólo una salida (el valor de f). El comando |type f.m| muestra
% el contenido del archivo f.m .
% Tenga en cuenta que la función se usa mediante el nombre del archivo y no
% mediante el |nombrefuncion| que se da en la primera linea.
type f.m

%%
% Ej 1. Defina un vector x con valores desde -1 a 1 con paso 0.1. Compruebe que
% la función f.m puede aplicarse al vector x. (Sol. f(x)=[-0.5, -0.31,
% -0.14, 0.01, ...] )
%
% Ej 2. Represente la función f en el intervalo [-1,1].

%% Representación del eje OX
% Una forma de representar el eje OX es utilizar, después del comando plot, el comando 
% grid on, que representa una malla o cuadrícula en la gráfica de la función.
%
x=0:0.1:1;
plot(x,f(x))
grid on

%%
% Si en vez de la malla sólo queremos representar el eje OX, podemos dibujar
% la función y=0.
x=0:0.1:1;
y1=f(x);
y2=zeros(length(x));
plot(x,y1,x,y2)

%%
% Ej 3. Defina en un script g.m la función g(x)=3/4-1/(1+x^2). Evalúe g(2).
% Represente la función junto con el eje horizontal en el intervalo [-5,5].
% (Sol. 0.55 )

%% Funciones anónimas
% Como vimos, es posible en Matlab definir funciones sin usar archivos .m, 
% por ejemplo la siguiente linea define la función h(x)=x^2+1 .
h=@(x) x.^2+1

%%
% La sintaxis para definir una función anónima es la siguiente
%
%  nombrefuncion=@(argumentos) expresion
%
% Por ejemplo, la siguiente linea define la función n2(a,b)=sqrt(a^2+b^2)
n2=@(a,b) sqrt(a.^2+b.^2)

%%
% Ej 4. Sin emplear un archivo .m, defina la función h2(x)=sin(x)^2-cos(x)^2.
% Halle el valor de h2(0) y de h2(2). (Solución: h2(0)=-1, h2(2)=0.6536)


%% Localización gráfica de raíces.
% En ocasiones podemos usar la gráfica de una función para encontrar un
% punto cercano a una raíz o encontrar un intervalo que contenga a una raíz.
%
% Ej 5. Defina en un archivo g.m la función g(x)=exp(x)-5x. 
% a) Dibuje la gráfica de g en el intervalo [0,2] junto con el eje OX.
% b) Represente de nuevo la función en un intervalo más pequeño, de 
% longitud 0.5 que contenga una raiz de g.

%%
% Ej 6. Defina de forma anónima las funciones h1(x)=e^(2x) y h2(x)=2-x^2.
% a) Represente conjuntamente ambas gráficas en el intervalo [-2,1].
% b) Represente la función h1(x)-h2(x) en el intervalo [-2,1].
% Observe que las raíces de h1(x)-h2(x) son los puntos en los que 
% h1(x)=h2(x), esto es, donde se cortan las gráficas de h1 y h2.


%% Bisección
% Vamos a implementar el método de bisección sin necesidad de almacenar en
% memoria todas las iteraciones. En esta implementación los extremos del
% intervalor que contiene la raíz son los valores de a y b. El punto medio
% del intervalo lo llamaremos c.
% 
% Mostramos el pseudocódigo que permite implementar el método de bisección
%
%  1. Entrar f , a, b, tol
%  2. Mientras b-a>=tol
%  3. Hacer c = a + (1/2)(b-a)
%  4. Si f (c) = 0 entonces c es raíz. Fin
%  5. Si sgn f (a) ~= sgn f (c) entonces b = c.
%  6. Si sgn f (a) = sgn f (c) entonces a = c.
%  7. Ir a 2

%%
% Siguiendo estos pasos se ha implementado el método en el archivo biseccion.m
type biseccion.m

%%
% En la implementación se ha empleado la instrucción |break| que interrupe
% el bucle en que se encuentre, poniendo fin al mismo.
%
% El código escrito tiene algunas limitaciones. Observe que para cambiar los
% valores iniciales de a y b debe editar el código, y que la función debe
% llamarse f.
%
% Ej 7. Halle aproximaciones a las dos raíces de la ecuación
% sin(x)-exp(x^2)+9/10=0. (Sol. aprox. x=0.1132, x=0.6317)

%%
% Ej 8. El código del programa contiene dos comentarios que evitan que se muestre
% el progreso del método y el resultado final. Quite los símbolos de comentario.

%% Regula-Falsi
% El método de regula-falsi es similar al método de bisección, pero los
% intervalos no se dividen por la mitad. En este método, para cada
% intervalo se halla la recta que pasa por los puntos de la gráfica 
% en los extremos del intervalo. El punto que divide los intervalos es el 
% corte de la recta hallada con el eje OX. En la implementación almacenamos
% este punto en la variable c.

%%
% Vemos el pseudocódigo del método de regula-falsi
%
%  1. Entrar f , a, b, tol
%  2. Mientras b-a>=tol
%  3. Hacer c = b - (b-a)*f(b) / (f(b)-f(a))
%  4. Si f (c) = 0 entonces c es raíz. Fin
%  5. Si sgn f (a) ~= sgn f (c) entonces b = c.
%  6. Si sgn f (a) = sgn f (c) entonces a = c.
%  7. Ir a 2

%%
% Ej 9. Modifique el archivo biseccion.m para implementar el método de
% regula-falsi en un programa llamado regula.m.
%
% Ej 10. En el código del método de regula - falsi, incluya comentarios que 
% expliquen cada uno de los pasos del método.
%
% Ej 11. Emplee el método de regula - falsi en el intervalo [3,4] para encontrar
% una aproximación a una raíz de f(x)=cos(x/2). (Sol. aprox. x=3.1416)
%

%% 
% Ej 12. ¿Puede emplearse alguno de los métodos vistos hasta ahora para 
% encontrar una raíz de f(x)=exp(x)-5*x en el intervalo [1,2]?
%
% Ej 13. Modifique alguno de los métodos para que el criterio de salida del 
% bucle sea abs(f(c))<tol. (Indicación: defina una variable |fin| con el 
% valor cero. El bucle debe ejecutarse mientras |fin| sea cero. Dentro del
% bucle la variable |fin| tomará el valor 1 cuando abs(f(c))<tol.)
%
% (Siguiendo esta técnica, pueden implementarse distintos criterios para
% salir del bucle, e incluso varios criterios en un mismo programa.)

% Ecuaciones Diferenciales y Cálculo Numérico. (A. Palomares)
% Grado en Ingeniería de Tecnologías de Telecomunicación.
disp(date)