A distribuição de Rayleigh é uma distribuição de probabilidades contínua para valores não negativos. É normalmente encontrada em situações onde a magnitude (envelope) do vetor no plano está relacionada a suas componentes Gaussianas independentes e identicamente distribuídas, com média zero e igual variância. O pico desta distribuição ocorre no valor de
.
Onde ela se aplica?
- Você possui duas variáveis Gaussianas, independentes Xe Y com média
e variância
. A magnitude do vetor resultante será
e segue uma distribuição Rayleigh de parâmetro
Exemplo
- Comunicação sem fio: Modela o sinal em ambientes de múltiplos caminhos onde o sinal não segue uma direção dominante
- Sistemas de radar: modela envelope de sinais em ambientes dominados por ruído
Dada a equação da pdf da VA Rayleigh abaixo
Gere uma função que calcule esta pdf e plote. Você pode usar 1000 pontos para que a curva fique suave. Atenção que a função deve ser válida somente para valores positivos de X. Altere os valores de sigma. Gere 3 situações diferentes.
Passo 1
O enunciado pede que a gente gere uma função que calcule a densidade de probabilidade da distribuição de Rayleigh e que a plote usando
pontos para a curva ficar suave. Devemos garantir que a função seja válida somente para valores positivos de
. Também pede para alterar o valor do parâmetro
e mostrar três situações diferentes.
Informações fornecidas e requisitos importantes:
- A pdf é dada por
- Domínio:
. - Usar
pontos para o eixo . - Gerar três situações (ou seja, plotar a pdf para três valores distintos de
). - A função deve retornar valores zero para
(ou, equivalentemente, ser definida só para ).
Passo 2
Antes de codificar, vamos entender a fórmula e as partes dela, passo a passo, para você conseguir justificar e aplicar durante a prova.
A pdf dada é
Explicando cada símbolo:
-
é a variável aleatória (magnitude), sempre não negativa. -
é o parâmetro da distribuição (relacionado à variância das componentes gaussianas). - O fator
escala a função perto de zero (faz com que ). - O exponencial decai rapidamente para a cauda, controlado por
.
Uma propriedade útil: o pico (modo) da distribuição ocorre em
. Vamos mostrar rapidamente por que isso é verdade (útil na prova).
Calcule a derivada de
em relação a
e iguale a zero (condição de extremo):
Usamos regra do produto. Derivando:
Fatorando
:
Para achar extremos, igualamos a zero. O fator exponencial e
nunca são zero, então
(consideramos somente
). Portanto o pico está em
. Isso explica o comportamento do gráfico: ao aumentar
, o pico desloca-se para a direita e a curva fica mais “espalhada”.
Passo 3
Estratégia para implementar o código (passo a passo, pensando na prova):
- Construir um vetor
com pontos uniformes em . Uma escolha prática é ou para captar bem a cauda. Usaremos . - Implementar a função pdf de maneira vetorizada usando NumPy:
- Para cada
, calcular . - Garantir que valores de
recebam (no vetor que construiremos não haverá , mas a função deve estar preparada caso alguém passe valores negativos).
- Para cada
- Plotar para três valores de
em um mesmo gráfico, com legenda e linha vertical em indicando o pico (modo). - Usar títulos e rótulos para que o gráfico seja claro.
Passo 4
Vamos explicar como implementar a função em Python (eu escrevo o código e explico cada linha). Você pode rodar isso em um Jupyter notebook ou script normal. Biblioteca: NumPy para cálculos vetoriais e Matplotlib para plot.
Explicação das partes do código:
- importações:
- import numpy as np
- import matplotlib.pyplot as plt
- função:
- assinatura: def rayleigh_pdf(x, sigma)
- dentro: calcular pdf = (x / sigma2) * np.exp(-x2 / (2 * sigma**2))
- garantir que para
o valor seja zero: usar np.where(x>=0, pdf, 0.0) ou mascarar.
- geração do vetor x:
- x = np.linspace(0, x_max, 1000) (aqui usamos 1000 pontos conforme pedido)
- plot:
- para cada sigma, calcular y = rayleigh_pdf(x, sigma)
- plotar com label e traçar linha vertical em x = sigma para mostrar o pico
- ajustar legenda, eixo, grade
Passo 5
Aqui está o código completo que implementa a função e plota as três situações. Eu deixei os comentários inline para você entender cada passo (copie e cole em um arquivo .py ou célula Jupyter e execute).
import numpy as np
import matplotlib.pyplot as plt
def rayleigh_pdf(x, sigma):
"""
Calcula a pdf de Rayleigh para vetor x e parâmetro sigma.
Garante que valores com x < 0 retornem 0.
Parâmetros:
x : array-like ou float
sigma : float > 0
Retorno:
array numpy com os valores da densidade
"""
x = np.asarray(x)
# Evita divisão por zero se sigma for inválido
if sigma <= 0:
raise ValueError("sigma must be > 0")
pdf = (x / sigma**2) * np.exp(-x**2 / (2 * sigma**2))
# Assegura que para x < 0 o valor seja zero
pdf = np.where(x >= 0, pdf, 0.0)
return pdf
# Parâmetros: três situações de sigma
sigma_list = [0.5, 1.0, 2.0] # você pode alterar esses valores
n_points = 1000
# Definir x_max baseado no maior sigma para capturar bem a cauda
x_max = 4 * max(sigma_list)
x = np.linspace(0, x_max, n_points)
plt.figure(figsize=(8,5))
for sigma in sigma_list:
y = rayleigh_pdf(x, sigma)
plt.plot(x, y, label=f"σ = {sigma}")
# Plotar linha vertical no modo x = sigma para ilustrar o pico
plt.axvline(sigma, color='gray', linestyle='--', linewidth=0.8, alpha=0.6)
plt.title("Densidade de probabilidade da Rayleigh para diferentes σ")
plt.xlabel("x")
plt.ylabel("f(x; σ)")
plt.legend()
plt.grid(True)
plt.xlim(0, x_max)
plt.show()
Passo 6
O que você deve observar ao rodar:
- Para
o pico estará perto de e a curva será estreita. - Para
o pico fica em . - Para
o pico fica em e a curva é mais espalhada (cauda mais longa).
Essas observações vêm diretamente do fato de que o modo é(Passo 2). Isso explica intuitivamente o efeito de : maior → distribuição mais espalhada e pico deslocado para a direita.
Dica prática: se quiser comparar curvas em escalas maiores (caudas longas), aumente
para
ou
.
Resposta
import numpy as np
import matplotlib.pyplot as plt
def rayleigh_pdf(x, sigma):
"""
Calcula a pdf de Rayleigh para vetor x e parâmetro sigma.
Garante que valores com x < 0 retornem 0.
"""
x = np.asarray(x)
if sigma <= 0:
raise ValueError("sigma must be > 0")
pdf = (x / sigma**2) * np.exp(-x**2 / (2 * sigma**2))
pdf = np.where(x >= 0, pdf, 0.0)
return pdf
sigma_list = [0.5, 1.0, 2.0]
n_points = 1000
x_max = 4 * max(sigma_list)
x = np.linspace(0, x_max, n_points)
plt.figure(figsize=(8,5))
for sigma in sigma_list:
y = rayleigh_pdf(x, sigma)
plt.plot(x, y, label=f"σ = {sigma}")
plt.axvline(sigma, color='gray', linestyle='--', linewidth=0.8, alpha=0.6)
plt.title("Densidade de probabilidade da Rayleigh para diferentes σ")
plt.xlabel("x")
plt.ylabel("f(x; σ)")
plt.legend()
plt.grid(True)
plt.xlim(0, x_max)
plt.show()