Mudanças entre as edições de "Método de Monte Carlo e transformações"
(Criou página com '<span id="transformação-linear"></span> == Transformação linear == Sorteando um número aleatório <math display="inline">x\in\left[0,1\right)</math> então fazemos uma t...') |
|||
Linha 76: | Linha 76: | ||
<pre> | <pre> | ||
+ | #Cálculo da área de um círculo | ||
+ | import matplotlib.pyplot as plt #Plotar gráfico | ||
+ | import numpy as np #Funções matemáticas | ||
+ | import random #Números aleatórios | ||
+ | |||
+ | r=1 #Raio do círculo | ||
+ | Np=1000000 #Número de pontos | ||
+ | hitx=[];hity=[];missx=[];missy=[] #Resultados | ||
+ | for n in range(Np): | ||
+ | x=random.random()*2-1 #Pontos aleatórios gerados entre -1 e +1 | ||
+ | y=random.random()*2-1 #Pontos aleatórios gerados entre -1 e +1 | ||
+ | if(np.sqrt(x**2+y**2)<=r): #Se o ponto caiu dentro do círculo | ||
+ | hitx.append(x);hity.append(y) | ||
+ | else: | ||
+ | missx.append(x);missy.append(y) | ||
+ | |||
+ | #Plotar curvas | ||
+ | x=np.arange(-1,1,1E-5) | ||
+ | plt.plot(x,-np.sqrt(r-x**2),'-k') | ||
+ | plt.plot(x,np.sqrt(r-x**2),'-k') | ||
+ | #Plotar pontos | ||
+ | plt.plot(hitx,hity,'or') | ||
+ | plt.plot(missx,missy,'ob') | ||
+ | |||
+ | a_ret=2*2 #Área do retângulo | ||
+ | a_cir=a_ret*len(hitx)/Np #A_ret *(hit/N) | ||
+ | print('A área do círculo estimada é: {:.2f}'.format(a_cir)) | ||
+ | print('A área do círculo exata é: {:.2f}'.format(np.pi*r**2)) | ||
</pre> | </pre> |
Edição das 16h56min de 29 de abril de 2022
Índice
Transformação linear
Sorteando um número aleatório então fazemos uma transformação para obter um número
. Isto é, obtemos a seguinte transformação
da seguinte forma:
Se todos os números entre e
tinham igual probabilidade de serem sorteados, após a transformação todos os números entre
e
também possuem igual probabilidade, pois
varia com
de forma linear, isto é, a distribuição uniforme de números é mantida.Por sua vez, a distribuição uniforme significa que a probabiliade de obter um número entre
e
é dada pela função densidade de probabilidade da seguinte forma:
Sendo constante, temos que:
Pela normalização. Mas se ampliarmos o intervalo dos números possíveis para entre e
:
Então agora . Isto é distribuição de probabilidade continua constante, mas com uma menor probabilidade de sortear um número
qualquer, quando em comparação de sortear um
qualquer.
Transformação não-linear
O mesmo não ocorre com uma transformação não linear. Por exemplo se , derivando temos que:
Diferente do caso anterior que tínhamos apenas a transformação linear . Podemos ver ainda usando a própria definição de derivada:
E sendo um diferencial então
, logo
. Agora a distribuição de probabilidade é alterada com a transformação. Para uma transformação
qualquer, como a probabilidade se conserva, ainda temos:
Considrando que tem inversa, então
então:
Sendo então reescrevendo
, logo
Então temos:
E sendo nossa ditribuição em uniforme com
como vimos anteriormente, ficamos com:
Para a transformação . O mais comum é que saibamos a distribuição de probabilidade
que queremos, e uma vez que:
E integramos então para encontrar .
Método da rejeição
Nem sempre o desejado é fácil de definir matematicamente. O método da rejeição é um método rústico para obtermos
.
- Desenhar a função
desejada dentro dos limites
e
.
- Geramos um ponto aleatório
, se estiver abaixo da curva desejada é aceito.
Se gerarmos pontos aleatórios em grande quantidade, a razão de pontos aceitos para cada em relação à todos o pontos aleatórios gerados neste
, nos dá uma estimativa de
neste ponto, em relação do
. Isto é, se para um
qualquer, metade dos pontos gerado aleatoriamente foram válidos, então
.
Cálulo de integrais definidas
Em uma ideia bastante análoga à anterior, aqui utilizamos a ideia que a integral definida é cálculo da área sob a curva. Definindo novamente limites e
no qual a região que queremos calcular está contida, geramos uma série de pontos aleatórios, se gerado pontos suficientes, a razão de pontos que foram gerados dentro da área que queremos calcular em relação ao total de pontos gerados, será a mesma razão da área que queremos calcular em relação à área total definida pelos limites.
#Cálculo da área de um círculo import matplotlib.pyplot as plt #Plotar gráfico import numpy as np #Funções matemáticas import random #Números aleatórios r=1 #Raio do círculo Np=1000000 #Número de pontos hitx=[];hity=[];missx=[];missy=[] #Resultados for n in range(Np): x=random.random()*2-1 #Pontos aleatórios gerados entre -1 e +1 y=random.random()*2-1 #Pontos aleatórios gerados entre -1 e +1 if(np.sqrt(x**2+y**2)<=r): #Se o ponto caiu dentro do círculo hitx.append(x);hity.append(y) else: missx.append(x);missy.append(y) #Plotar curvas x=np.arange(-1,1,1E-5) plt.plot(x,-np.sqrt(r-x**2),'-k') plt.plot(x,np.sqrt(r-x**2),'-k') #Plotar pontos plt.plot(hitx,hity,'or') plt.plot(missx,missy,'ob') a_ret=2*2 #Área do retângulo a_cir=a_ret*len(hitx)/Np #A_ret *(hit/N) print('A área do círculo estimada é: {:.2f}'.format(a_cir)) print('A área do círculo exata é: {:.2f}'.format(np.pi*r**2))