Вы находитесь на странице: 1из 7

Mtodo de la Secante en Matlab

fx(1)=input('Ingrese el intervalo inferior: ');


fx(2)=input('Ingrese el intervalo superior: ');
tol=input('Ingrese el porcentaje de error: ');
syms x;
f=input('Ingrese la funcin: ');
f1=subs(f,x,fx(1));
f2=subs(f,x,fx(2));
ea(1)=100;
i=1;
j=2;
while abs(ea(i))>=tol
xf(j+1)=(xf(j-1)*f2-xf(j)*f1)/(f2-f1);
f2=subs(f,x,xf(j+1));
ea(i+1)=(xf(j+1)-xf(j))/xf(j+1)*100;
j=j+1;
i=i+1;
end

f1=f2;

fprintf(' i
xf(i)
Error aprox (i) \n');
%fprintf('%2d\t%11.7f\t\n',0,x(1));
for k=2:j;
fprintf('%2d\t%11.7f\t%7.3f\n',k-1,xf(k),ea(k-1));
end

clear all;
clc;
fprintf('\nCalculo de la raiz de una ecuacion por el metodo de la
Secante\n\n');
f=input('Dame la funcion f(x) : ','s');
x0=input('Dame el valor del intervalo inferior de x : ');
x1=input('Dame el valor del intervalo superior de x : ');
e=input('Dame el porciento del error : ');
ea=1000;
c=1;
while ea>e
x=x0;
g=eval(f);
x=x1;
gg=eval(f);
xi=x1-((gg*(x0-x1))/(g-gg));
ea=abs((xi-x1)/xi)*100;
x0=x1;
x1=xi;
c=c+1;
end
fprintf('\n\n\n\nLa raiz exacta es: %d',xi)
fprintf('\n\nNumero de iteraciones: %d\n',c);

function [n,DD]=Newton_int_1(x,y)
% Interpolacin con polinomios de Newton
% Vectores de entrada x e y; salida: coeficientes en n y dif. en DD
N = length(x)-1;
DD = zeros(N+1,N+1); DD(1:N+1,1) = y(:);
for k=2:N+1
for m=1:N+2-k
DD(m,k)=(DD(m+1,k-1)-DD(m,k-1))/(x(m+k-1)-x(m)); % Diferencias
divididas
end
end
a = DD(1,:); n = a(N+1);
for k=N:-1:1
n = [n a(k)] - [0 n*x(k)]; % n(x)*(x-x(k-1))+a_k-1
end
ejemplo
%do_newton_int_1.m
x=[-2 -1 1 2 4]; y=[-6 0 0 6 60]; % datos ordenados
[n,DD] = Newton_int_1(x,y)
n0 = lagrang_int(x,y) % por comparar con Lagrange
x = [1 2 4 -1 -2]; y=[0 6 60 0 -6]; % orden aleatorio datos
[n1,DD]= Newton_int_1(x,y)
xx = [-2: 0.02 : 4]; yy = polyval(n,xx);
clf, plot(xx,yy,b-,x,y,o) % se dibuja ltimo caso

function [l,L]=lagrang_int(x,y)
% Calcula el polinomio de interpolacin de Lagrange
% x e y vectores de datos; l, coeficientes polinomio resultante,
% L polinomio base
N=length(x)-1; l=0;
for m=1:N+1
P=1;
for k=1:N+1
if k~=m, P=conv(P,poly(x(k)))/(x(m)-x(k)); end
end
L(m,:)=P; % Polinomios de Lagrange base
l=l+y(m)*P; % Coeficientes el polinomio resultante
end

ejemplo
% do_Lagrange_int
x = [-2 -1 1 2]; y=[-6 0 0 6];
l = lagrang_int(x,y)
xx = [-2:0.02:2]; yy = polyval(l,xx);
plot(xx,yy,b,x,y,o)

function [ X ] = Secante( f,x0,x1,e )


%f: Funcion en forma de cadena
%x0,x1: puntos iniciales
%porcentaje de error
i = 1;
Ea = e;
z(1) = x0;
z(2) = x1;
while Ea >= e
X(i,1) = i;
X(i,2) = z(i);
if i > 1
x = z(i);
fx = eval(f);
x = z(i-1);
fy = eval(f);
z(i+1) = z(i)-(((z(i) - z(i-1))/(fx - fy))*fx);
Ea = abs((z(i) - z(i-1))/z(i))*100;
X(i,3) = Ea;
if Ea < e
break;
end

else

end
end

X(i,3) = 100;
end
i = i + 1;

Es el cdigo de una funcin en Matlab, para llamar a la funcin desde la consola se


puede hacer de la siguiente manera:

El primer parmetro que recibe es la funcin a la que queremos sacar las races, el
segundo y tercer parmetro son los puntos iniciales y el cuarto parmetro representa el
porcentaje de error permitido.
Para probar el mtodo se utiliza la siguiente funcin:

secante
clear all;
clc;
fprintf('\nCalculo de la raiz de una ecuacion por el metodo de la
Secante\n\n');
f=input('Dame la funcion f(x) : ','s');
x0=input('Dame el valor del intervalo inferior de x : ');
x1=input('Dame el valor del intervalo superior de x : ');
e=input('Dame el porciento del error : ');
ea=1000;
c=1;
while ea>e
x=x0;
g=eval(f);
x=x1;
gg=eval(f);
xi=x1-((gg*(x0-x1))/(g-gg));
ea=abs((xi-x1)/xi)*100;
x0=x1;
x1=xi;
c=c+1;
end
fprintf('\n\n\n\nLa raiz exacta es: %d',xi)
fprintf('\n\nNumero de iteraciones: %d\n',c);

function secante
global fun
fprintf('Metodo de la secante:\n');
fun=input('Ingrese la funcion:\n','s');
x0=input('Ingrese el primer punto inicial:\n');
x1=input('Ingrese el segundo punto inicial:\n');
tol=input('Ingrese la tol:\n');
it=0;
fprintf('it x0 x1 x2 x1-x2');
while(it<50) it="it+1;" x="x0;" f0="eval(fun);" x="x1;" f1="eval(fun);"
x2="(x0*f1-x1*f0)/(f1-f0);"> fprintf('el procedimiento se completo
satisfactoriamente:\n');
break
end
x0=x1;
x1=x2;
end
fprintf('la raiz buscada es=%15.9f\n',x2);

ezplot(fun),
grid on
Ejemplo:

Metodo de la secante:
Ingrese la funcion:
x^2+10*cos(x)
Ingrese el primer punto inicial:
1.5
Ingrese el segundo punto inicial:
2
Ingrese la tol:
10^(-5)

Вам также может понравиться