Генерация вектора со случайным равномерным направлением и гауссовской величиной - PullRequest
0 голосов
/ 09 октября 2019

Этот вопрос устарел и уже решен.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Ну, это не сложно сделать

n = 100
sigma = 1.0

phi = 2.0 * np.pi * np.random.random(n)
r   = np.random.normal(loc=0.0, scale=sigma, size=n)

x   = r*np.cos(phi)
y   = r*np.sin(phi)
0 голосов
/ 09 октября 2019

Вы можете сгенерировать два вектора, один для величины и другой для фазы. Затем вы используете оба, чтобы получить то, что вы хотите.

import numpy as np
import math

sigma_squred = 0.01  # Change to whatever value you want
num_elements = 10    # Size of the vector you want

magnitude = math.sqrt(sigma_squred) * np.random.randn(num_elements)
phase = 2 * np.pi * np.random.random_sample(num_elements)

# This will give you a vector with a Gaussian magnitude and a random phase between 0 and 2PI
noise = magnitude * np.exp(1j*phase)

Мне проще работать с одним вектором комплексных чисел, но, поскольку у вас есть отдельные значения x и y, вы можете получить noise_xи noise_y вектор с

noise_x = noise.real
noise_y = noise.imag

Примечание : Я предполагаю, что вы можете использовать библиотеку NumPy, которая значительно упрощает работу. Если это не так, вам понадобится цикл для генерации каждого элемента. Чтобы сгенерировать единичную выборку по величине, вы можете использовать random.gauss(0, sigma), тогда как 2*math.pi*random.random() можно использовать для генерации выборки для фазы. Затем вы делаете то же, что и раньше, чтобы получить комплексное число, из которого вы можете получить действительную и мнимую части.

...