Professional Documents
Culture Documents
i=1;
ea(1)=100;
while abs(ea(i))>=tol,
xf(i+1) = subs(f,x,xf(i));
ea(i+1) = abs((xf(i+1)-xf(i))/xf(i+1))*100;
i=i+1;
end
fprintf('i xf(i) Error aprox (i) \n');
for j=1:i;
fprintf('%2d \t %11.7f \t %7.3f \n',j-1,xf(j),ea(j));
end
Xk+1 = f(Xk)
function puntofijo
global fun
fprintf('Método del punto fijo:\n');
fx = input('Ingrese la función original:\n','s');
fun=input('Ingrese la función despejada:\n','s');
x0=input('Ingrese el punto inicial:\n');
n=input('Ingrese el numero de iteraciones:\n');
it=0;
fprintf(' it x0 x1 x0-x1');
while(it<n)
it = it+1;
x=x0;
x1=eval(fun);
fprintf('\n%3.0f%15.10f%15.10f%15.10f\n',it,x0,x1,abs(x1-x0));
x0=x1;
end
fprintf('\n el punto fijo aproximado es=%10.6f\n',x1);
clf
hold on
fplot(fx,[-2-x1,x1+2]);
%ezplot('x');
%ezplot fun
%legend('y=x','fun')
plot(x1,0,'-*g')
grid on;
text(x1+0.2,0,'raiz')
hold off
function puntofijo
global fun
fprintf('Método del punto fijo:\n');
fun=input('Ingrese la función:\n','s');
x0=input('Ingrese el punto inicial:\n');
n=input('Ingrese el numero de iteraciones:\n');
it=0;
fprintf(' it x0 x1 x0-x1');
while(it it=it+1;
x=x0;
x1=eval(fun);
fprintf('\n%3.0f%15.10f%15.10f%15.10f\n',it,x0,x1,abs(x1-x0));
x0=x1;
end
fprintf('\n el punto fijo aproximado es=%10.6f\n',x1);
clf
hold on
ezplot('x');
ezplot fun
legend('y=x','fun')
hold off
Ejemplo:
Metodo de la Biseccion
fprintf('\t\tmetodo de biseccion\n');
fun=input('ingrese la funcion:','s');
a=input('ingrese el punto inicial:');
b=input('ingrese el punto final:');
tol=input('ingrese la tolerancia:');
it=0;
x=a;
f_a=eval(fun);
x=b;
f_b=eval(fun);
if(f_a*f_b>0)
fprintf('\t\tEn este intervalo no hay raices\n');
fprintf('\t\tBuscar otro intervalo\n');
return
else
n=ceil(log((b-a)/tol)/log(2));
fprintf('\n=%10.6f\n',n);
fprintf(' it a b c f(a) f(b) f(c) abs(b-a)/2\n');
while 1
it=it+1;
c=(a+b)/2;
x=c;
f_c=eval(fun);
fprintf('%5.0f %10.9f %10.9f %10.9f %10.9f %10.9f %10.9f %10.9f\n',it,a,b,c,f_a,f_b,f_c,abs(b-
a)/2);
if(abs(b-a)/2<=tol)
fprintf('n se satisface la tolerancia\n');
break end if(it>n)
fprintf('\numero de iteraciones excedido');
break
end
if(f_c*f_b<=0) a=c;
f_a=f_c;
else b=c;f_b=f_c;
end
end
fprintf('La raiz pedida es= %10.6f\n',c)
fprintf('La tolerancia es= %10.6f\n',abs(b-a)/2);
x=-100:0.1:100;
ezplot(fun),
grid on end
Ejemplo:
metodo de biseccion
ingrese la funcion:
3*x-2+exp(x)-x^2
ingrese el punto inicial:
0
ingrese el punto final:
1
ingrese la tolerancia:
10^(-5)
= 17.000000
n se satisface la tolerancia
La raiz pedida es= 0.257530
La tolerancia es= 0.000008
function newton
global fun dfun
fprintf('metodo de newton:\n');
fun=input('ingrese la funcion:\n','s');
x0=input('ingrese el punto inicial:\n');
tol=input('ingrese la tol:\n');
dfun=diff(fun);
it=0;
fprintf(' it x0 x1 x0-x1');
while(it<50) it="it+1;" x="x0;" x1="x0-(eval(fun)/eval(dfun));">fprintf('el procedimiento se
completo satisfactoriamente:\n');
break
end
x0=x1;
end
fprintf('la raiz buscada es=%15.9f\n',x1);
ezplot(fun),grid on
Ejemplo:
metodo de newton:
ingrese la funcion:
exp(-x)-log(x)
ingrese el punto inicial:
1
ingrese la tol:
0.01
en 18:38
Metodo de Biseccion
El método de la bisección o corte binario es un método de búsqueda incremental que
divide el intervalo siempre en 2. Si la función cambia de signo sobre un intervalo, se
evalúa el valor de la función en el punto medio. La posición de la raíz se determina
situándola en el punto medio del subintervalo donde exista cambio de signo. El
proceso se repite hasta mejorar la aproximación.
Algoritmo
Paso 1
Elegir los valores iniciales Xa y Xb, de tal forma de que la función cambie de signo:
f(Xa)f(Xb) < 0
Paso 2
Paso 3
Paso 4
Implementado en Matlab
disp(' METODO DE LA BISECCION ');
disp(' ---------------------- ');
f=input('INGRESE FUNCION: ','s');
xai=input('INGRESE LIMITE INFERIOR DEL INTERVALO: ');
xbi=input('INGRESE LIMITE SUPERIOR DEL INTERVALO: ');
tol=input('INGRESE PORCENTAJE DE ERROR: ');
f=inline(f);
i=1;
ea(1)=100;
if f(xai)*f(xbi) < 0
xa(1)=xai;
xb(1)=xbi;
xr(1)=(xa(1)+xb(1))/2;
fprintf('It. Xa Xr Xb Error aprox \n');
fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
while abs(ea(i)) >= tol,
if f(xa(i))*f(xr(i))< 0
xa(i+1)=xa(i);
xb(i+1)=xr(i);
end
if f(xa(i))*f(xr(i))> 0
xa(i+1)=xr(i);
xb(i+1)=xb(i);
end
xr(i+1)=(xa(i+1)+xb(i+1))/2;
ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1))*100);
fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n',...
i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
i=i+1;
end
else
fprintf('No existe una raíz en ese intervalo');
end
bisección
10
11
12
13
14
15
16
17
18
19
20
clear
format short;
for k=1:1:cont
='editor_indent'>c=(a+b)/2;
e=abs((b-a)/2);
if f(a)*f(c)<0
='editor_indent'>b=c;
else
='editor_indent'>a=c;
end
end
fprintf('f(c)='), disp(f(c))
fprintf('error'), disp(e)
clear all
format short;
f=inline(fun);
for k=1:cont
c=(a+b)/2;
e=abs((b-a)/2);
if f(a)*f(c)<0
b=c;
else
a=c;
end
end
disp(A)
fprintf('Solución:\n c=%8.5f\n',c)
fprintf('f(c)=%8.5f\n',f(c))
fprintf('error=%8.5f\n',e)
>> biseccion_ayuda
Introduzca el valor de a: 0
Introduzca el valor de b: 2
k a b c f(c) error
Solución:
c= 0.69336
f(c)= 0.00042
error= 0.00195
newwtooo
function [x,iter]=newton(x0,f,df)
% Algoritmo Newton-Raphson
N = 100; eps = 1.e-5; %Defino max. Numero. iteraciones y error
maxval = 10000.0; % Defino valor para divergencia
x=x0;
while (N>0)
xn = x-f(x)/df(x);%Funcin de Newton
if abs(f(xn))<eps
x=xn;iter=100-N;
return;
end;
if abs(f(x))>maxval
disp(['# de Iteraciones = ',num2str(iter)]);
error('La Solucion Diverge');
break;
end;
N = N - 1;
x = xn;
end;
error('No Converge');
return;
% Fin de la Funcion
syms x;
f1=subs(f,x,fx(i));
z=diff(f);
d=subs(z,x,fx(i));
ea(1)=100;
while abs(ea(i))>=tol;
fx(i+1)=fx(i)-f1/d; f1=subs(f,x,fx(i+1)); d=subs(z,x,fx(i+1));
ea(i+1)=abs((fx(i+1)-fx(i))/fx(i+1)*100);
i=i+1;
end
fprintf('i fx(i) Error aprox (i) \n');
for j=1:i;
fprintf('%2d \t %11.7f \t %7.3f \n',j-1,fx(j),ea(j));
end