1. EQUAZIONE DEL CALORE
Il codice “temporizza” le immagini in modo da far vedere un
filmino. Il numero totale di passi temporali è NT, divisi in NT0 gruppi di Temp passi. Viene visualizzata un’immagine ogni Temp passi, ovvero alla fine di ogni gruppo.
Il numero di noti spaziali è Nx.
Invece che prefissare L, per tenere più sotto controllo il tempo di calcolo (che dipende da Nx), si prefissano Nx e dx, da cui si trova L.
Temp=50; NT0 = 500
NT= NT0*Temp; Nx=1000; dx=0.01; sig=1 L=dx*Nx/2
dt=dx^2/(2*sig^2) Nx.virt=Nx+1
u = matrix(nrow=Nx.virt, ncol=NT) X=seq(-L,L,dx)
eps=0.0001
u[,1]=(1/sqrt(2*pi*eps))*exp(-X^2/(2*eps)) for (t0 in 1:(NT0-1)) {
for (t1 in 1:Temp) { t=(t0-1)*Temp + t1 for (i in 2:Nx) {
u[i,t+1] = u[i,t] + (sig^2/2) * dt * ((u[i+1,t]-2*u[i,t]+u[i- 1,t])) / (dx^2)
}
u[1,t+1]=u[2,t+1]; u[Nx.virt,t+1]=u[Nx,t+1]
}
plot(c(-L,L),c(-0.5,5),type="n") lines(X,u[,t+1])
lines(c(-L,L),c(0,0)) }
Monte Carlo:
Temp=10; NT0 = 500
NT= NT0*Temp; N.part=10000; sig=1 dt=0.0005
u = matrix(nrow=N.part, ncol=NT) u[,1]=0
for (t0 in 1:(NT0-1)) { for (t1 in 1:Temp) {
t=(t0-1)*Temp + t1 for (i in 1:N.part) {
u[i,t+1] = u[i,t] + sig * sqrt(dt) * rnorm(1) }
}
hist(u[,t+1],50) }
2. EQUAZIONE LINEARE
Temp=10; NT0 = 500
NT= NT0*Temp; N.part=10000; sig=1 dt=0.0005; lambda=10
u = matrix(nrow=N.part, ncol=NT) u[,1]=1
for (t0 in 1:(NT0-1)) { for (t1 in 1:Temp) { t=(t0-1)*Temp + t1 for (i in 1:N.part) {
u[i,t+1] = u[i,t] - lambda* u[i,t]*dt+ sig * sqrt(dt) * rnorm(1) }
}
hist(u[,t+1],50) }
Temp=50; NT0 = 500
NT= NT0*Temp; Nx=1000; dx=0.01; sig=1; lambda=10 L=dx*Nx/2
dt=dx^2/(2*sig^2) Nx.virt=Nx+1
u = matrix(nrow=Nx.virt, ncol=NT) X=seq(-L,L,dx)
eps=0.0001
u[,1]=(1/sqrt(2*pi*eps))*exp(-(X-1)^2/(2*eps)) for (t0 in 1:(NT0-1)) {
for (t1 in 1:Temp) { t=(t0-1)*Temp + t1 for (i in 2:Nx) {
u[i,t+1] = u[i,t] + (sig^2/2) * dt * ((u[i+1,t]-2*u[i,t]+u[i- 1,t])) / (dx^2) + lambda*dt*(X[i+1]* u[i+1,t]- X[i]* u[i,t])/dx }
u[1,t+1]=u[2,t+1]; u[Nx.virt,t+1]=u[Nx,t+1]
}
plot(c(-L,L),c(-0.5,5),type="n") lines(X,u[,t+1])
lines(c(-L,L),c(0,0)) }
3. EQUAZIONE NON LINEARE
Qui acceleriamo un po’
Temp=10; NT0 = 500
NT= NT0*Temp; N.part=10000; sig=1 dt=0.01
u = matrix(nrow=N.part, ncol=NT) u[,1]=0.5
for (t0 in 1:(NT0-1)) { for (t1 in 1:Temp) { t=(t0-1)*Temp + t1 for (i in 1:N.part) {
u[i,t+1] = u[i,t] +dt* (u[i,t]- u[i,t]^3)+ sig * sqrt(dt) * rnorm(1)
} }
hist(u[,t+1],50) }
Temp=100; NT0 = 500
NT= NT0*Temp; Nx=200; dx=0.03; sig=1 L=dx*Nx/2
dt=dx^2/(2*sig^2) Nx.virt=Nx+1
u = matrix(nrow=Nx.virt, ncol=NT) X=seq(-L,L,dx)
eps=0.0001
u[,1]=(1/sqrt(2*pi*eps))*exp(-(X-0.5)^2/(2*eps)) for (t0 in 1:(NT0-1)) {
for (t1 in 1:Temp) { t=(t0-1)*Temp + t1 for (i in 2:Nx) {
u[i,t+1] = u[i,t] + (sig^2/2) * dt * ((u[i+1,t]-2*u[i,t]+u[i-
1,t])) / (dx^2) - dt*((X[i+1]-X[i+1]^3)* u[i+1,t]- (X[i]-X[i]^3)*
u[i,t])/dx }
u[1,t+1]=0; u[Nx.virt,t+1]=0 }
plot(c(-L,L),c(-0.5,1),type="n") lines(X,u[,t+1])
lines(c(-L,L),c(0,0)) }
Nota: sono state messe le condizioni al bordo nulle
4. DENSITA’ INVARIANTE, ESEMPIO LINEARE
Esempio lineare, sig=1, lambda=10. Non ci curiamo della scala giusta sull’asse delle ordinate e quindi prendiamo Z=1.
X= seq(-4,4, 0.01) Y=exp(-10*X^2)
plot(c(-4,4),c(-0.5,2),type="n") lines(X,Y)
lines(c(-4,4),c(0,0))
Temp=50; NT0 = 500
NT= NT0*Temp; Nx=1000; dx=0.01; sig=1; lambda=10 L=dx*Nx/2
dt=dx^2/(2*sig^2) Nx.virt=Nx+1
u = matrix(nrow=Nx.virt, ncol=NT) X=seq(-L,L,dx)
eps=0.0001
u[,1]=(1/sqrt(2*pi*eps))*exp(-(X-2)^2/(2*eps)) for (t0 in 1:(NT0-1)) {
for (t1 in 1:Temp) { t=(t0-1)*Temp + t1 for (i in 2:Nx) {
u[i,t+1] = u[i,t] + (sig^2/2) * dt * ((u[i+1,t]-2*u[i,t]+u[i- 1,t])) / (dx^2) + lambda*dt*(X[i+1]* u[i+1,t]- X[i]* u[i,t])/dx }
u[1,t+1]=u[2,t+1]; u[Nx.virt,t+1]=u[Nx,t+1]
}
plot(c(-L,L),c(-0.5,3),type="n")
lines(X,u[,t+1])
lines(c(-L,L),c(0,0)) }
5. DENSITA’ INVARIANTE, ESEMPIO NON LINEARE
Esempio non lineare, sig=1. Non ci curiamo della scala giusta sull’asse delle ordinate e quindi prendiamo Z=1.
X= seq(-3,3, 0.01) Y=exp(X^2-X^4/2)
plot(c(-3,3),c(-0.5,6),type="n") lines(X,Y)
lines(c(-4,4),c(0,0))
Temp=100; NT0 = 500
NT= NT0*Temp; Nx=200; dx=0.03; sig=1 L=dx*Nx/2
dt=dx^2/(2*sig^2) Nx.virt=Nx+1
u = matrix(nrow=Nx.virt, ncol=NT) X=seq(-L,L,dx)
eps=0.0001
u[,1]=(1/sqrt(2*pi*eps))*exp(-(X-0.5)^2/(2*eps)) for (t0 in 1:(NT0-1)) {
for (t1 in 1:Temp) { t=(t0-1)*Temp + t1 for (i in 2:Nx) {
u[i,t+1] = u[i,t] + (sig^2/2) * dt * ((u[i+1,t]-2*u[i,t]+u[i-
1,t])) / (dx^2) - dt*((X[i+1]-X[i+1]^3)* u[i+1,t]- (X[i]-X[i]^3)*
u[i,t])/dx }
u[1,t+1]=0; u[Nx.virt,t+1]=0 }
plot(c(-L,L),c(-0.5,1),type="n") lines(X,u[,t+1])
lines(c(-L,L),c(0,0)) }