Problema. Considere el método de Runge

Anuncio
Problema. Considere el método de Runge-Kutta de cinco etapas dado por el tablero
0
1/2
1/2
1
1
0
1/2
0 1/2
0
0
1
1/6 1/3 1/3 1/6
1/6 1/3 1/3 1/12 1/12
1. Diseñe una función de Matlab que implemente el método anterior y cuyos argumentos de entrada sean la correspondiente función f un, el instante inicial t0 , el
instante final tf , el valor inicial y0 y el tamaño del paso h.
2. Obtenga una tabla con los errores relativos, en t = 1, cometidos al integrar el sistema
diferencial
½ 0
x1 (0) = 1
x1 = x1
,
,
0
x2 (0) = 1
x2 = −x2
mediante el método Runge-Kutta anterior para h = 0.1, 0.01, 0.001, 0.0001. A la
vista de la tabla, determine experimentalmente el orden del método anterior.
3. Considere ahora el sistema diferencial
½ 0
y1 = 1 + y12 y2 − 4y1
,
y20 = 3y1 − y12 y2
y1 (0) = 1.5
.
y2 (0) = 0
Usando el método anterior, determine en formato largo la expresión
y1 (5) + y20 (5)
para h = 0.001. Asimismo, en el intervalo [0, 10], esboce la gráfica de y1 que se
obtiene para dicho valor de h.
(1)
function [T,Y]=rungekutta(fun,t0,tf,y0,h)
T=(t0:h:tf)’;
n=length(T);
Y=zeros(n,length(y0));
y0=y0(:);Y(1,:)=y0’;
for k=1:n-1
k1=feval(fun,T(k),Y(k,:))’;
k2=feval(fun,T(k)+0.5*h,Y(k,:)+0.5*h*k1)’;
k3=feval(fun,T(k)+0.5*h,Y(k,:)+0.5*h*k2)’;
k4=feval(fun,T(k)+h,Y(k,:)+h*k3)’;
k5=feval(fun,T(k)+h,Y(k,:)+(h/6)*(k1+2*k2+2*k3+k4))’;
Y(k+1,:)=Y(k,:)+(h/12)*(2*k1+4*k2+4*k3+k4+k5);
end
(2)
function apartado2(p)
h=1;
for k=1:p
h=h/10;
[T,Y]=rungekutta(@fun,0,1,[1,1],h);
n=length(T);
error_rel=norm(Y(n,:)-[exp(1),exp(-1)])/norm([exp(1),exp(-1)]);
fprintf(’h=10^(-%1.0f) Error_Rel=%16.15f\n’,k,error_rel)
pause(0.1)
end
function dydt=fun(t,y)
dydt=[y(1);-y(2)];
Ejecutamos el fichero:
>> apartado2(5)
h=10^(-1) Error_Rel=0.000006743891679
h=10^(-2) Error_Rel=0.000000006924364
h=10^(-3) Error_Rel=0.000000000006942
h=10^(-4) Error_Rel=0.000000000000003
h=10^(-5) Error_Rel=0.000000000000002
El método es de orden tres pues se ganan tres posiciones en cada iteración.
(3)
function apartado3
[T,Y]=rungekutta(@fun,0,5,[1.5,0],0.001);
n=length(T);
valor=Y(n,1)+3*Y(n,1)-Y(n,1)^2*Y(n,2);
fprintf(’y1(5)+y2(5)=%16.15f\n’,valor)
pause
[T,Y]=rungekutta(@fun,0,10,[1.5,0],0.001);
plot(T,Y(:,1)),shg
function dydt=fun(t,y)
dydt=[1+y(1)^2*y(2)-4*y(1)
3*y(1)-y(1)^2*y(2)];
Ejecutamos el fichero:
>> apartado3
y1(5)+y2(5)=0.933714376481227
2
4
3.5
3
2.5
2
1.5
1
0.5
0
0
2
4
6
3
8
10
Descargar