Matlab - Iterar en función del tiempo

   
Vista:

Iterar en función del tiempo

Publicado por Pablo (9 intervenciones) el 24/09/2017 21:54:34
Estimados todos!

Tengo un problema: necesito iterar una serie de valores en un tiempo para distintos tiempos de una función.
Requiero obtener un valor a través de un proceso iterativo para distintos tiempos en un lapsus de una hora. Para el proceso iterativo, utilizo el método de la Regla Falsa. Sin embargo, y a pesar de mis intentos de re-programar, no he podido hacer que MATLAB identifique el paso de tiempo y solo me entrega el valor final de una iteración.
A continuación, les muestro mi programación y les pido me ayuden a identificar mis errores.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
%% INICIO DEL MÉTODO ITERATIVO %
 
% Ajuste de unidades
 
C_gf0= imput % Concentración inicial
K_T= 4.7569e-07
ITE= imput % Numero de iteraciónes
TOL= imput % Tolerancia para el error
 
Mg=180.16; % Masa molecular de la glucosa en g/mol
C_gf0_trans=C_gf0.*(1000./Mg); % Concentración de glucosa inicial en la alimentación en mol/m^3
C_gf=C_gf0_trans;
 
tic % Inicio del reloj
i=0;
 
for t=0:dt:60; % Equivalente a una hora en minutos
 
    % Método Regla Falsa.
    Cg_1=0.000001.*C_gf0_trans;
    Cg_2=0.999999.*C_gf0_trans;
 
    while i <  ITE;
 
            C_gf_out=[Cg_1 Cg_2] % Concentración de glucosa de salida en el flujo de alimentación
 
            % Determinación del flujo de glucosa transferico mediante
            % balance de masa
 
            Q_f_trnas=Q_f.*(1./(6.*10^(7)));
            w_glu_1=Q_f_trnas.*(C_gf0_trans-C_gf_out(1)); % Flujo de glucosa transferido en mol/s
            w_glu_2=Q_f_trnas.*(C_gf0_trans-C_gf_out(2)); % Flujo de glucosa transferido en mol/s
 
            % Determinación del flujo de glucosa transferido mediante
            % teorema de resistencia en serie
 
            A_T=1.7; % Área de transferencia total  del modulo de membra en m^2
            log_g_1=log(C_gf0_trans./C_gf_out(1));
            Delta_Cg_1=(C_gf0_trans-C_gf_out(1))./log_g_1;
            Ng_1=K_T.*A_T.*Delta_Cg_1; % Flujo de glucosa transferido en mol/s
 
            log_g_2=log(C_gf0_trans./C_gf_out(2));
            Delta_Cg_2=(C_gf0_trans-C_gf_out(2))./log_g_2;
            Ng_2=K_T.*A_T.*Delta_Cg_2; % Flujo de glucosa transferido en mol/s
 
            % Definición del Error
 
            err_1=(-1).*(w_glu_1-Ng_1)./w_glu_1;
            err_2=(-1).*(w_glu_2-Ng_2)./w_glu_2;
 
            if i < ITE
                Cg_3=((err_2.*Cg_1)-(err_1.*Cg_2))./(err_2-err_1)
 
                % Estimación del flujo de glucosa a partir de Cg_3
 
                w_glu_3=(Q_f_ind_trans.*(C_gf0_trans-Cg_3)); % Flujo de glucosa transferido en mol/s
                log_g_3=log(C_gf0_trans./Cg_3);
                Delta_Cg_3=(C_gf0_trans-Cg_3)./log_g_3;
                Ng_3=K_T.*A_T.*Delta_Cg_3; % Flujo de glucosa transferido en mol/s
 
                err_3=(w_glu_3-Ng_3)./w_glu_3;
 
            % Inicia las condiciones para cambiar de punto
            if err_1*err_3<0 && err_3<=TOL
               Cg_2=Cg_3;
            elseif err_1*err_3>0 && err_3<=TOL
               Cg_1=Cg_3;
            else
                disp('Error durante la iteración')
                err_3=100; % Alto error
                break
            end
 
           end
 
    % Criterio de paro
 
    i=i+1;
end

He intentado cambiar i=ITE por i=t, sin embargo no obtengo resultado.
En teoría, yo debería poder calcular para un tiempo t=n un valor de Cg_3(n), donde para cada paso de tiempo n, iterar para encontrar el valor de Cg_3, sin embargo, no he podido programar correctamente esto.

Les agradezco cualquier ayuda que me pueda realizar, ya que este trabajo es parte del desarrollo de mi trabajo de tesis.

Saludos!
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 JESUS DAVID ARIZA ROYETH

Iterar en función del tiempo

Hay una cosa que debes conocer y es que el tiempo de procesamiento es diferente al tiempo real, por ejemplo si tú haces :

1
2
3
for k=1:60
disp(K)
end

puede que se demore en tu pc menos que en otra pc, ya que esto depende de la velocidad y de los procesos que tengas abiertos, para iterar en un tiempo determinado debes hacer un contador con el tiempo que se demore tu iteración realmente, puede ser así :

1
2
3
4
5
6
7
a=0;
while a<60%60 segundos
tic;
% iterar
b=toc;
a=a+toc;
end

espero te haya ayudado
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

Iterar en función del tiempo

Publicado por Pablo (9 intervenciones) el 24/09/2017 22:29:43
No se trata del tiempo que tarde o "demore" en realizar la iteración. Sino que el proceso que yo estoy programado, tiene un tiempo de análisis de una hora. Debo obtener distintos valores de Cg_3 para distintos tiempos t que van en un intervalo de 0 a 60 minutos.
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 JESUS DAVID ARIZA ROYETH

Iterar en función del tiempo

entonces es solo es cuestión de que inicialices una variable,antes del ciclo puede ser vacía :

1
todos=[];


y en cada iteraciòn guardes el resultado (dentro de ciclo) :

1
todos(end+1)=Cg_3;


luego al final del ciclo, después de end puedes si quieres mostrar todos tus Cq_3 guardados en todos :

1
disp(todos)
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

Iterar en función del tiempo

Publicado por Pablo (9 intervenciones) el 25/09/2017 01:56:48
Entiendo do. Lo intentaré.
Pero de cualquier modo, el mostrar los valores de Cg_3 no es el problema. El problema es que solo me interesa hasta obtener un valor para un t=n pero para un t=n+1 (el siguiente paso de tiempo) no itera, no vuelve a entrar al ciclo.
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 JESUS DAVID ARIZA ROYETH

Iterar en función del tiempo

dada la única información que adjuntas el criterio de parada lo define ITE, ITE define el n último que vas a obtener , y si estás haciendo un for debes volver a asignar el valor inicial a i , por lo tanto i=0; debería estar dentro del for para que siga iterando ya que en el primer momentos i se hace mayor que ite y debes volver a reiniciarlo
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