Matlab - Funcion crecimiento fallida

 
Vista:

Funcion crecimiento fallida

Publicado por Marina (2 intervenciones) el 06/01/2017 21:47:36
Hola a todos,

Necesito realizar una función de crecimiento de 2 poblaciones siguiendo esta formula:
1
2
N1(t+1)=N1(t)+ (r1*N1(t)*(K-N1(t)-A*N2(t)))/K
N2 ( t + 1 ) = N2 ( t ) +( r2 N 2 ( t ) [ K - N2( t ) -B* N 1 ( t ) ] ) / K
Teniendo en cuanta que sería en 100 periodos y los resutados habría que almacenarlos en un vector, todo simple pero el problema llega cuando uno de los valores(K) que tengo que introducir me sale también como un vector de 100 donde solo la 1 posición tiene valor y el resto cero(lo que explica que solo me salgan los 2 primeros números). Y realmente no se que más hacer, por si a alguien se le ocurre donde está el fallo. Gracias

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
function [N]= CalcularCrecimientoPoblacion(No1,No2,r1,r2,K,A,B)
%Calcula, para cada instante de tiempo t (de 1 a 100) el tamaño de cada población. 
% Argumentos de entrada:
% No1= Valor inicial de individuos poblacion 1 % No2= Valor inicial de individuos poblacion 2
% r1= Tasa de crecimiento poblacion 1 % r2= Tasa de crecimiento poblacion 2
% K= capacidades de carga de ambas poblaciones
% A= parámetros de competencia alfa % B= parámetros de competencia beta
% Argumento de salida:
% matriz= matriz bidimensional de 100 flas x 2 columnas que contienen el
% numero de individuos del instante 1 al 100 para ambas poblaciones
%Ejemplo de llamada: matrizpob= CalcularCrecimientoPoblacion(400,93,2.09,0.24,450,-0.92,-0.48)
 
%Periodos de tiempo que vamos a estudiar
tiempo=100;
%Vector donde vamos a almacenar la población en cada generación
v=[];
vec=[];
%Población inicial de las especies
N1(1)=No1;
N2(1)=No2;
%Calculamos la población a lo largo del tiempo según el crecimiento logístico
for t=1:tiempo-1
    N1t=fix(N1(t)+ (r1*N1(t)*(K-N1(t)-A*N2(t)))/K);
    v=[v,N1t];
    N2t=fix(N2(t)+ (r2*N2(t)*(K-N2(t)-B*N1(t)))/K);
    vec=[vec,N2t];
end
N=[N1(1),v;N2(1),vec];
N=N' %Matriz transpuesta de N. Resultado final


end
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 Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Funcion crecimiento fallida

Publicado por Daniel (264 intervenciones) el 06/01/2017 22:40:54
El problema está en el ciclo for ya que no estas actualizando el valor de N(t)...

Deberias poner algo asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
%Periodos de tiempo que vamos a estudiar
tiempo=100;
%Población inicial de las especies
N1(1)=No1;
N2(1)=No2;
%Calculamos la población a lo largo del tiempo según el crecimiento logístico
for t=1:tiempo-1
N1(t+1)=fix(N1(t)+ (r1*N1(t)*(K-N1(t)-A*N2(t)))/K);
N2(t+1)=fix(N2(t)+ (r2*N2(t)*(K-N2(t)-B*N1(t)))/K);
end
N=[N1;N2]';
% N Resultado final
plot(1:tiempo,N1,1:tiempo,N2)

Comentanos como te fue

Saludos

Daniel


Yo lo probé con valores

1
2
3
4
5
6
7
No1=70000;
No2=100000;
r1=.008;
r2=.005;
K=8000;
A=0.10;
B=2;
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

Funcion crecimiento fallida

Publicado por Marina (2 intervenciones) el 07/01/2017 01:38:13
Muchas gracias por responder. Si pensé tu idea y con mis resultados me salió 'NaN' todo el rato, y mi profesor me aclaró que N(t+1) no es un nombre posible de una variable en matlab dice. He probado tu programa y me da perfectamente bien con tus datos pero a la hora de sustituir con mis valores es cuando aparece de nuevo NaN. Podría ser un error a la hora de introducirlos? No sé si tendrá que ver con que la A y B sean negativas
Lo adjunto aquí de nuevo con mis datos:
1
tiempo=100
1
No1=400;
1
No2=93;
1
A=-.48;
1
B=-.92;
1
K=450;
1
r1=2.09;
1
r2=.24;

1
N1(1)=No1;
1
N2(1)=No2;
1
for t=1:tiempo-1
1
N1(t+1)=fix(N1(t)+ (r1*N1(t)*(K-N1(t)-A*N2(t)))/K);
1
N2(t+1)=fix(N2(t)+ (r2*N2(t)*(K-N2(t)-B*N1(t)))/K);
1
end
1
N=[N1;N2]'; % N Resultado final
1
plot(1:tiempo,N1,1:tiempo,N2)
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 Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Funcion crecimiento fallida

Publicado por Daniel (264 intervenciones) el 09/01/2017 17:24:02
Lo que ocurre con los datos que vos ingresas es que en algún momento la población de una de las especies da menor a cero (lo cual no tiene sentido) sin embargo el código continua corriendo y arroja resultados también sin sentido. Una manera de solucionar esto es indicarle al código que si N1 o N2 son menores a cero la población de esa especie sea cero (valor lógico dado que representa la población de una especie)

Para esto puedes agregar una condiciones al código para que se fije esto y lo "solucione"...
El ciclo "for" quedaría asi:

1
2
3
4
5
6
7
8
9
10
11
12
%Calculamos la población a lo largo del tiempo según el crecimiento logístico
for t=1:tiempo-1
    N1(t+1)=fix(N1(t)+ (r1*N1(t)*(K-N1(t)-A*N2(t)))/K);
    if N1(t+1)<0
        N1(t+1)=0;
    end
 
    N2(t+1)=fix(N2(t)+ (r2*N2(t)*(K-N2(t)-B*N1(t)))/K);
    if N2(t+1)<0
        N2(t+1)=0;
    end
end

Lo demás quedaría igual

Comentanos como te fue

Saludos

Daniel
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