Brownian motion is a central object of probability theory. The idea of Lévy’s construction is to construct the Brownian motion step by step on finite sets

of dyadic points. As is dense in the Brownian motion is then obtained as the uniform limit of linear interpolation on .

It is pretty easy to illustrate this construction using

`R`

and the package `gganimate`

. We use the same notation as in the proof of Wiener’s theorem given on page 23 in “Brownian motion” by Peter Mörters and Yuval Peres.
```
library(dplyr)
library(gganimate)
library(transformr)
set.seed(42)
n_max <- 14 # maximal number of steps
D <- (0: 2^n_max)/2^n_max # this is in fact D_n_max
B <- list()
Z <- rnorm(1)
B[[1]] <- c(0, Z/2 + rnorm(1), Z)
for (n in 2:n_max){
B[[n]] <- rep(0, 2^n+1)
index_known <- seq(1,2^n+1, by=2) # indices where values are known from previous steps
B[[n]][index_known] <- B[[n-1]]
index_unknown <- seq(2, 2^n, by=2) # indices where values are not yet defined
for (d in index_unknown){
B[[n]][d] <- 0.5*(B[[n]][d-1]+B[[n]][d+1])+ rnorm(1)*2^(-(n+1)/2)
}
}
## interpolation and transformation in a data.frame
df <- data.frame(time=numeric(),
value=numeric(),
id=numeric())
for (n in 1:n_max){
D_n<-(0: 2^n)/2^n
B_interpol<- approx(D_n, B[[n]], xout = D)$y # interpolation
df_new <- data.frame(time=D,
value=B_interpol,
id=n)
df <- bind_rows(df, df_new)
}
## animation
ggplot(df, aes(x=time, y=value)) +
geom_line()+
transition_states(
id,
transition_length = 2,
state_length = 1
) +
labs(title = 'Levy`s construction of Brownian motion. Step: {closest_state}', x = 'time', y = 'position') +
ease_aes('sine-in-out')
```