Я моделирую 2D-процесс Ornstein-Uhlenbeck (уравнение Langevin для скорости), и я заинтересован в вычислении спектральной плотности мощности (PSD) векторного процесса скорости. /> $$
r (\ tau) = \ frac {1} {t - \ tau} \ int_0^{t - \ tau} \ langle \ mathbf {v} (t) \ cdot \ mathbf {v} (t + \ tau) \ rangle, dt
$$ < /p>
Чтобы получить PSD. Однако, поскольку я только вычисляю VACF для положительных лагов $ \ tau \ geq 0 $, мне нужно отразить VACF вручную, чтобы сделать его симметричным, прежде чем применять np.fft.fft < /code>. < /P>
Этот шаг зеркального зеркала ощущается как обходной векторный процесс без необходимости явно клонировать VACF? Я рассчитываю VACF как средний точечный продукт с течением времени для всех траекторий, а затем отражает его для вычисления PSD через FFT. < /P> 1. Моделирование 2D траекторий Лангевина
Я моделирую 2D-процесс Ornstein-Uhlenbeck (уравнение Langevin для скорости), и я заинтересован в вычислении спектральной плотности мощности (PSD) векторного процесса скорости. /> $$ r (\ tau) = \ frac {1} {t - \ tau} \ int_0^{t - \ tau} \ langle \ mathbf {v} (t) \ cdot \ mathbf {v} (t + \ tau) \ rangle, dt $$ < /p>
Чтобы получить PSD. Однако, поскольку я только вычисляю VACF для положительных лагов $ \ tau \ geq 0 $, мне нужно отразить VACF вручную, чтобы сделать его симметричным, прежде чем применять np.fft.fft < /code>. < /P> Этот шаг зеркального зеркала ощущается как обходной векторный процесс без необходимости явно клонировать VACF? Я рассчитываю VACF как средний точечный продукт с течением времени для всех траекторий, а затем отражает его для вычисления PSD через FFT. < /P> [b] 1. Моделирование 2D траекторий Лангевина [/b] [code]import numpy as np import matplotlib.pyplot as plt import scipy.signal
np.random.seed(0) n = 10_000 # Number of time steps dt = .1 # Time step size (delta t) dim = 2 # Dimension of the velocity vector (2D: x and y) N = 10 # Ensemble size gamma = 1 # Damping coefficient in Langevin equation sigma = 1 # Noise intensity
# Integrate the Langevin equation using the Euler-Maruyama method for i in range(n - 1) v[i + 1] = v[i] - gamma * v[i] * dt + dW[i] # Update velocity: damping + noise r[i + 1] = r[i] + v[i] * dt # Update position: Euler integration of velocity
< /code> [b] 2. Вычисление VACF и PSD [/b] # Computes the VACF: ⟨v(t) · v(t + τ)⟩ def manual_vacf(v, lag): vacf = [] # VACF for the ensemble for i in range(v.shape[-1]): # Loop over trajectories v_ = v[..., i] # Select trajectory i (shape: [time, dim]) vacf_ = np.empty(lag) # VACF of current trajectory for lag_ in range(1, lag + 1): # Loop over lag values v1, v2 = v_[:-lag_], v_[lag_:] # Vectors at t and t+lag v1v2 = (v1 - v1.mean(axis=0)) * (v2 - v2.mean(axis=0)) # Remove mean and take element wise product v1_dot_v2 = np.sum(v1v2, axis=1) # Dot product v(t) · v(t + τ) vacf_[lag_ - 1] = np.mean(v1_dot_v2) # Time average vacf.append(vacf_) return np.mean(vacf, axis=0) # Ensemble average
# Mirrors the VACF and computes the PSD using the Wiener–Khinchin theorem def psd_wiener_khinchin(vacf, lag, dt): vacf_mirror = np.hstack([np.flip(vacf), vacf]) # Extend VACF to negative lags ft = np.fft.fft(vacf_mirror)[:lag] # FFT and keep only non-negative frequencies freq = np.fft.fftfreq(2 * lag, dt)[:lag] # Frequency values psd = np.abs(ft) * dt # PSD (magnitude × dt) return psd, freq
Пакет scipy.fftpack предоставляет большое количество процедур, связанных с дискретными преобразованиями Фурье. Мне нужно вычислить 1-ю и 2-ю производную функции, используя только летнее время (DCT). Однако пакет содержит процедуру diff , которая...