Matlab - Pasar Programa a Función

 
Vista:
sin imagen de perfil

Pasar Programa a Función

Publicado por Juan José (60 intervenciones) el 14/05/2015 22:37:28
Buenas,

He realizado un programa para Runge-Kutta4 en sistemas de ecuaciones y funciona perfectamente. Me gustaría pasarlo a modo function pero tengo mis dudas de cómo meter en un archivo F.m (que luego es un input de la función) las ecuaciones que formen el sistema.

La duda radica en que tengo que meter funciones que puedan ser evaluadas, como las function handle que he utilizado en RK4 para una EDO normal.

¿Alguien tiene alguna idea? He probado cosas pero me da error.

Adjunto el programa por si os es más fácil ayudarme. Alguien sabe que ocurre que no me adjunta .zip??

COPIO:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
% Método Runge-Kutta 4 para sistemas de ecuaciones diferenciales
% Programa para sistemas de ecuaciones del tipo:
% x' = f(t,x,y)   x(t0) = x0
% y' = f(t,x,y)   y(t0) = y0

% Introducimos Ecuaciones (function_handle):
fx = input( 'Introduce la función f(t,x,y) de la 1ª Ecuación:\nfx:' );
fy = input( 'Introduce la función f(t,x,y) de la 2ª Ecuación:\nfy:' );
% Introducimos condiciones iniciales:
Z0 = input( 'Introduce condiciones iniciales Z0 = [ x0 , y0 ]:\n');
% Introducimos valores:
h = input( 'Introduce el tamaño de paso:\nh:' );
a = input( 'Introduce el extremo inferior del intervalo:\na:' );
b = input( 'Introduce el extremo superior del intervalo:\nb:' );
% Número de pasos
M = ( b - a ) / h ;
 
% Cálculo:
T = zeros( 1 , M + 1 );     % Vector de Abscisas
X = zeros( 1 , M + 1 );     % Vector de Ordenadas Xk
Y = zeros( 1 , M + 1 );     % Vector de Ordenadas Yk
T = a : h : b ;
X(1) = Z0(1,1);
Y(1) = Z0(1,2);
for j = 1 : M
    f1 = feval( fx , T(j) , X(j) , Y(j) );
    g1 = feval( fy , T(j) , X(j) , Y(j) );
    f2 = feval( fx , T(j) + h/2 , X(j) + h/2 * f1 , Y(j) + h/2 * g1 );
    g2 = feval( fy , T(j) + h/2 , X(j) + h/2 * f1 , Y(j) + h/2 * g1 );
    f3 = feval( fx , T(j) + h/2 , X(j) + h/2 * f2 , Y(j) + h/2 * g2 );
    g3 = feval( fy , T(j) + h/2 , X(j) + h/2 * f2 , Y(j) + h/2 * g2 );
    f4 = feval( fx , T(j) + h , X(j) + h * f3 , Y(j) + h * g3);
    g4 = feval( fy , T(j) + h , X(j) + h * f3 , Y(j) + h * g3);
    X( j + 1 ) = X( j ) + ( h/6 )*( f1 + 2 * f2 + 2 * f3 + f4 );
    Y( j + 1 ) = Y( j ) + ( h/6 )*( g1 + 2 * g2 + 2 * g3 + g4 );
end
 
