Práctica 3. Resolución de ecuaciones (I)
Muchos problemas de las ciencias requieren hallar una solución de una ecuación, o equivalentemente, una raíz (o cero) de una función. Por ejemplo, para hallar el volumen en la ecuación de Van der Waals, hay que hallar una raíz de una función polinómica de tercer grado.
Así pues, dada una función f, nos plantearemos encontrar valores x que hagan f(x)=0. En esta práctica y en la siguiente veremos métodos para hallar con Matlab las raíces de una función. En concreto, en esta práctica trataremos los métodos de bisección y de regula falsi.
Contents
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 conjuntamente la gráfica de una función y el eje OX.
Funciones en archivos .m
Pueden definirse funciones en Matlab mediante archivos .m cuya primera linea comienza con function. Lo que aparece en la siguiente linea 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 toma 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.
Una función puede tener varias salidas:
function [salida1 salida2]=nombrefuncion (argumento1,argumento2)
Observe la 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
function f=f(x) % Ejemplo de función f. % Al emplear .^ la función puede aplicarse a vectores f=1/2-x.^2;
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
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
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)
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 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 valores de x en los que h1(x)=h2(x), esto es, las abscisas de los puntos del plano donde se cortan las gráficas de h1 y h2.
Bisección
Recordamos 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+b)/2 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
% Método de bisección para una función f definida.
a=0.6;
b=0.7;
tol=0.0001;
while b-a>=tol
% disp([a b]);
c=(a+b)/2;
if f(c)==0
break
end
if sign(f(a))~=sign(f(c))
b=c;
else
a=c;
end
end
% disp(c)
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 soluciones de la ecuación sin(x)-exp(x^2)+9/10=0. (Sol. aprox. x=0.1131, x=0.6318)
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 cuyas abscisas son los extremos del intervalo. El punto de corte de esa recta con el eje OX es la correspondiente iteración del método.
Recordamos el pseudocódigo del método de regula falsi
1. Entrar f , a, b, tol 2. Mientras b-a>=tol 3. Hacer c = b-(f(b)*(b-a))/(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 llamada 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.)
% Matemáticas II. Grado en Ingeniería Química. (A. Palomares)
disp(date)
08-Mar-2017