/* density dependent logistic growth simulation */ #include <stdlib.h> /* for drand48() */ #include <stdio.h> #define MAX_TIME 1000 #define PRNT_INTERVAL 10 #define DATA_POINTS (MAX_TIME/PRNT_INTERVAL) #define BIRTH_RATE 0.2 #define DEATH_RATE 0.1 #define KK 20.0 /* This is NOT carrying capacity */ #define INIT_POP_SIZE 5 /* Model 1 --- dN/dt = b N (1 - N / k) - d N Model 2 --- dN/dt = b N - d N (1 + b N / (k d)) */ double birthR, deathR, kk; int PopChange(int, int); int main(void) { int run, ttt, n1, n2, n3, outputCnter, seed, numRuns; double pops1[DATA_POINTS], pops2[DATA_POINTS]; birthR = BIRTH_RATE; deathR = DEATH_RATE; kk = KK; seed = 1456739853; srand48(seed); fprintf(stderr, "Enter number of runs:\n"); scanf("%d", &numRuns); /* initialize the array */ for(ttt=0;ttt<DATA_POINTS;ttt++) { pops1[ttt] = pops2[ttt] = 0.0; } /* run simulations */ for(run=0;run<numRuns;run++) { outputCnter = 0; n1 = n2 = INIT_POP_SIZE; for(ttt=0; ttt<MAX_TIME; ttt++) { n1 += PopChange(n1,1); n2 += PopChange(n2,2); if(ttt%PRNT_INTERVAL == 0) { pops1[outputCnter] += n1; pops2[outputCnter] += n2; outputCnter++; } if(n1==0 && n2==0) /* extinction */ break; } } /* print out the results */ printf("time Ave(n1) Ave(n2)\n"); for(ttt=0; ttt<DATA_POINTS; ttt++) printf("%d %lf %lf \n",ttt*PRNT_INTERVAL, pops1[ttt]/(double)numRuns, pops2[ttt]/(double)numRuns); return 0; } /* This function calculate the changes in the population size The 2nd argument is model number (1 for d.d. birth, 2 for d.d. death) */ int PopChange(int curPopSize, int model) { int popIncrement, newborn=0, death=0, i; double popD; popD = (double) curPopSize; /* model 1 : density dep birthR */ if(model==1) { for(i=0; i<curPopSize; i++) { if(drand48() < birthR*(1.0 - popD/kk)) newborn ++; } for(i=0;i<curPopSize;i++) { if(drand48() < deathR) death ++; } } /* model 2 : density dep death */ if(model==2) { for(i=0; i<curPopSize; i++) { if(drand48() < birthR) newborn++; } for(i=0; i<curPopSize; i++) { if(drand48() < deathR + birthR*popD/kk) death++; } } popIncrement = newborn - death; return popIncrement; }