% Aproximacin a una raz de la ecuacin f(x)=0 en el intervalo [a,b].
% Puede usarse slo si f(x) es continua y f(a) y f(b) tienen distinto % signo.
% Datos % - f es la funcin, introducida como una cadena de caracteres 'f' % - a y b son el extremo izquierdo y el extremo derecho. % - delta es la tolerancia.
% Resultados % - c es el cero % - yc=f(c) % - err es el error estimado de la aproximacin a c.
ya=feval(f,a); yb=feval(f,b); if ya*yb>0, return, end max1=1+round((log(b-a)-log(delta))/log(2)); for k=1:max1 c=(a+b)/2; yc=feval(f,c); if yc==0 a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end if b-a < delta, break, end end c=(a+b)/2; err=abs(b-a); yc=feval(f,c);
NOTA: Teclear en MatLab:
>>[c,err,yc]=bisect('f',1,2,0.001)
function [k,p,err,P]=fixpt(g,p0,tol,max1)
% Aproximacin a una solucin de la ecuacin x=g(x) mediante la iteracin % pn+1=g(pn) realizada a partir de una aproximacin p0.
% Datos % - g es la funcin de iteracin % - p0 es el punto de partida % - tol es la tolerancia % - max1 es el nmero mximo de iteraciones % Resultados % - k es el nmero de iteraciones realizadas % - p es la aproximacin al punto fijo % - err es la diferencia entre dos trminos consecutivos % - P es la sucesin {pn} completa
P(1)=p0; for k=2:max1 P(k)=feval(g,P(k-1)); err=abs(P(k)-P(k-1)); relerr=err/(abs(P(k))+eps); p=P(k); if (err<tol) | (relerr<tol),break; end end if k==max1 disp('se ha excedido el nmero mximo de iteraciones') end P=P';
function [p0,err,k,y]=newton(f,df,p0,delta,epsilon,max1)
% Iteracin de Newton-Raphson. % Aproximacin a una raz de f(x)=0 a partir de un valor inicial p0 % mediante la iteracin pk=pk-1-f(pk-1)/f'(pk-1) para k=1,2...
% Datos % - f es la funcin introducida como una cadena de caracteres 'f'. % - df es la derivada de f, introducida como una cadena 'df'. % - p0 es la aproximacin inicial a un cero de f. % - delta es la tolerancia para p0. % - epsilon es la tolerancia para los valores de la funcin. % - max1 es el nmero mximo de iteraciones.
% Resultados % - p0 es la aproximacin al cero, obtenida con el mtodo de Newton- Raph % son. % - err es una estimacin del error de p0. % - k es el nmero de iteraciones realizadas. % - y es el valor de la funcin f(p0)
for k=1:max1 p1=p0-feval(f,p0)/feval(df,p0); err=abs(p1-p0); relerr=2*err/(abs(p1)+delta); p0=p1; y=feval(f,p0); if (err<delta) | (relerr<delta) | (abs(y)<epsilon), break, end end
function [c,err,yc]=regula(f,a,b,delta,epsilon,max1)
% Mtodo de la rgula falsi o de la posicin falsa. % Aproximacin a una raz de la ecuacin f(x)=0 en el intervalo [a,b]. % Puede usarse slo si f(x) es continua y f(a) y f(b) tienen distinto % signo.
% Datos % - f es la funcin, introducida como una cadena de caracteres 'f' % - a y b son el extremo izquierdo y el extremo derecho. % - delta es la tolerancia para el cero. % - epsilon es la tolerancia para el valor de f en el cero. % - max1 es el nmero mximo de iteraciones.
% Resultados % - c es el cero % - yc=f(c) % - err es el error estimado de la aproximacin a c.
ya=feval(f,a); yb=feval(f,b); if ya*yb>0 disp('Note: f(a)*f(b)>0'), return, end for k=1:max1 dx=yb*(b-a)/(yb-ya); c=b-dx; ac=c-a; yc=feval(f,c); if yc==0, break; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end dx=min(abs(dx),ac); if abs(dx)<delta, break, end if abs(yc)<epsilon, break, end end c; err=abs(b-a)/2; yc=feval(f,c);
NOTA: Teclear en MatLab:
[c,err,yc]=regula('f',-2,-1,0.01,0.01,10)
function [p1,err,k,y]=secant(f,p0,p1,delta,epsilon,max1)
% Mtodo de la secante. Aproximacin a una raz de f(x)=0 a partir de unos % valores iniciales p0 y p1 mediante la iteracin % pk+1=pk-f(pk)(pk-pk-1)/f(pk)-f(pk-1) para k=1,2,...
% Datos % - f la funcin intoducida como una cadena de caracteres 'f' % - p0 y p1 son las aproximaciones iniciales a un cero de f. % - delta es la tolerancia para p1. % - epsilon es la tolerancia para los valores de la funcin. % - max1 es el nmero mximo de iteraciones. % Resultados % - p1 es la aproximacin al cero obtenida con el mtodo de la secante. % - err es una estimacin del error de p1. % - k es el nmero de iteraciones realizadas. % - y es el valor de la funcin f(p1).
for k=1:max1 p2=p1-feval(f,p1)*(p1-p0)/(feval(f,p1)-feval(f,p0)); err=abs(p2-p1); relerr=2*err/(abs(p2)+delta); p0=p1; p1=p2; y=feval(f,p1); if (err<delta) | (relerr<delta) | (abs(y)<epsilon), break, end end