Pagina Principale

Passeggiata in tre direzioni

Analizziamo il caso in cui la passeggiata casuale, con passo costante, avviene nello spazio nei due versi di ciascuna delle tre direzioni.

var lv=[[1,0,0],[0,1,0],[0,0,1],[-1,0,0],[0,-1,0],[0,0,-1]]; var v=new Array(n).fill().map(x => lv[Math.floor(Math.random()*6)]);

Per le posizioni

P=v.reduce( (total,x,i)=> [...total, (i>0)? [total[i-1][0]+ x[0],total[i-1][1]+x[1],total[i-1][2]+x[2]] :x ],[] );

Ad esempio per passi si ottiene:


Possiamo riportare in una tabella il numero dei percorsi per raggiungere le varie posizioni dopo $n$ passi. Si tratta, al variare di $n$, di una lista di $2n+1$ tabelle $2n+1\times 2n+1$ da considerare come sezioni piane $z=n-k \quad \text{con}\;\; k=0, \dots, 2n$ dello spazio nel quale si svolge la passeggiata.

per $n=0$ 1
per $n=1$
0 0 0
0 1 0
0 0 0
0 1 0
1 0 1
0 1 0
0 0 0
0 1 0
0 0 0
per $n=2$
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 2 0 0
0 2 0 2 0
0 0 2 0 0
0 0 0 0 0
0 0 1 0 0
0 2 0 2 0
1 0 6 0 1
0 2 0 2 0
0 0 1 0 0
0 0 0 0 0
0 0 2 0 0
0 2 0 2 0
0 0 2 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
per $n=3$
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 3 0 3 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 6 0 6 0 0
0 3 0 15 0 3 0
0 0 6 0 6 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 3 0 3 0 0
0 3 0 15 0 3 0
1 0 15 0 15 0 1
0 3 0 15 0 3 0
0 0 3 0 3 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 6 0 6 0 0
0 3 0 15 0 3 0
0 0 6 0 6 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 3 0 0 0
0 0 3 0 3 0 0
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

Il numero di percorsi per raggiungere dopo $n$ passi una certa posizione $(x,y,z)$ forma uno schema numerico che ricorsivamente può descriversi in javascript nel modo seguente:

function nPercorsi(n,x,y,z) { if (n==0) return 1 else if(n<Math.abs(x) +Math.abs(y) + Math.abs(z)) return 0 else if((n+Math.abs(x) +Math.abs(y) + Math.abs(z))%2>0) return 0 else if(n==Math.abs(x) || n==Math.abs(y) || n==Math.abs(z)) return 1 else return nPercorsi(n-1,x-1,y,z)+nPercorsi(n-1,x+1,y,z)+ nPercorsi(n-1,x,y-1,z)+nPercorsi(n-1,x,y+1,z)+ nPercorsi(n-1,x,y,z-1)+nPercorsi(n-1,x,y,z+1) }

Si può costruire una matrice $2n+1 \times 2n+1 \times 2n+1$ relativa a $n$ passi anche iterativamente mediante il seguente codice che, a partire dalla matrice iniziale per $n=0$, trasforma la matrice relativa a un certo valore di $n$ in quella successiva così che M[m][r][c] è il numero di percorsi per raggiungere la posizione $(-n+r,n-c,n-m)$:

var M=[[[1]]]; var i,M0,M1; for (var it=0; it<n; it++){ i=M.length; M1=M.map(xy => trasf(xy)); for(var m=0; m<i; m++) for(var r=1; r<i+1; r++) for(var c=1; c<i+1; c++) M1[m][r][c]+=((m>0)? M[m-1][r-1][c-1]:0) +((m<i-1)? M[m+1][r-1][c-1]:0); M0=new Array(i+2).fill().map(() => Array(i+2).fill(0)); M0[(i+1)/2][(i+1)/2]=1; M=[M0,...M1,M0]; } function trasf(M) { var l=M.length; var R0=new Array(l+2).fill(0); var M1=[...M.map(r =>[0,...r,0]),R0,R0]; var M2=[R0,...M.map(r =>[0,0,...r]),R0]; var M3=[R0,R0,...M.map(r =>[0,...r,0])]; var M4=[R0,...M.map(r =>[...r,0,0]),R0]; return M1.map( (r,j)=> r.map( (e,i)=> e+M2[j][i]+M3[j][i]+M4[j][i] ) ) }
Ad esempio per n=
0 0 0
0 1 0
0 0 0
0 1 0
1 0 1
0 1 0
0 0 0
0 1 0
0 0 0

Ad esempio una visione a strati, da una della facce più esterna della doppia piramide a base quadrata di equazione $|X|+|Y|+|Z|=n$ agli strati via via più interni di equazioni $|X|+|Y|+|Z|=n-2k\ge 0$, per $n =$
      1  
    3   3
  3   6   3
1   3   3   1
  15  
15   15

Qui sotto possiamo vedere un'altra simulazione di un tale passeggiata casuale tridimensionale realizzata con con GeoGebra da Steve Phelps

Altre simulazioni interessanti:
Lattice Random Walk in 3D Wolfram Demonstrations Project