I want to create real noise $\xi(t)$ which fulfills the property $E[xi_t\xi_s] = f(t, s)$ in Julia. Is there a library or function with which I could implement this? I tried the impementation with $f(t, s) = e^{-(t-s)}$ My code is not working (the noise is decreasing exponentially).
using LinearAlgebra
function generate_gaussian_noise(timesteps)
n = length(timesteps)
noise = zeros(n)
for i in 1:n
t = timesteps[i]
noise[i] = real(randn())
end
return noise
end
function construct_correlated_noise(timesteps)
n = length(timesteps)
noise = generate_gaussian_noise(timesteps)
correlation_matrix = zeros(n, n)
for i in 1:n
for j in 1:n
correlation_matrix[i, j] = exp(-(timesteps[i] - timesteps[j]))
end
end
# Perform eigenvalue decomposition
eigenvalues, eigenvectors = eigen(correlation_matrix)
D = Diagonal(sqrt.(eigenvalues))
Q = eigenvectors
L = Q * D
correlated_noise = L * noise
return correlated_noise
end
# Example usage
timesteps = collect(1:401)
correlated_noise = construct_correlated_noise(timesteps)
If I understand you correctly you want something like this?
using Distributions
f(t, s) = exp(-abs(t-s))
timesteps = 1:401;
covariance_matrix = f.(timesteps, timesteps');
mean_vector = zeros(length(timesteps));
d = MvNormal(mean_vector, covariance_matrix);
x = rand(d) # this is a single sample
Note that f(t,s) must have a property that f(t,s)=f(s,t) which your function did not have, that is why I have added abs. I also modelled covariance because what you defined is not correlation but covariance assuming that the expected value of the process is constant and equal to 0.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With