====== Espacialmente Explicito ======
8-O Essa função está em construção... ainda precisa de trabalho. Estamos no caminho!
meta.espacial=function(tf,c,l,fi,i,pe, pi, canto=FALSE)
{
paisag=array(0,dim=c(l,c,tf))
nmanchas=c*l
if(canto==TRUE)
{
paisag[1:round(l*fi),1:round(c*fi),1]=1
}
else
{
paisag[,,1]=matrix(sample(c(rep(1,fi*nmanchas), rep(0,round((1-fi)*nmanchas)))), ncol=c)
}
resultado=numeric()
for(t in 2:tf)
{
vazio=which(paisag[,,(t-1)]==0, arr.ind=TRUE)
nvazio=dim(vazio)[1]
ocupa=which(paisag[,,(t-1)]==1, arr.ind=TRUE)
nocupa=dim(ocupa)[1]
dif=outer(ocupa,vazio, "-")
difx=dif[,1,,1]
dify=dif[,2,,2]
dist=sqrt(difx^2+dify^2)
dist.media=apply(dist,2,mean)
dist.max=sqrt(c^2+l^2)
dist.rel=(dist.max-dist.media)/dist.max
pi.aj=pi*dist.rel
paisag[,,t][paisag[,,(t-1)]==1]<-sample(c(0,1),nocupa,replace=T,prob=c(pe,1-pe))
paisag[,,t][paisag[,,(t-1)]==0]<-rbinom(nvazio,1,prob=pi.aj)
resultado[t-1]=sum(paisag[,,t])/nmanchas
}
#F=1-(pe/i)
plot(1:tf,c(fi,resultado),type="l",xlab="Tempo",ylab="Fração de manchas ocupadas",
ylim=c(0,1),main="Dinâmica de ocupação de manchas",font.lab=2,lwd=2)
#abline(h=F,col=2,lwd=2,lty=2)
invisible(paisag)
}
Os argumentos da função são:
* tf => número de iterações ou tempo final da simulação
* c = número de colunas do seu universo de manchas
* l = número de linhas
* fi= proporção de manchas ocupadas no tempo inicial
* pe= probabilidade de extinção
* canto=manchas ocupadas no tempo inicial agrupadas ou não (TRUE/FALSE)
Copie também a função abaixo para fazer a simulação animada.
anima2=function(dados)
{
tf=dim(dados)[3]
for(i in 1:tf){
image(dados[,,i], main=("Ocupação de manchas"),col=c("white","red"),bty="n",xaxt='n',yaxt='n')
grid(dim(dados)[1],dim(dados)[2])
Sys.sleep(.2)
}
}
Pronto! Agora é só rodar o exemplo abaixo e depois mudar os parâmetros da primeira linha para rodar novas simulações:
simula=meta.espacial(tf=100,c=10,l=10,fi=0.1,pe=0.2,pi=0.3, canto=TRUE)
x11()
anima2(simula1)