% Resultado:
RKS = [ T' X' Y' ];

Gracias y un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Pasar Programa a Función

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 15/05/2015 21:40:45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function  Runge_Kutta4(fx,fy,Z0,h,a,b)
if nargin<1
  syms t
    fx=exp(t);
    fy=exp(-t);
    Z0=[1 1];
    h=0.1;
    a=0;
    b=2;
end
fx=inline(fx,'t','x','y');
fy=inline(fy,'t','x','y');
% Método Runge-Kutta 4 para sistemas de ecuaciones diferenciales
% Programa para sistemas de ecuaciones del tipo:
% x' = f(t,x,y)   x(t0) = x0
% y' = f(t,x,y)   y(t0) = y0
 
% Introducimos Ecuaciones (function_handle):
% fx = input( 'Introduce la función f(t,x,y) de la 1ª Ecuación:\nfx:' );
% fy = input( 'Introduce la función f(t,x,y) de la 2ª Ecuación:\nfy:' );
% % Introducimos condiciones iniciales:
% Z0 = input( 'Introduce condiciones iniciales Z0 = [ x0 , y0 ]:\n');
% % Introducimos valores:
% h = input( 'Introduce el tamaño de paso:\nh:' );
% a = input( 'Introduce el extremo inferior del intervalo:\na:' );
% b = input( 'Introduce el extremo superior del intervalo:\nb:' );
% Número de pasos
M = ( b - a ) / h ;
 
% Cálculo:
T = zeros( 1 , M + 1 );     % Vector de Abscisas
X = zeros( 1 , M + 1 );     % Vector de Ordenadas Xk
Y = zeros( 1 , M + 1 );     % Vector de Ordenadas Yk
T = a : h : b ;
X(1) = Z0(1,1);
Y(1) = Z0(1,2);
for j = 1 : M
    f1 = fx(T(j) , X(j) , Y(j) );
    g1 = fy(T(j) , X(j) , Y(j) );
    f2 = fx(T(j) + h/2 , X(j) + h/2 * f1 , Y(j) + h/2 * g1 );
    g2 = fy( T(j) + h/2 , X(j) + h/2 * f1 , Y(j) + h/2 * g1 );
    f3 = fx(T(j) + h/2 , X(j) + h/2 * f2 , Y(j) + h/2 * g2 );
    g3 =fy( T(j) + h/2 , X(j) + h/2 * f2 , Y(j) + h/2 * g2 );
    f4 = fx(T(j) + h , X(j) + h * f3 , Y(j) + h * g3);
    g4 =fy( T(j) + h , X(j) + h * f3 , Y(j) + h * g3);
    X( j + 1 ) = X( j ) + ( h/6 )*( f1 + 2 * f2 + 2 * f3 + f4 );
    Y( j + 1 ) = Y( j ) + ( h/6 )*( g1 + 2 * g2 + 2 * g3 + g4 );
end
 
% Resultado:
RKS = [ T' X' Y' ]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>> syms t, Runge_Kutta4(exp(t),exp(-t),[1 1],0.1,0,2)
 
RKS =
 
         0    1.0000    1.0000
    0.1000    1.1052    1.0952
    0.2000    1.2214    1.1813
    0.3000    1.3499    1.2592
    0.4000    1.4918    1.3297
    0.5000    1.6487    1.3935
    0.6000    1.8221    1.4512
    0.7000    2.0138    1.5034
    0.8000    2.2255    1.5507
    0.9000    2.4596    1.5934
    1.0000    2.7183    1.6321
    1.1000    3.0042    1.6671
    1.2000    3.3201    1.6988
    1.3000    3.6693    1.7275
    1.4000    4.0552    1.7534
    1.5000    4.4817    1.7769
    1.6000    4.9530    1.7981
    1.7000    5.4739    1.8173
    1.8000    6.0496    1.8347
    1.9000    6.6859    1.8504
    2.0000    7.3891    1.8647

Saludos .
JOSE JEREMÍAS CABALLERO
Asesoría online en Matlab
Servicios de programación matlab
[email protected]
skype: josejeremiascaballero
Estimado Usuario, el correo es para servicios de cursos, asesoría y programación. Toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Pasar Programa a Función

Publicado por Juan José (60 intervenciones) el 16/05/2015 09:08:29
Gracias por la respuesta José,

Finalmente he tenido que realizar algo similar, es decir, incluir en los inputs de la gráfica dos funciones (en mi caso funcion handle) en lugar de una F.m donde se incluyeran las dos en un mismo archivo.

¿Esto podría realizarse? Por otra parte, ¿Con que objetivo se pone estas líneas de comandos?

1
2
3
4
5
6
7
8
9
if nargin<1
  syms t
    fx=exp(t);
    fy=exp(-t);
    Z0=[1 1];
    h=0.1;
    a=0;
    b=2;
end

Gracias de nuevo. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Pasar Programa a Función

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 16/05/2015 15:05:17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>> syms t, Runge_Kutta4
 
RKS =
 
         0    1.0000    1.0000
    0.1000    1.1052    1.0952
    0.2000    1.2214    1.1813
    0.3000    1.3499    1.2592
    0.4000    1.4918    1.3297
    0.5000    1.6487    1.3935
    0.6000    1.8221    1.4512
    0.7000    2.0138    1.5034
    0.8000    2.2255    1.5507
    0.9000    2.4596    1.5934
    1.0000    2.7183    1.6321
    1.1000    3.0042    1.6671
    1.2000    3.3201    1.6988
    1.3000    3.6693    1.7275
    1.4000    4.0552    1.7534
    1.5000    4.4817    1.7769
    1.6000    4.9530    1.7981
    1.7000    5.4739    1.8173
    1.8000    6.0496    1.8347
    1.9000    6.6859    1.8504
    2.0000    7.3891    1.8647
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar