Está en la página 1de 6

% metodos_numericos.

clc; clear; close all

% resolucion numerica de EDOs utilizando metodos

% explicitos

% para una EDO cualquiera,

% en este caso dy/dx = t^2-y+2,y(0)=2, y para y(t=0) = 2;

% siempre se encesita una condicion inicial para

% poder integrar una EDO

% condiciones de integracion

% definir un vector que contenga el tiempo

% inicial y final

% span en ingles significa rango

tspan=[0 3];

% yo es el valor de y para el tiempo tspan(1)

yo = 2;

% delta t, se conoce como h en metodos numericos

h = 0.5;

%% calcular solucion exacta

% la solucion exacta

% Tex es el vector que contiene todos los tiempo

% en los cuales se calcula al solucion (exacta)

Te = tspan(1):h:tspan(2);

% utilizando la ecuacion yexacta es:

Ye = yex(Te);

%% resolver EDO mediante metodo de Euler simple

[Tnum1,Ynum1] = euler_simple(@yprima,tspan,h,yo);

% calcular error numerico

er(1)=erms(Ynum1,Ye);
%% resolver EDO mediante metodo de Euler mejorado

[Tnum2,Ynum2] = euler_mejorado(@yprima,tspan,h,yo);

% calcular error numerico

er(2)=erms(Ynum2,Ye);

%% resolver EDO mediante metodo Runge-Kutta 4to orden

[Tnum3,Ynum3] = RK4(@yprima,tspan,h,yo);

% calcular error numerico

er(3)=erms(Ynum3,Ye);

%% graficar

figure(1)

plot(Te,Ye,'.-k','LineWidth',1.5,'MarkerSize',10)

hold on

plot(Tnum1,Ynum1,'*--b','LineWidth',1.5)

plot(Tnum2,Ynum2,'o--r','LineWidth',1.5)

plot(Tnum3,Ynum3,'s--m','LineWidth',1.5)

grid on

xlabel('t'); ylabel('y');

set(gca,'FontSize',20)

legend('Yexacta','Euler Simple','Euler Mejorado','RK4')

%% FUNCIONES

% funcion error RMS

function er = erms(Ynum,Yex)

er = (sum((Ynum-Yex).^2)/length(Yex))^0.5;

end

% ecuacion diferencial ordinaria

function yp = yprima(t,y)

yp = t^2-y+2;

end

% solucion exacta de la ecuacion anterior


function y=yex(t)

y = t.^2-2*t-2*exp(-t)+4;

end

% funcion Euler simple

function[Tnum,Ynum] = euler_simple(yprima,tspan,h,yo)

% metodo de integracion numerica de EDOs

% Euler simple (hacia adelante, explicito)

% INPUTS

% yprima: definicion de la EDO, debe ser otra funcion

% ^ personalizada con dos argumentos (t,y)

% tspan = [to tfinal]; vector de rango de tiempo a integrar

% h = delta t;

% yo = valor de y para el tiempo to = tspan(1)

% OUTPUTS

% Tnum = vector de todos los valores de tiempo

% Ynum = vector integrado numericamente

Tnum = tspan(1):h:tspan(2);

% numero de iteraciones

nmax = length(Tnum);

% inicializar Ynum

Ynum = NaN(1,nmax);

Ynum(1) = yo;

% utilizar un lazo de iteracion numerica

for n=1:nmax-1

cambio = yprima(Tnum(n),Ynum(n))*h;

% calcular nuevo valor

Ynum(n+1)=Ynum(n)+cambio;

end

end
% funcion Euler mejorado

function[Tnum,Ynum] = euler_mejorado(yprima,tspan,h,yo)

% metodo de integracion numerica de EDOs

% Euler mejorado (hacia adelante, explicito)

% INPUTS

% yprima: definicion de la EDO, debe ser otra funcion

% ^ personalizada con dos argumentos (t,y)

% tspan = [to tfinal]; vector de rango de tiempo a integrar

% h = delta t;

% yo = valor de y para el tiempo to = tspan(1)

% OUTPUTS

% Tnum = vector de todos los valores de tiempo

% Ynum = vector integrado numericamente

Tnum = tspan(1):h:tspan(2);

% numero de iteraciones

nmax = length(Tnum);

% inicializar Ynum

Ynum = NaN(1,nmax);

Ynum(1) = yo;

% utilizar un lazo de iteracion numerica

for n=1:nmax-1

k1 = yprima(Tnum(n),Ynum(n)); % cambio de Euler simple

k2 = yprima(Tnum(n)+h,Ynum(n)+k1*h); % cambio estimado en el punto futuro de Euler simple

% calcular nuevo valor con el promedio de cambios

cambio = (k1+k2)*h/2;

Ynum(n+1)=Ynum(n)+cambio;

end

end

% funcion Runge-Kutta 4to oren mejorado


function[Tnum,Ynum] = RK4(yprima,tspan,h,yo)

% metodo de integracion numerica de EDOs

% RK4(hacia adelante, explicito)

% INPUTS

% yprima: definicion de la EDO, debe ser otra funcion

% ^ personalizada con dos argumentos (t,y)

% tspan = [to tfinal]; vector de rango de tiempo a integrar

% h = delta t;

% yo = valor de y para el tiempo to = tspan(1)

% OUTPUTS

% Tnum = vector de todos los valores de tiempo

% Ynum = vector integrado numericamente

Tnum = tspan(1):h:tspan(2);

% numero de iteraciones

nmax = length(Tnum);

% inicializar Ynum

Ynum = NaN(1,nmax);

Ynum(1) = yo;

% utilizar un lazo de iteracion numerica

for n=1:nmax-1

k1 = yprima(Tnum(n),Ynum(n)); % cambio de Euler simple

k2 = yprima(Tnum(n)+h/2,Ynum(n)+k1*h/2); % cambio estimado en el punto futuro de Euler


simple

k3 = yprima(Tnum(n)+h/2,Ynum(n)+k2*h/2);

k4 = yprima(Tnum(n)+h,Ynum(n)+k3*h);

% calcular nuevo valor con el promedio de cambios

cambio = (k1+2*k2+2*k3+k4)*h/6;

Ynum(n+1)=Ynum(n)+cambio;

End
end

También podría gustarte