Minimo De Una Funcion
Tercera Práctica: Método de Direcciones Axiales
Método para hallar el mínimo con funciones de 1, 2 y 3 variables.
% Funcion que calcula el minimo de una funcion con hasta 3 variables. function y=axiales(x,fun,intervalo) % x : Datos iniciales, sera un vector con los x0,y0,z0... % fun : Puntero a funcion sobre el cual buscar el minimo % intervalo : [opcional]intervalo sobre el cual establecer los puntos % sobre los cuales buscar el minimo en cada interacion. % Consiste en 3 enteros, los dos primeros el rango del % intervalo y el tercero el numero de saltos. n=length(x); % Numero de variables con las cuales se trabajara. % establezco el vector de puntos de inicio para llamar a rosenbrok if nargin == 3 xx=linspace(intervalo(1),intervalo(2),intervalo(3));else xx=linspace(-50,50,10); end % ejecucion del algoritmo de ejes axiales for i=1:n % se repite la operacion para tantas variables como tenga la funcion x(i)=x(i)+ minVar(x,i,fun,xx); %llamada a función que calcula el lambda end y=x; return function minimo=minVar(vec,i,f,xx) %funcion local que minimiza lambda usando rosenbrok %vec : Vector de datos iniciales, sera un vector con los x0,y0,z0... %i: Indice de iteracion del algoritmo %f : Funcion sobre el cual buscar el minimo %xx : vector de puntos de inicio para llamar a resenbrok syms lambda; %inicializacion de variable simbolica l=length(vec); %numero de variables de la funcion minimos=NaN*zeros(length(xx),2); %inicializacion del vector de minimos obtenidos en cada caso for n=1:l % bucle que prepara las variables switch n case 1 ifn==i x=vec(1)+lambda; else x=vec(1); end case 2 if n==i y=vec(2)+lambda; else y=vec(2); end case 3 if n==i z=vec(3)+lambda;
else z=vec(3); end end end %se evalua la funcion para los datos de vec, dejandola en funcion de lambda if l==1 f2=f(x); elseif l==2 f2=f(x,y); elseif l==3 f2=f(x,y,z); else fprintf('Error, función con número de variables mayor que 3'); end %empleo de funcion anonima paragenerar la funcion que se pasara a %rosenbrok g=@(y) subs(f2,lambda,y); %bucle que aplica rosenbrok para cada uno de los for n=1:length(xx) minimos(n,:)=rosenbrok(xx(n),g); end %calculo del minimo de los minimos obtenidos [valor, index]=min(minimos(:,2)); %se devuelve el valor de x siendo este el primero de los minimos %mas minimos obtenido minimo=minimos(index,1); return % Funcion que calcula elminimo de una función de una variable function [minimo,n] = rosenbrok(x,fun,er) % x es el punto inicial por el cual se empezará el algoritmo % fun puntero a funcion sobre la cual buscar el mínimo % er [opcional] permite especificar el error de la solución % por defecto sera 10^-3 if nargin==3 error=er; else error = 10^-3; end alfa=1.2; beta=-0.5; %contantes que definen los saltos de d d=1;%inicialización del salto de la función n=1; %contador de numero de interaciones x(n)=x; y(n)=fun(x(n)); fracaso=0; epsylon=50; %error muy alto que se ira actualizando while (nerror) %bucle que termina si se supera el numero máximo de iteraciones % o se obtiene la x con el valor deseado n=n+1; x(n)=x(n-1)+d; y(n)=fun(x(n)); if (y(n-1)>y(n)) %exito d=alfa*d; %actualiza el salto fracaso=0; %si exitoreestablece fracaso else %fracaso
d=beta*d; fracaso=fracaso+1; %cuenta fracasos consecutivos end; if fracaso>0 epsylon=abs(x(n)-x(n-1)); %calculo de error end end minimo=[x(n) y(n)]; return
A partir de esta función el usuario puede obtener el mínimo de una función con más de una variable (hasta 3, no he creído necesario complicar el código con la opción de hacerlo genérico ya que he creído queobtener el mínimo para funciones de más de 3 variables es nada común. Además se puede elegir la exhaustividad de la función gracias al tercer argumento que recibe. Otra ventaja es que la posibilidad de obtener un mínimo local se reduce drásticamente relacionado con la exhaustividad elegida (tercer argumento de la función). No obstante obtener esto supone un coste extra bastante elevado por las...
Regístrate para leer el documento completo.