Logo Studenta

algunos metodos

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

uso de los comandos ode, ejm ode 45
[t y]=ode45(@dy,[a:h:b],y(a))
en el editor se escribe
function dy=g(t,y)
dy=2*sin(2*t);
[t y]=ode45(@g,[1:1:5],2)
para un sistema de ecuaciones despejar x' y y' o las variables que tenga y luego
[t, xy]=ode23(@fsis,[a:h:b],[x(a);y(a)])
para el archivo .m
function p=fsis(t,w)
p=[coeficientes de las variables de x' dejando espacios ; igual con y']*w+[numeros y termnos de t]
metodo modificado de euler
f=input('ingrese la funcion de trabajo entre comillas');
g=input('ingrese la ED entre comillas');
e=input('ingrese la condicion inicial y(a)= entre comillas');
a=input('ingrese el valor a');
b=input('ingrese el valor b');
ya=input('ingrese la condicion inicial (el valor de y(a)) ');
h=input('ingrese h );
m=(b-a)/h;
T=a:h:b;
p=dsolve(g,e);
w(1)=ya;
for j==m+1
w(j+1)=w(j) + 0.5*h*subs(f,{t,y},{T(j),w(j)}) + 0.5*h*subs(f,{t,y},{T(j+1),w(j) + h*subs(f,{t,y},{T(j),w(j)})})
end
Y=double(subs(p,t,T));
fprintf(' T wi+1' Y(t));
fprintf('\n ');
E=[T' w' Y'];
si probar con programas mas abajo
%METODO DE NEVILLE
fprintf('\n');
clear all
clc
fprintf(' -----------------\n')
fprintf(' M蒚ODO DE NEVILLE\n')
fprintf(' -----------------\n')
fprintf('\n');
syms x
res=input('- La Funcion le fue dada(Si=1,No=0)? : ');
if res==1
 fun=input('- Introduzca la Funcion F(x) : ','s');
end
Xi=input('- Introduzca la cantidad para aproximar : ');
n=input('- Introduzca la cantidad de puntos dados : ');
fprintf('\n\n');
for i=0:(n-1),
 fprintf('- Introduzca X%1.0f ',i);
 X(i+1)=input (' = ');
 if res==0
 fprintf('- Introduzca F(X%1.0f) ',i);
 FX(i+1)=input(' = ');
 else
 FX(i+1)=funcion(X(i+1),fun);
 end
end
for i=1:n,
 Q(i,1)=FX(i);
end
for i=2:n,
 for j=i:n,
 Q(j,i)=(((Xi-X(j-i+1))*Q(j,i-1))-((Xi-X(j))*Q(j-1,i-1)))/(X(j)-X(j-i+1));
 end
end
fprintf('\n\n');
for i=2:n,
 for j=i:n,
 fprintf('- Q (%1.0f,%1.0f) = %3.8f\n ',j-1,i-1,Q(j,i));
 fprintf('\n');
 end
 
end
Publicado por M閠odos en matlab en 15:13 18 comentarios: 
Enviar por correo electr髇ico
Escribe un blog
Compartir con Twitter
Compartir con Facebook
Compartir en Pinterest
-----------------------------------------------------------------------------------------
%M蒚ODO DEL PUNTO MEDIO
fprintf('\n');
clear all
clc
fprintf(' ----------------------\n')
fprintf(' M蒚ODO DEL PUNTO MEDIO\n')
fprintf(' ----------------------\n')
fprintf('\n');
syms x y
disp('Wi+1=Wi+hF(Ti+h/2,Wi+h/2F(Ti,Wi)) la funcion de trabajo Dy/Dx=F(Ti,Wi)')
fprintf('\n');
d=input(' - Introduzca la ecuaci髇 diferencial encerradas en tildes y q Dy no este x y : ');
n=input(' - Introduzca la condici髇 y(a)=b encerradas en tildes : ');
l=input(' - Introduzca la variable encerradas en tildes : ');
f1=input(' - Introduzca la funci髇 de trabajo : ');
ya=input(' - Introduzca la condici髇 inicial : ');
a=input(' - Introduzca el valor de a : ');
b=input(' - Introduzca el valor de b : ');
h=input(' - Introduzca el tama駉 de paso h : ');
fprintf('\n\n');
fprintf(' - La soluci髇 de la ecuaci髇 diferencial es : \n\n\n');
m = dsolve(d,n,l);
pretty(m);
fprintf('\n\n\n\n');
fprintf(' i ti wi y(t)'); 
%Condiciones para el funcionamiento de los lazos FOR
f=f1;
w(1)=ya;
i=0;
t(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
%Este for obtiene y guarda todos los valores de t
%Tambi閚 se utiliza para evaluar la ecuaci髇 diferencial
for p=a:h:b
 d=1+d;
 t(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
 
%Este for obtiene los valores aproximados de soluci髇
for j=a:h:(b-h)
 i=1+i;
 w(i+1)=w(i)+(h*(subs(f,{x,y},{(t(i)+h/2),w(i)+((h/2)*(((subs(f,{x,y},{t(i),w(i)})))))}))); 
end
%Presentaci髇 de los datos en forma de tabla utilizando matrices
[k' t' w' v'] 
----------------------------------------------------------------------------------------------------------------
%M蒚ODO DE HEUN
fprintf('\n');
clear all
clc
fprintf(' --------------\n')
fprintf(' M蒚ODO DE HEUN\n')
fprintf(' --------------\n')
fprintf('\n');
syms x y
disp('funcion de trabajo F(Ti,Wi)=Dy/Dx')
fprintf('\n');
disp('formula del metodo: Wi+1=Wi+h/4*F(Ti,Wi)+3h/4*F(Ti+2h/3, Wi+2h/3*F(Ti,Wi) )')
d=input(' - Introduzca la ecuaci髇 diferencial encerrados en tildes y q DY no est multiplpcd * y : ');
n=input(' - Introduzca la condici髇 y(a)=b : ');
l=input(' - Introduzca la variable : ');
f1=input(' - Introduzca la funci髇 de trabajo : ');
ya=input(' - Introduzca la condici髇 inicial : ');
a=input(' - Introduzca el valor de a : ');
b=input(' - Introduzca el valor de b : ');
h=input(' - Introduzca el tama駉 de paso h : ');
fprintf('\n\n');
fprintf(' - La soluci髇 de la ecuaci髇 diferencial es : \n\n\n');
m = dsolve(d,n,l);
pretty(m);
fprintf('\n\n\n\n');
fprintf(' i ti wi y(t)'); 
%Condiciones para el funcionamiento de los lazos FOR
f=f1;
w(1)=ya;
i=0;
t(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
%Este for obtiene y guarda todos los valores de t
%Tambi閚 se utiliza para evaluar la ecuaci髇 diferencial
for p=a:h:b
 d=1+d;
 t(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
 
%Este for obtiene los valores aproximados de soluci髇
for j=a:h:(b-h)
 i=1+i;
 w(i+1)=w(i)+((h/4)*(subs(f,{x,y},{t(i),w(i)})))+(((3/4)*h)*(subs(f,{x,y},{(t(i)+((2/3)*h)),(w(i)+(((2/3)*h)*(subs(f,{x,y},{t(i),w(i)}))))}))); 
end
%Presentaci髇 de los datos en forma de tabla utilizando matrices
[k' t' w' v'] 
_-----------------------------------------------------------------------------------------------------------
%M蒚ODO DE RUNGE-KUTTA-FEHLBERG ORDEN 5
% - Introduzca la ecuaci髇 diferencial : 'Dy=y-(x^2)+1'
% - Introduzca la condici髇 y(a)=b : 'y(0)=0.5'
% - Introduzca la funci髇 de trabajo : y-(x^2)+1
% - Introduzca la condici髇 inicial : 0.5
% - Introduzca el valor de a : 0
% - Introduzca el valor de b : 1
% - Introduzca el tama駉 de paso h : 0.1
clear all
disp('---------------------------------------------------------------------------');
disp('M閠odo de RUNGE-KUTTA-FEHLBERG de orden 5');
disp('---------------------------------------------------------------------------');
fprintf('\n')
syms x y
d=input(' - Ingrese la ecuaci髇 diferencial en (x,y): ');
n=input(' - Ingrese la condici髇 y(a)=b: ');
f1=input(' - Ingrese la funci髇 de trabajo: ');
ya=input(' - Ingrese el valor de la condicion inicial: ');
a=input(' - Ingrese el valor de a: ');
b=input(' - Ingrese el valor de b: ');
h=input(' - Ingrese el valor de h: ');
fprintf('\n');
fprintf(' - La soluci髇 de la ecuaci髇 diferencial es : \n\n\n');
m = dsolve(d,n,'x');
pretty(m);
fprintf('\n');
f=f1;
w(1)=ya;
i=0;
t(1)=a;
q(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
e=1;
disp('---------------------------------------------------------------------------');
disp('Formulas para cada iteracion');
disp('---------------------------------------------------------------------------');
fprintf('\n')
fprintf('- w0 = %1.9f ',ya);
fprintf('\n');
for j=a:h:(b-h)
i=1+i;
 t(i)=j;
 
 fprintf('- Iteraci髇: %1.0f\n',e);
 fprintf('\n');
 k1=h*subs(f,{x,y},{t(i),w(i)});
 fprintf('- K1 = h * f(t%1.0f,w%1.0f)',i-1,i-1);
 fprintf('\n');
 fprintf('- K1 = %1.9f * f(%1.9f,w%1.0f)',h,t(i),i-1);
 fprintf('\n');
 fprintf('- K1 = %2.15f',double(k1))
 fprintf('\n\n');
 
 k2=h*subs(f,{x,y},{t(i)+h/4,w(i)+k1/4});
 fprintf('- K2 = h * f(t%1.0f + h/4 , w%1.0f + K1/4)',i-1,i-1);
 fprintf('\n');
 fprintf('- K2 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f)',h,t(i),h/4,i-1,double(k1)/4);
 fprintf('\n');
 fprintf('- K2 = %2.15f',double(k2))
 fprintf('\n\n');
 
 k3=h*subs(f,{x,y},{t(i)+(3.*h/8),w(i)+(3.*k1/32)+(9.*k2/32)});
 fprintf('- K3 = h * f(t%1.0f + (3/8)h , w%1.0f + 3K1/32 + 9K2/32)',i-1,i-1);
 fprintf('\n');
 fprintf('- K3 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f + %1.9f)',h,t(i),((3/8)*h),i-1,(3*(double(k1))/32),(9*(double(k2))/32));
 fprintf('\n');
 fprintf('- K3 = %2.15f',double(k3))
 fprintf('\n\n');
 
 k4=h*subs(f,{x,y},{t(i)+(12.*h/13),w(i)+(1932.*k1/2197)-(7200.*k2/2197)+(7296.*k3/2197)});
 fprintf('- K4 = h * f(t%1.0f + (12/13)h , w%1.0f + 1932K1/2197 - 7200K2/2197 + 7296K3/2197)',i-1,i-1);
 fprintf('\n');
 fprintf('- K4 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f - %1.9f + %1.9f)',h,t(i),((12/13)*h),i-1,(1932*(double(k1))/2197),(7200*(double(k2))/2197),(7296*(double(k3))/2197));
 fprintf('\n');
 fprintf('- K4 = %2.15f',double(k4))
 fprintf('\n\n');
 
 k5=h*subs(f,{x,y},{t(i)+h,w(i)+(439.*k1/216)-(8.*k2)+(3680.*k3/513)-(845.*k4/4104)});
 fprintf('- K5 = h * f(t%1.0f + h , w%1.0f + 439K1/216 - 8K2 + 3680K3/513 - 845K4/4104)',i-1,i-1);
 fprintf('\n');
 fprintf('- K5 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f - %1.9f + %1.9f - %1.9f)',h,t(i),h,i-1,(439*(double(k1))/216),(8*(double(k2))),(3680*(double(k3))/513),(845*(double(k3))/4104));
 fprintf('\n');
 fprintf('- K5 = %2.15f',double(k5))
 fprintf('\n\n');
 
 k6=h*subs(f,{x,y},{t(i)+h/2,w(i)-(8.*k1/27)+(2*k2)-(3544.*k3/2565)+(1859.*k4/4104)-(11.*k5/40)});
 fprintf('- K6 = h * f(t%1.0f + h/2 , w%1.0f + 8K1/27 + 2K2 - 3544K3/2565 + 1859K4/4104 - 11K5/40)',i-1,i-1);
 fprintf('\n');
 fprintf('- K6 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f + %1.9f - %1.9f + %1.9f - %1.9f)',h,t(i),h,i-1,(8*(double(k1))/27),(2*(double(k2))),(3544*(double(k3))/2565),(1859*(double(k3))/4104),(11*(double(k3))/40));
 fprintf('\n');
 fprintf('- K6 = %2.15f',double(k6))
 fprintf('\n\n');
 
 w(1+i)=w(i)+(16.*k1/135)+(6656.*k3/12825)+(28561.*k4/56430)-(9.*k5/50)+(2.*k6/55);
 fprintf('- w%1.0f = w%1.0f + (16/135) K1 + (6656/12825) K3 + (28561/56430) K4 - (9/50) K5 + (2/55) K6)',i,i-1)
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + %1.9f + %1.9f + %1.9f - %1.9f + %1.9f',i,i-1,(16/135)*double(k1),(6656/12825)*double(k3),(28561/56430)*double(k4),(9/50)*double(k5),(2/55)*double(k6))
 fprintf('\n');
 fprintf('- w%1.0f = %2.15f',i,double(w(i+1)))
 fprintf('\n\n');
 e=e+1;
 
end
fprintf('\n');
%Este for obtiene y guarda todos los valores de t
%Tambi閚 se utiliza para evaluar la ecuaci髇 diferencial
for p=a:h:b
 d=1+d;
 q(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
k3=k(end);
%Presentaci髇 de los datos
fprintf(' i ti wi+1 y(t) Error'); 
fprintf('\n\n');
for k1=0:k3
 k2=k1+1;
 fprintf('\n');
 fprintf(' %1.0f %10.9f %10.15f %10.15f %10.15f',k(k2),q(k2),w(k2),v(k2),abs(w(k2)-v(k2)));
 fprintf('\n'); 
end
fprintf('\n'); 
----------------------------------------------------------------------------------------------------
_--------------------------------------------------------------------------------------------------
%M脡TODO DE RUNGE-KUTTA-FEHLBERG 4
% - Introduzca la ecuaci贸n diferencial : 'Dy=y-(x^2)+1'
% - Introduzca la condici贸n y(a)=b : 'y(0)=0.5'
% - Introduzca la funci贸n de trabajo : y-(x^2)+1
% - Introduzca la condici贸n inicial : 0.5
% - Introduzca el valor de a : 0
% - Introduzca el valor de b : 1
% - Introduzca el tama帽o de paso h : 0.1
fprintf('\n');
clc
fprintf(' -----------------------------------------\n')
fprintf(' METODO DE RUNGE-KUTTA-FEHLBERG DE ORDEN 4\n')
fprintf(' -----------------------------------------\n')
fprintf('\n');
syms x y
d=input(' - Introduzca la ecuacion diferencial en (x,y) : ');
n=input(' - Introduzca la condicion y(a)=b : ');
f1=input(' - Introduzca la funcion de trabajo : ');
ya=input(' - Introduzca la condicion inicial w0 : ');
a=input(' - Introduzca el valor de a : ');
b=input(' - Introduzca el valor de b : ');
h=input(' - Introduzca el tama駉 de paso h : ');
fprintf('\n\n');
fprintf(' - La solucion de la ecuacion diferencial es : \n\n\n');
m = dsolve(d,n,'x');
pretty(m);
fprintf('\n\n\n');
f=f1;
w(1)=ya;
i=0;
t(1)=a;
q(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
e=1;
fprintf('- w0 = %1.9f ',ya);
fprintf('\n\n');
for j=a:h:(b-h)
 i=1+i;
 t(i)=j;
 fprintf(' ---------------'); 
 fprintf('\n');
 fprintf('- Iteracion: %1.0f\n',e);
 fprintf(' ---------------');
 fprintf('\n\n');
 
 k1=h*subs(f,{x,y},{t(i),w(i)});
 fprintf('- K1 = h * f(t%1.0f,w%1.0f)',i-1,i-1);
 fprintf('\n');
 fprintf('- K1 = %1.9e * f(%1.9e,w%1.0e)',h,t(i),i-1);
 fprintf('\n');
 fprintf('- K1 = %2.15e',(k1))
 fprintf('\n\n');
 
 k2=h*subs(f,{x,y},{t(i)+h/4,w(i)+k1/4});
 fprintf('- K2 = h * f(t%1.0f + h/4 , w%1.0f + K1/4)',i-1,i-1);
 fprintf('\n');
 fprintf('- K2 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f)',h,t(i),h/4,i-1,(k1)/4);
 fprintf('\n');
 fprintf('- K2 = %2.15f',(k2))
 fprintf('\n\n');
 
 k3=h*subs(f,{x,y},{t(i)+(3.*h/8),w(i)+(3.*k1/32)+(9.*k2/32)});
 fprintf('- K3 = h * f(t%1.0f + (3/8)h , w%1.0f + 3K1/32 + 9K2/32)',i-1,i-1);
 fprintf('\n');
 fprintf('- K3 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f + %1.9f)',h,t(i),((3/8)*h),i-1,(3*((k1))/32),(9*((k2))/32));
 fprintf('\n');
 fprintf('- K3 = %2.15f',(k3))
 fprintf('\n\n');
 
 k4=h*subs(f,{x,y},{t(i)+(12.*h/13),w(i)+(1932.*k1/2197)-(7200.*k2/2197)+(7296.*k3/2197)});
 fprintf('- K4 = h * f(t%1.0f + (12/13)h , w%1.0f + 1932K1/2197 - 7200K2/2197 + 7296K3/2197)',i-1,i-1);
 fprintf('\n');
 fprintf('- K4 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f - %1.9f + %1.9f)',h,t(i),((12/13)*h),i-1,(1932*((k1))/2197),(7200*((k2))/2197),(7296*((k3))/2197));
 fprintf('\n');
 fprintf('- K4 = %2.15f',(k4))
 fprintf('\n\n');
 
 k5=h*subs(f,{x,y},{t(i)+h,w(i)+(439.*k1/216)-(8.*k2)+(3680.*k3/513)-(845.*k4/4104)});
 fprintf('- K5 = h * f(t%1.0f + h , w%1.0f + 439K1/216 - 8K2 + 3680K3/513 - 845K4/4104)',i-1,i-1);
 fprintf('\n');
 fprintf('- K5 = %1.9f * f(%1.9f + %1.9f , w%1.0f + %1.9f - %1.9f + %1.9f - %1.9f)',h,t(i),h,i-1,(439*((k1))/216),(8*((k2))),(3680*((k3))/513),(845*((k3))/4104));
 fprintf('\n');
 fprintf('- K5 = %2.15f',(k5))
 fprintf('\n\n');
 
 w(1+i)=w(i)+(25*k1/216)+(1408*k3/2565)+(2197*k4/4104)-(k5/5);
 fprintf('- w%1.0f = w%1.0f + (25/216) K1 + (1408/2565) K3 + (2197/4104) K4 - (1/5) K5)',i,i-1)
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + %1.9f + %1.9f + %1.9f - %1.9f',i,i-1,(25/216)*(k1),(1408/2565)*(k3),(2197/4104)*(k4),(1/5)*(k5))
 fprintf('\n');
 fprintf('- w%1.0f = %2.15f',i,(w(i+1)))
 fprintf('\n\n');
 e=e+1;
end
fprintf('\n\n');
%Este for obtiene y guarda todos los valores de t
%Tambi茅n se utiliza para evaluar la ecuaci贸n diferencial
for p=a:h:b
 d=1+d;
 q(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
 
k3=k(end);
%Presentaci贸n de los datos
fprintf(' i ti wi+1 y(t)'); 
fprintf('\n\n');
for k1=0:k3
 k2=k1+1;
 fprintf('\n');
 fprintf(' %1.0f %10.15e %10.15e %10.15e',k(k2),q(k2),w(k2),v(k2));
 fprintf('\n'); 
end
fprintf('\n');
--------------------------------------------------------------------------------------------
___________________________________________________
fprintf('\n');
clear all
fprintf(' --------------------------\n')
fprintf(' M蒚ODO MODIFICADO DE EULER\n')
fprintf(' --------------------------\n')
fprintf('\n');
syms x y
disp('funcion de trabajo F(Ti,Wi)=Dy/DX')
fprintf('\n');
disp('formula del metodo: Wi+1=Wi+h/2*F(Ti,Wi)+h/2*F(T(i+1), Wi + hF(Ti,Wi))')
fprintf('\n');
d=input(' - Introduzca la ecuaci髇 diferencial encerrado con tildes y Dy sin xtiplicar a y : ');
n=input(' - Introduzca la condici髇 y(a)=b : ');
f1=input(' - Introduzca la funci髇 de trabajo : ');
ya=input(' - Introduzca la condici髇 inicial : ');
a=input(' - Introduzca el valor de a : ');
b=input(' - Introduzca el valor de b : ');
h=input(' - Introduzca el tama駉 de paso h : ');
fprintf('\n\n');
fprintf(' - La soluci髇 de la ecuaci髇 diferencial es : \n\n\n');
m = dsolve(d,n,'x');
pretty(m);
fprintf('\n\n\n'); 
%Condiciones para el funcionamiento de los lazos FOR
f=f1;
w(1)=ya;
i=0;
t(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
%Este for obtiene y guarda todos los valores de t
%Tambi閚 se utiliza para evaluar la ecuaci髇 diferencial
for p=a:h:b
 d=1+d;
 t(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
k3=k(end);
 
%Este for obtiene los valores aproximados de soluci髇
fprintf('-------------------------------------------------------------------------------------------------------');
fprintf('\n');
fprintf(' F覴MULAS DE CADA ITERACI覰');
fprintf('\n');
fprintf('-------------------------------------------------------------------------------------------------------');
fprintf('\n\n');
fprintf('- w0 = %1.5f ',ya);
fprintf('\n');
for j=a:h:(b-h)
 i=1+i;
 w(i+1)=w(i)+((h/2)*(subs(f,{x,y},{t(i),w(i)})))+((h/2)*(subs(f,{x,y},{(t(i)+h),(w(i)+(h*(subs(f,{x,y},{t(i),w(i)}))))}))); 
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + h/2 f(t%1.0f,w%1.0f) + h/2 f(t%1.0f + h,w%1.0f + h f(t%1.0f,w%1.0f))',i,i-1,i-1,i-1,i-1,i-1,i-1,i-1);
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + %1.5f f(%1.9f,w%1.0f) + %1.5f f(%1.9f + %1.5f,w%1.0f + %1.5f f(%1.9f,w%1.0f))',i,i-1,h/2,t(i),i-1,h/2,t(i),h,i-1,h,t(i),i-1);
 fprintf('\n');
end
fprintf('\n');
fprintf('-------------------------------------------------------------------------------------------------------');
fprintf('\n');
%Presentaci髇 de los datos
fprintf('\n\n');
fprintf(' i ti wi y(t)'); 
fprintf('\n\n');
for k1=0:k3
 k2=k1+1;
 fprintf('\n');
 fprintf(' %1.0f %10.15f %10.15f %10.15f',k(k2),t(k2),w(k2),v(k2));
 fprintf('\n'); 
end
fprintf('\n'); 
-------------------------------------------------------------------------------------------------------------
%M蒚ODO DE EULER
fprintf('\n');
clear all
clc
fprintf(' ---------------\n')
fprintf(' M蒚ODO DE EULER\n')
fprintf(' ---------------\n')
fprintf('\n');
syms x y
disp('Wi+1=Wi+hF(Ti,Wi)')
d=input(' - Introduzca la ecuaci髇 diferencial Dy no debe contener a y Dy+x=y y encerrarlo con : ');
n=input(' - Introduzca la condici髇 y(a)=b encerrado con '' : ');
l=input(' - Introduzca la variable enerrado con '' : ');
f1=input(' - Introduzca la funci髇 de trabajo : ');
ya=input(' - Introduzca la condici髇 inicial : ');
a=input(' - Introduzca el valor de a : ');
b=input(' - Introduzca el valor de b : ');
h=input(' - Introduzca el tama駉 de paso h : ');
fprintf('\n\n');
fprintf(' - La soluci髇 de la ecuaci髇 diferencial es : \n\n\n');
m = dsolve(d,n,l);
pretty(m);
fprintf('\n\n\n\n');
fprintf(' i ti wi y(t)'); 
%Condiciones para el funcionamiento de los lazos FOR
f=f1;
w(1)=ya;
i=0;
t(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
%Este for obtiene y guarda todos los valores de t
%Tambi閚 se utiliza para evaluar la ecuaci髇 diferencial
for p=a:h:b
 d=1+d;
 t(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
 
%Este for obtiene los valores aproximados de soluci髇
for j=a:h:(b-h)
 i=1+i;
 w(i+1)=w(i)+(h*(subs(f,{x,y},{t(i),w(i)}))); 
end
%Presentaci髇 de los datos en forma de tabla utilizando matrices
[k' t' w' v'] 
-------------------------------------------------------------------------------------
%metodo de euler pero es archivo .m
function EULER(a,b,h,w0)
syms y t
ti=a;
w(1)=w0;
sol_exacta=dsolve('Dy=(t+y-1)^2','y(0)=2','t');
f=(t+y-1)^2;
n=(b-a)/h;
fprintf(' ti= %3.5f\n W=%5.10f \n\n',a,w0);
for i=0:n-1,
 w(i+2)=w(i+1)+(h)*subs(f,{t,y},{ti,w(i+1)});
 fprintf(' ti= %3.5f\n W= %5.10f \n\n',ti+h,w(i+2));
 ti=ti+h;
end
syms ti wi
for i=0:0,
 wi(i+2)=wi(i+1)+(h)*subs(f,{t,y},{ti,wi(i+1)});
 pretty(wi(i+2));
end
pretty(sol_exacta);
ti=a;
for i=0:n,
 z=subs(sol_exacta,t,ti);
 fprintf('t=%3.5f Y= %5.10f \n',ti,z);
 ti=ti+h;
 end
------------------------------------------------------------------
metodo RK 4 para sistemas
disp('M閠odo de solucion de sistemas RK 4 orden para 3 ecuaciones diferenciales');
m=input('Ingrese el # de ecuaciones: ');
%agregar mas variables simbolicas si hay mas ecuaciones
syms x y z t
fi=cell(1,m);
for i=1:m
 fprintf('Ingrese f%d� ',i); % 1+1/2*exp(t)-2*x
 fi{i}=input('');
end
%fprintf('\n');
wi0=zeros(1,m);
for i=1:m
 fprintf('Ingrese w%d0: ',i); % 2
 wi0(i)=input('');
end
%fprintf('\n');
interv=input('Ingrese el intervalo: '); %[0 0.3]
h=input('Ingrese el tama駉 de paso: '); % 0.1
n=(interv(2)-interv(1))/h;
n=round(n);
ti=zeros(1,n+1);
for i=2:n
 ti(i)=interv(1)+(i-1)*h;
end
ti(n+1)=interv(2);
k1i=zeros(1,m);
k2i=zeros(1,m);
k3i=zeros(1,m);
k4i=zeros(1,m);
wij=zeros(n);
fprintf('\n');
for j=1:n
 fprintf('\nj = %d\nt%d = %d\n\n',j-1,j-1, ti(j+1));
 %fprintf('\nj=%d\n\n',j-1);
 for i=1:m
 if j==1
 k1i(i)=h*subs(fi{i},{t,x,y,z},{ti(j),wi0(1),wi0(2),wi0(3)});
 else
 k1i(i)=h*subs(fi{i},{t,x,y,z},{ti(j),wij(1,j-1),wij(2,j-1),wij(3,j-1)});
 end
 %fprintf('K1%d = h*f(t%d,w%d)',i,j,j); %rk4 normalito
 fprintf('k1%d = h*f%d(t%d',i,i,j-1);
 for cont=1:m
 fprintf(',w%d%d',cont,j-1);
 end
 fprintf(') = %.9f\n',k1i(i));
 %fprintf('K1%d=%.9f\n',i,k1i(i)); %como lo tenia el gordo
 end
 for i=1:m
 if j==1
 k2i(i)=h*subs(fi{i},{t,x,y,z},{ti(j)+h/2,wi0(1)+1/2*k1i(1),wi0(2)+1/2*k1i(2),wi0(3)+1/2*k1i(3)});
 else
 k2i(i)=h*subs(fi{i},{t,x,y,z},{ti(j)+h/2,wij(1,j-1)+1/2*k1i(1),wij(2,j-1)+1/2*k1i(2),wij(3,j-1)+1/2*k1i(3)});
 end
 %fprintf('K2%d = h*f(t%d+h/2,w%d+1/2*k1)',i,j,j); %rk4 normalito
 fprintf('k2%d = h*f%d(t%d+h/2',i,i,j-1);
 for cont=1:m
 fprintf(',w%d%d+(1/2)*k1%d',cont,j-1,cont);
end
 fprintf(') = %.9f\n',k2i(i));
 %fprintf('K2%d=%.9f\n',i,k2i(i));
 end
 for i=1:m
 if j==1
 k3i(i)=h*subs(fi{i},{t,x,y,z},{ti(j)+h/2,wi0(1)+1/2*k2i(1),wi0(2)+1/2*k2i(2),wi0(3)+1/2*k2i(3)});
 else
 k3i(i)=h*subs(fi{i},{t,x,y,z},{ti(j)+h/2,wij(1,j-1)+1/2*k2i(1),wij(2,j-1)+1/2*k2i(2),wij(3,j-1)+1/2*k2i(3)});
 end
 %fprintf('K3%d = h*f(t%d+h/2,w%d+1/2*k2)',i,j,j); %rk4 normalito
 fprintf('k3%d = h*f%d(t%d+h/2',i,i,j-1);
 for cont=1:m
 fprintf(',w%d%d+(1/2)*k2%d',cont,j-1,cont);
 end
 fprintf(') = %.9f\n',k3i(i));
 %fprintf('K3%d=%.9f\n',i,k3i(i));
 end
 for i=1:m
 if j==1
 k4i(i)=h*subs(fi{i},{t,x,y,z},{ti(j)+h,wi0(1)+k3i(1),wi0(2)+k3i(2),wi0(3)+k3i(3)});
 else
 k4i(i)=h*subs(fi{i},{t,x,y,z},{ti(j)+h,wij(1,j-1)+k3i(1),wij(2,j-1)+k3i(2),wij(3,j-1)+k3i(3)});
 end
 %fprintf('K4%d = h*f(t%d,w%d+k3)',i,j+1,j); %rk4 normalito
 fprintf('k4%d = h*f%d(t%d+h',i,i,j-1);
 for cont=1:m
 fprintf(',w%d%d+k3%d',cont,j-1,cont);
 end
 fprintf(') = %.9f\n',k4i(i));
 %fprintf('K4%d=%.9f\n',i,k4i(i));
 end
 for i=1:m
 if j==1
 wij(i,j)=wi0(i)+1/6*(k1i(i)+2*k2i(i)+2*k3i(i)+k4i(i));
 else
 wij(i,j)=wij(i,j-1)+1/6*(k1i(i)+2*k2i(i)+2*k3i(i)+k4i(i));
 end
 fprintf('w%d%d = w%d%d+(k1%d+2*k2%d+2*k3%d+k4%d)/6 = %.9f\n',i,j,i,j-1, i,i,i,i, wij(i,j));
 %fprintf('w%d%d=%.9f\n',i,j,wij(i,j));
 end
 fprintf('\n');
-----------------------------------------------------------------------------------------------
%M蒚ODO EXPL虲ITO DE ADAMS-BASHFORTH DE CUATRO PASOS
% - Introduzca la ecuaci髇 diferencial : 'Dy=y-(x^2)+1'
% - Introduzca la condici髇 y(a)=b : 'y(0)=0.5'
% - Introduzca la funci髇 de trabajo : y-(x^2)+1
% - Introduzca el valor de a : 0
% - Introduzca el valor de b : 1
% - Introduzca el tama駉 de paso h : 0.1
% - Introduzca la condici髇 inicial : 0.5
fprintf('\n');
clear all
clc
fprintf(' ------------------------------------------------------\n')
fprintf(' M蒚ODO DE EXPL虲ITO DE ADAMS BASHFORTH DE CUATRO PASOS\n')
fprintf(' ------------------------------------------------------\n')
fprintf('\n');
syms x y
d=input(' - Introduzca la ecuaci髇 diferencial : ');
n=input(' - Introduzca la condici髇 y(a)=b : ');
f1=input(' - Introduzca la funci髇 de trabajo : ');
a=input(' - Introduzca el valor de a : ');
b=input(' - Introduzca el valor de b : ');
h=input(' - Introduzca el tama駉 de paso h : ');
ya=input(' - Introduzca la condici髇 inicial : ');
tx(1)=a;
vx(1)=a;
ax=a;
bx=b;
hx=h;
dx=0;
mx = dsolve(d,n,'x');
for px=ax:hx:bx
 dx=1+dx;
 tx(dx)=px;
 vx(dx)=subs(mx,px);
end
yb=subs(mx,tx(2));
yc=subs(mx,tx(3));
yd=subs(mx,tx(4));
fprintf('\n\n');
fprintf(' - La soluci髇 de la ecuaci髇 diferencial es : \n\n\n');
m = dsolve(d,n,'x');
pretty(m);
fprintf('\n\n\n');
%Condiciones para el funcionamiento de los lazos FOR
f=f1;
w(1)=ya;
w(2)=yb;
w(3)=yc;
w(4)=yd;
i=3;
t(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
%Este for obtiene y guarda todos los valores de t
%Tambi閚 se utiliza para evaluar la ecuaci髇 diferencial
for p=a:h:b
 d=1+d;
 t(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
a=a+(4*h);
k3=k(end);
fprintf('------------------------------------------------------------------------------------------------------------------');
fprintf('\n');
fprintf(' F覴MULAS DE CADA ITERACI覰');
fprintf('\n');
fprintf('------------------------------------------------------------------------------------------------------------------');
fprintf('\n\n');
fprintf('- w0 = %1.9f ',ya);
fprintf('\n\n');
fprintf('- w1 = %1.9f ',yb);
fprintf('\n\n');
fprintf('- w2 = %1.9f ',yc);
fprintf('\n\n');
fprintf('- w3 = %1.9f ',yd);
fprintf('\n');
%Este for obtiene los valores aproximados de soluci髇
for j=a:h:b
 i=1+i;
 w(i+1)=w(i)+((h/24)*((55*(subs(f,{x,y},{t(i),w(i)})))-(59*(subs(f,{x,y},{t(i-1),w(i-1)})))+(37*(subs(f,{x,y},{t(i-2),w(i-2)})))-(9*(subs(f,{x,y},{t(i-3),w(i-3)}))))); 
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + h/24 [55*f(t%1.0f,w%1.0f) - 59*f(t%1.0f,w%1.0f) + 37*f(t%1.0f,w%1.0f) - 9*f(t%1.0f,w%1.0f)]',i,i-1,i-1,i-1,i-2,i-2,i-3,i-3,i-4,i-4);
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + %1.9f [55*f(%1.9f,w%1.0f) - 59*f(%1.9f,w%1.0f) + 37*f(%1.9f,w%1.0f) - 9*f(%1.9f,w%1.0f)]',i,i-1,h/12,t(i),i-1,t(i-1),i-2,t(i-2),i-3,t(i-3),i-4);
 fprintf('\n');
end
fprintf('\n');
fprintf('------------------------------------------------------------------------------------------------------------------');
fprintf('\n');
%Presentaci髇 de los datos
fprintf('\n\n');
fprintf(' i ti wi y(t)'); 
fprintf('\n\n');
for k1=0:k3
 k2=k1+1;
 fprintf('\n');
 fprintf(' %1.0f %10.9f %10.9f %10.9f',k(k2),t(k2),w(k2),v(k2));
 fprintf('\n'); 
end
fprintf('\n');
-----------------------------------------------------------------------------------------------
%M蒚ODO EXPL虲ITO DE ADAMS-BASHFORTH DE CINCO PASOS
% - Introduzca la ecuaci髇 diferencial : 'Dy=y-(x^2)+1'
% - Introduzca la condici髇 y(a)=b : 'y(0)=0.5'
% - Introduzca la funci髇 de trabajo : y-(x^2)+1 despeje Dy
% - Introduzca el valor de a : 0
% - Introduzca el valor de b : 1
% - Introduzca el tama駉 de paso h : 0.1
% - Introduzca la condici髇 inicial : 0.5
% x=w1j y=w2j
fprintf('\n');
clc
fprintf(' -----------------------------------------------------\n')
fprintf(' M蒚ODO DE EXPL虲ITO DE ADAMS BASHFORTH DE CINCO PASOS\n')
fprintf(' -----------------------------------------------------\n')
fprintf('\n');
syms x y
d=input(' - Introduzca la ecuaci髇 diferencial (x,y) : ');
n=input(' - Introduzca la condici髇 y(a)=b : ');
f1=input(' - Introduzca la funci髇 de trabajo (x,y) : ');
a=input(' - Introduzca el valor de a : ');
b=input(' - Introduzca el valor de b : ');
h=input(' - Introduzca el tama駉 de paso h : ');
ya=input(' - Introduzca la condici髇 inicial : ');
tx(1)=a;
vx(1)=a;
ax=a;
bx=b;
hx=h;
dx=0;
mx = dsolve(d,n,'x');
for px=ax:hx:bx
 dx=1+dx;
 tx(dx)=px;
 vx(dx)=subs(mx,px);
end
yb=subs(mx,tx(2));
yc=subs(mx,tx(3));
yd=subs(mx,tx(4));
ye=subs(mx,tx(5));
fprintf('\n\n');
fprintf(' - La soluci髇 de la ecuaci髇 diferencial es : \n\n\n');
m = dsolve(d,n,'x');
pretty(m);
fprintf('\n\n\n');
%Condiciones para el funcionamiento de los lazos FOR
f=f1;
w(1)=ya;
w(2)=yb;
w(3)=yc;
w(4)=yd;
w(5)=ye;
i=4;
t(1)=a;
v(1)=a;
d=0;
c=0;
g=0;
%Este for obtiene y guarda todos los valores de t
%Tambi閚 se utiliza para evaluar la ecuaci髇 diferencial
for p=a:h:b
 d=1+d;
 t(d)=p;
 v(d)=subs(m,p);
end
%Este for se usa para contabilizar las iteraciones
for s=c:1:(d-1)
 g=1+g;
 k(g)=(g-1);
end
a=a+(5*h);
k3=k(end);
fprintf('---------------------------------------------------------------------------------------------------------------------------------------------------');
fprintf('\n');
fprintf(' F覴MULAS DE CADA ITERACI覰');
fprintf('\n');
fprintf('---------------------------------------------------------------------------------------------------------------------------------------------------');
fprintf('\n\n');
fprintf('- w0 = %1.9f ',ya);
fprintf('\n\n');
fprintf('- w1 = y(t1)= %1.15f ',yb);
fprintf('\n\n');
fprintf('- w2 = y(t2)= %1.15f ',yc);
fprintf('\n\n');
fprintf('- w3 = y(t3)=%1.15f ',yd);
fprintf('\n\n');
fprintf('- w4 = y(t4)=%1.15f ',ye);
fprintf('\n\n');
%Este for obtiene los valores aproximados de soluci髇
for j=a:h:b
 i=1+i;
 w(i+1)=w(i)+((h/720)*((1901*(subs(f,{x,y},{t(i),w(i)})))-(2774*(subs(f,{x,y},{t(i-1),w(i-1)})))+(2616*(subs(f,{x,y},{t(i-2),w(i-2)})))-(1274*(subs(f,{x,y},{t(i-3),w(i-3)})))+(251*(subs(f,{x,y},{t(i-4),w(i-4)}))))); 
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + h/720 [1901*f(t%1.0f,w%1.0f) - 2774*f(t%1.0f,w%1.0f) + 2616*f(t%1.0f,w%1.0f) - 1274*f(t%1.0f,w%1.0f) + 251*f(t%1.0f,w%1.0f)]',i,i-1,i-1,i-1,i-2,i-2,i-3,i-3,i-4,i-4,i-5,i-5);
 fprintf('\n');
 fprintf('- w%1.0f = w%1.0f + %1.9f [1901*f(%1.9f,w%1.0f) - 2774*f(%1.9f,w%1.0f) + 2616*f(%1.9f,w%1.0f) - 1274*f(%1.9f,w%1.0f) + 251*f(%1.9f,w%1.0f)]',i,i-1,h/12,t(i),i-1,t(i-1),i-2,t(i-2),i-3,t(i-3),i-4,t(i-4),i-5);
 fprintf('\n');
 fprintf(' w%1.0f = %4.15f ',i,w(i+1));
 fprintf('\n');
end
fprintf('\n');
fprintf('---------------------------------------------------------------------------------------------------------------------------------------------------');
fprintf('\n');
%Presentaci髇 de los datos
fprintf('\n\n');
fprintf(' i ti wi y(t)'); 
fprintf('\n\n');
for k1=0:k3
 k2=k1+1;
 fprintf('\n');
 fprintf(' %1.0f %10.15f %10.15f %10.15f',k(k2),t(k2),w(k2),v(k2));
 fprintf('\n'); 
end
fprintf('\n');
 
Publicado por M閠odos en matlab en 14:42 No hay comentarios: 
Enviar por correo electr髇ico
Escribe un blog
Compartir con Twitter
Compartir con Facebook
Compartir en Pinterest
jueves, 3 de abril de 2014
% integraci髇 de romber
clear all;
syms x y z q valorsitos;
disp('Metodo de Romberg')
f=input('Ingrese la funcion: ');
a=input('Ingrese el valor de a: ');
b=input('Ingrese el valor de b: ');
n=input('Ingrese el valor de N: ');
cont1=1;
%encontrando los valores de h
while(cont1<=n)
 h(cont1)=(b-a)/(2^(cont1-1));
 fprintf('h%d=%.9f\n\n',cont1,h(cont1));
 cont1=cont1+1;
end
%generando la primera columna
t(1,1)=(h(1)/2)*(subs(f,a)+subs(f,b));
fprintf('R(1,1)=h1/2*(f(a)+f(b))==>');
disp(t(1,1));
cont1=2;
sumatoria=0;
while(cont1<=n)
 cont2=1;
 fprintf('R(%1.0f,%1.0f)=',cont1,1);
 valorsitos(cont1,cont2)=q+h(cont1-1);
 while(cont2<=(2^(cont1-2)))
 
 valorsitos(cont1,cont2+1)=(q+a+(2*cont2-1)*h(cont1));
 sumatoria=sumatoria+subs(f,(a+(2*cont2-1)*h(cont1)));
 cont2=cont2+1;
 end
 t(cont1,1)=(1/2)*(t(cont1-1,1)+h(cont1-1)*sumatoria);
 fprintf(')==>');
 disp(t(cont1,1));
 sumatoria=0;
 cont1=cont1+1;
end
%generando el resto de la tabla
cont1=2;
cont2=2;
cont3=2;
while(cont2<=n)
 while(cont1<=n)
 t(cont1,cont2)=t(cont1,cont2-1)+(t(cont1,cont2-1)-t(cont1-1,cont2-1))/(4^(cont2-1)-1);
 fprintf('R(%1.0f,%1.0f)=R(%1.0f,%1.0f)+(R(%1.0f,%1.0f)-R(%1.0f,%1.0f)/%d)==>',cont1,cont2,cont1,cont2-1,cont1,cont2-1,cont1-1,cont2-1,(4^(cont2-1)-1));
 disp(t(cont1,cont2));
 cont1=cont1+1;
 end
 cont3=cont3+1;
 cont1=cont3;
 cont2=cont2+1;
end
%clear all integracion de simpsom
syms x y;
funcion=input('funcion=');
a=input('a=');
b=input('b=');
n=input('n=');
h=(b-a)/n;
for i=1:n-1
 x(i)=a+i*h;
 fprintf('x(%d)= ',i)
 pretty(x(i));
 %disp(x(i));
end
part2=0;
for i=1:(n/2-1)
 part2=part2+subs(funcion,x(i*2));
end
part3=0;
for i=1:(n/2)
 part3=part3+subs(funcion,x(i*2-1));
end
resultado=(h/3)*(subs(funcion,a)+2*part2+4*part3+subs(funcion,b));
double(resultado)
 % extrapolaci髇 de richarson programa 1
function N = richardson2B(f, x0, n, h, pre)
%meter lo de arriba asi como va copy paste! y la funcion f es primero
%hayq declararla!
% f es la funcion, x0 el de aproximar, n el subindice de N, h es h y pre es
% precisi锟絥 (opcional)
if nargin < 5
 pre = 8;
end
pre = num2str(pre);
N = zeros(n,n);
% generamos la primera columna
for a = 1:n
 h_ = h/(2^(a-1)); 
 expr = sprintf('[1/(2*(%g))]*[f(%g) - f(%g)]', h_, x0 + h_, x0 - h_); 
 N(a, 1) = centrada3_fun(f, x0, h_, str2num(pre)); 
 
end
% las demas columnas
for a = 2:n
 for b = a:n
 N(b, a) = N(b, a-1) + (N(b, a-1) - N(b-1, a-1))/(4^(a-1) - 1);
 end
end
 % extrpolacion de Richardson programa 2
function RICHARDSON(h,N,Xo,g)
%h es el espaciado, N es hasta q numero se va a llegar N3,N4, etc. Xo es el
%punto en donde se va a evaluar la derivada y g es la funcion.
R=zeros(N,N);
for j=1:N
 X1=Xo+h;
 X2=Xo-h;
 syms x
 g1=subs(g,X1);
 g2=subs(g,X2);
 %Primero usamos la formula de 3 puntos
 %f'(h)=(1/2h)(f(x0+h)-f(x0-h))
 %f'(h/2)=(1/2(h/2))(f(x0+(h/2))-f(x0-(h/2)))
 R(j,1)=(1/(2*h))*(g1-g2);
 fprintf('h=%1.4f\n',h)
 h=h/2;
end
for j=2:N
 for i=j:N
 R(i,j)=R(i,j-1) + (R(i,j-1)-R(i-1,j-1))/((4^(j-1))-1);
 end
end
for j=1:N
 for i=j:N
fprintf('N(%d,%d)= %3.10f\n',i,j,R(i,j))
 end
end
valor_aproximado=R(N,N)
gp=diff(g);
valor_exacto=subs(gp,Xo)
error=abs(valor_aproximado - valor_exacto)
%Formula de Richardson
% N1(h/2)-N1(h) 
%N2(h)=N1(h/2)+ -------------
% 4^(j-1))-1
%
% N1(h/4)-N1(h/2) 
%N2(h/2)=N1(h/4)+ -------------
% 4^(j-1))-1
%
%....

Otros materiales