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 \sigma.
Onde ela se aplica?
  • Você possui duas variáveis Gaussianas, independentes Xe Y com média \mu=0 e variância \sigma^{2}. A magnitude do vetor resultante será R=\sqrt{X^{2}+Y^{2}} e segue uma distribuição Rayleigh de parâmetro \sigma

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
f(x, \sigma)=\frac{x}{\sigma^{2}} e^{-\frac{x^{2}}{2 \sigma^{2}}}, x \geq 0
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 1000 pontos para a curva ficar suave. Devemos garantir que a função seja válida somente para valores positivos de x. Também pede para alterar o valor do parâmetro \sigma e mostrar três situações diferentes.
Informações fornecidas e requisitos importantes:
  • A pdf é dada por
f(x,\sigma)=\frac{x}{\sigma^{2}} e^{-\frac{x^{2}}{2 \sigma^{2}}},\quad x\ge 0.
  • Domínio: x\ge 0.
  • Usar 1000 pontos para o eixo x.
  • Gerar três situações (ou seja, plotar a pdf para três valores distintos de \sigma).
  • A função deve retornar valores zero para x<0 (ou, equivalentemente, ser definida só para x\ge 0).

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 é
f(x,\sigma)=\frac{x}{\sigma^{2}} \exp\!\Big(-\frac{x^{2}}{2\sigma^{2}}\Big).
Explicando cada símbolo:
  • x é a variável aleatória (magnitude), sempre não negativa.
  • \sigma>0 é o parâmetro da distribuição (relacionado à variância das componentes gaussianas).
  • O fator \frac{x}{\sigma^{2}} escala a função perto de zero (faz com que f(0)=0).
  • O exponencial decai rapidamente para a cauda, controlado por \sigma.
Uma propriedade útil: o pico (modo) da distribuição ocorre em x=\sigma. Vamos mostrar rapidamente por que isso é verdade (útil na prova).
Calcule a derivada de f(x,\sigma) em relação a x e iguale a zero (condição de extremo):
f(x,\sigma)=\frac{x}{\sigma^{2}} e^{-\frac{x^{2}}{2\sigma^{2}}}.
Usamos regra do produto. Derivando:
\frac{\partial f}{\partial x}=\frac{1}{\sigma^{2}} e^{-\frac{x^{2}}{2\sigma^{2}}} + \frac{x}{\sigma^{2}}\cdot e^{-\frac{x^{2}}{2\sigma^{2}}}\cdot\Big(-\frac{x}{\sigma^{2}}\Big).
Fatorando \frac{1}{\sigma^{2}} e^{-\frac{x^{2}}{2\sigma^{2}}}:
\frac{\partial f}{\partial x}=\frac{1}{\sigma^{2}} e^{-\frac{x^{2}}{2\sigma^{2}}}\Big(1-\frac{x^{2}}{\sigma^{2}}\Big).
Para achar extremos, igualamos a zero. O fator exponencial e \sigma^{2} nunca são zero, então
1-\frac{x^{2}}{\sigma^{2}}=0 \quad\Rightarrow\quad x^{2}=\sigma^{2}\quad\Rightarrow\quad x=\sigma
(consideramos somente x\ge 0). Portanto o pico está em x=\sigma. Isso explica o comportamento do gráfico: ao aumentar \sigma, 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):
  1. Construir um vetor x com 1000 pontos uniformes em [0,x_{\max}]. Uma escolha prática é x_{\max}=4\max(\sigma) ou 5\max(\sigma) para captar bem a cauda. Usaremos x_{\max}=4\max(\sigma).
  2. Implementar a função pdf de maneira vetorizada usando NumPy:
    • Para cada x, calcular \frac{x}{\sigma^{2}}\exp\!\big(-\frac{x^{2}}{2\sigma^{2}}\big).
    • Garantir que valores de x<0 recebam 0 (no vetor x que construiremos não haverá x<0, mas a função deve estar preparada caso alguém passe valores negativos).
  3. Plotar para três valores de \sigma em um mesmo gráfico, com legenda e linha vertical em x=\sigma indicando o pico (modo).
  4. 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 x<0 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 \sigma=0{,}5 o pico estará perto de x=0{,}5 e a curva será estreita.
  • Para \sigma=1{,}0 o pico fica em x=1{,}0.
  • Para \sigma=2{,}0 o pico fica em x=2{,}0 e a curva é mais espalhada (cauda mais longa).
    Essas observações vêm diretamente do fato de que o modo é x=\sigma (Passo 2). Isso explica intuitivamente o efeito de \sigma: maior \sigma → distribuição mais espalhada e pico deslocado para a direita.
Dica prática: se quiser comparar curvas em escalas maiores (caudas longas), aumente x_{\max} para 5\max(\sigma) ou 6\max(\sigma).

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()

Exercícios relacionados