Está en la página 1de 5

MÉTODO DE BISECCIÓN

// Método de bisección para resolver f(x)=0

// Aquí se define la función


function y=f(x)
y=2.772*x^4-2.568*x^3-5.04*x^2+1.8*x+1.5;
endfunction

// Estas variables controlan la convergencia


// maxiter = número máximo de iteraciones
// tol = tolerancia en el error relativo
maxiter=500;
tol=1e-6;

disp("Método de bisección");
disp("Intervalo de búsqueda [xA,xB]?");
xA=input("xA = ");
xB=input("xB = ");

// Calcular la función en ambos extremos


fA=f(xA);
fB=f(xB);

// Checar la posibilidad de que alguno de los extremos ya sea la solución


if fA==0 then
disp("Solución encontrada en el extremo x="+string(xA))
abort
end
if fB==0 then
disp("Solución encontrada en el extremo x="+string(xB))
abort
end

// Si ambas tienen el mismo signo, no hay raíz entre ellas


if (fA*fB)>0 then
disp("No parece haber una raíz entre xA y xB");
disp("f(xA) y f(xB) tienen el mismo signo");
abort
end

// Para el cálculo del error, considerar como valor anterior


// el que tenga menor valor absoluto de f(x)
if abs(fA)<abs(fB) then
xant=xA;
else
xant=xB;
end

// Contador de iteraciones
iter=0;

// Ciclo para las iteraciones


while iter<maxiter

// Contador de iteraciones
iter=iter+1;

// Calcular el punto medio y el valor de la función


xC=(xA+xB)/2;
fC=f(xC);

// Checar si xC es la solución
if fC==0 then
disp("La solución es x=" + string(xC));
disp(string(iter) + " iteraciones necesarias");
abort
end

// Si no, checar en cuál intervalo está la solución


if (fA*fC)<0 then
// La solución está en el medio intervalo de la izquierda
// Descartar xB y remplazar por el valor de xC
xB=xC;
fB=fC;
elseif (fB*fC)<0 then
// La solución está en el medio intervalo de la derecha
// Descartar xA y remplazar por el valor de xC
xA=xC;
fA=fC;
else
// Ha ocurrido algún error, posiblemente la función no
// sea continua o el intervalo contiene más de una solución
disp("No se pudo encontrar la solución")
disp("Tal vez la funcion no sea continua o")
disp("el intervalo contiene más de una solución")
abort
end

// Checar criterio de convergencia (error relativo aproximado)


e=abs((xC-xant)/xC);
if e<tol then
// El error es menor que la tolerancia especificada
// Reportar el valor encontrado
disp("La solución es x=" + string(xC));
disp(string(iter) + " iteraciones necesarias");
disp("Error relativo aproximado: "+string(e*100)+"%")
abort
end

// Guardar nuevo valor de xC como x anterior para siguiente iteración


xant=xC;
end

// Si después del número máximo de iteraciones aún


// no se encuentra la solución, reportarlo
disp("Alcanzado número máximo de iteraciones: " + string(maxiter))
disp("Aproximación de la solución x=" + string(xC))
disp("Error aproximado = " + string(e*100)+"%")
MÉTODO DE NEWTON-RAPHSON
// Método de Newton-Raphson para resolver f(x)=0
disp("Método de Newton-Raphson");
clear

// Aquí se define la función


function y=f(x)
y=27.72*x^4-25.68*x^3-50.4*x^2+18*x+15;
endfunction

// Aquí se define la derivada de la función


function yprima=fprima(x)
yprima=110.88*x^3-77.04*x^2-100.8*x+18;
endfunction

// Estas variables controlan la convergencia


// maxiter = número máximo de iteraciones
// tol = tolerancia en el error relativo
maxiter=500;
tol=1e-6;

disp("Proporcione el valor inicial:");


x=input("x0 = ");

// Contador de iteraciones
iter=0;

// Ciclo para las iteraciones


while iter<maxiter

// Contador de iteraciones
iter=iter+1;

// Calcular el nuevo valor de x empleando


// la función y su derivada
xn=x-f(x)/fprima(x);

// Checar criterio de convergencia (error relativo aproximado)


e=abs((xn-x)/x)*100;
if e<tol then
// El error es menor que la tolerancia especificada
// Reportar el valor encontrado
disp("La solución es x=" + string(xn));
disp(string(iter) + " iteraciones necesarias");
abort
end

// Guardar nuevo valor de x para la siguiente iteración


x=xn;
end

// Si después del número máximo de iteraciones aún


// no se encuentra la solución, reportarlo
disp("Alcanzado número máximo de iteraciones: " + string(maxiter));
disp("Aproximación de la solución x= " + string(xn));
disp("Error aproximado = " + string(e));
INTERPOLACIÓN DE LAGRANGE
// Interpolación polinomial de Lagrange
// Ajusta un polinomio de orden n-1 a un
// conjunto de n datos e interpola
// para el valor indicado de x

disp("Interpolación polinomial de Lagrange");

// Pedir datos
n=input("Número de datos? n=");
x=zeros(n,1);
y=zeros(x);
L=zeros(x);
disp ("Introduzca los datos:");
for i=1:n
x(i)=input("x"+string(i)+"=");
y(i)=input("y"+string(i)+"=");
end

// Valor de x para interpolar


xint=input("Valor para interpolar: x=");

// Cálculo de los factores de interpolación


// Ciclo principal
for i=1:n
// Debe inicializarse a 1 porque es un producto
L(i)=1;
// Ciclo interno, para calcular Li como producto
for j=1:n
if j<>i then
// se excluye j=i
L(i)=L(i)*(xint-x(j))/(x(i)-x(j));
end
end
end

// Cálculo de la interpolación
suma=0;
for i=1:n
suma=suma+L(i)*y(i);
end

// Reportar el valor interpolado


disp("y = " + string(suma));
MÉTODO DE EULER
// Método de Euler
clear
// Aquí se define la ecuación diferencial a resolver
// expresada de la forma y' = f(t,y)
function yprima=f(t,y)
yprima=
endfunction

disp("Método de Euler")
disp("Proporcione el punto inicial:")
t0=input("t0=");
y0=input("y0=");
disp("Proporcione el valor final de t:")
tf=input("tf=");
disp("Proporcione el valor del paso")
h=input("h=");

// Calcular cuántos segmentos se va a tener


N=(tf-t0)/h;

// Crear vectores para guardar los puntos, para graficar al final


// (recordar que en Scilab los vectores comienzan en la posición uno
// y que se tiene un punto más que el número de segmentos)
t=linspace(t0,tf,N+1);
y=zeros(t);

// Primer valor de yi
y(1)=y0;

// Ciclo para avanzar a lo largo del tiempo


for i=2:N+1
y(i)=y(i-1)+h*f(t(i-1),y(i-1));
end

// Reportar el valor final


disp("Valor final yf=" + string(y($)))

// Graficar
clf
plot(t,y,"o");