Está en la página 1de 8

Algoritmo de Monte Carlo

ASIGNATURA: COMBINATORIA Y PROBABILIDAD


UNIVERSIDAD ROVIRA I VIRGILI
FECHA: 16-01-2023

HECHO POR: GASTÓN CASTRO Y LLUÍS SORLÍ


INTRODUCCIÓN
El objetivo de nuestra tarea práctica es crear un programa cuya función sea calcular,
mediante el algoritmo de Monte Carlo, varias integrales que no pueden ser
expresadas en términos de funciones elementales como exp(-x^2), x^x, 1/ln(x) u
otras. Para poder llevar a cabo la tarea hemos utilizado un compilador, el Visual
Studio Code; y un lenguaje de programación, en este caso C.

Para introducirnos un poco más en el tema, empezaremos definiendo que es el


Algoritmo de Monte Carlo, y daremos un ejemplo para que la idea quede clara. El
algoritmo de Monte Carlo es una técnica muy utilizada en variedad de campos,
desde la física y la ingeniería hasta la economía y las finanzas. Es un método
probabilístico que utiliza números aleatorios para estimar el valor de una integral
definida, se basa en un muestreo aleatorio repetido con la finalidad de tomar
decisiones y predicciones.
MÉTODO DE MUESTREO
Para entender la idea de la integración de Monte Carlo, es necesario dominar la
integración numérica ordinaria. El método de integración de Monte Carlo se basa en
muestrear puntos aleatorios y calcular la media sobre estos. En términos
matemáticos, establece que la media aritmética de un gran número de variables
aleatorias independientes convergerá en la media verdadera. Usaremos éste para
aproximar el valor de una integral definida, muestreando puntos de la región de
integración y sumando sus valores.

Definiéndolo en relación con la parte final del temario, el método de Montecarlo


busca hallar los valores de una variable aleatoria (discreta o continua) con una
distribución de probabilidad dada por una función f(x), a partir de los valores de una
variable aleatoria uniformemente distribuida en el intervalo [a,b], proporcionada por
una rutina incorporada en nuestro programa.

En M dimensiones, seleccionamos vectores (x1 , … xM) de forma aleatoria en un


intervalo ([a1 , b2], …[aM , bM]), usando números aleatorios uniformes para cada
dimensión, estimando un volumen (M+1)-dimensional por debajo de la función
M-dimensional f(x)

DIFERENCIA ENTRE LA INTEGRACIÓN NUMÉRICA ORDINARIA Y


LA INTEGRACIÓN DE MONTE
CARLO

INTEGRACIÓN ORDINARIA

INTEGRACIÓN DE MONTE CARLO

Podemos observar claramente que para utilizar la integración numérica, realizamos


M sumas diferentes, al contrario que en la integración de Monte Carlo, que solo es
necesaria una. En 1-Dimensión no hay gran diferencia entre el tipo de integración
que utilizamos, pero si tenemos M dimensiones, hacer las M sumas puede resultar
pesado, y usando el enfoque de Monte Carlo resultaría más simple y menos largo.
CÓDIGO
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define TIRS 50000000
/*Acabamos de definir el número de TIROS que haremos, cuantos más tiros
hagamos más preciso será el resultado.
Ahora definiremos la función, para que cada vez que queramos utilizarla solamente
tengamos que hacer la llamada*/
double funcio(double x){
double y= exp(-pow(x,2));
//double y=pow(x,x);
//double y=1/log(x);
return y;
}
int main(){
srand(time(NULL));
double X_INF=-1000;
double X_SUP=1000;
//X_SUP i X_INF son los intérvalos de integración
double intervals_x= (X_SUP-X_INF)/1000000;
double minim_y=0;
double maxim_y=0;
double y;
double x;
double y_funcio;
double area;
double integral;
double aciertos=0;
double random1;
double random2;
/*Para poder hacer la región de integración por el método de Monte Carlo, no solo
necesitamos los intérvalos de integración, también el máximo y el mínimo que
engloba la función en este intervalo. Por eso hacemos el siguiente método para
calcularlo. Nota: El máximo no puede ser menor a 0, ni el mínimo mayor a 0*/
for (x=X_INF; x<X_SUP; x=x+intervals_x){
y=funcio(x);
if(minim_y>y){
minim_y=y;
}
else if(maxim_y<y){
maxim_y=y;
}
}
/*A partir de aquí es donde comienza el algoritmo de Monte Carlo. Tal y como lo
hemos hecho nosotros, lo que hace es:
1o. Calcular dos valores aleatorios y este los pone dentro del intérvalo. Osea el
primer número lo transformará en un número entre el máximo y el mínimo de la
función en y, y el segundo número lo transformará en un número entre el máximo y
el mínimo de la función en x (los intervalos de integración). Así lo que estamos
haciendo es buscar un punto aleatorio dentro de la región que utilizaremos para
integrar*/
for(int i=0; i<TIRS; i++){
random1=rand();
random2=rand();
y=minim_y+(maxim_y-minim_y)*(random1/RAND_MAX);
x=X_INF+(X_SUP-X_INF)*(random2/RAND_MAX);
/*
2o. Ahora calcularemos cual es el valor de la función en este punto aleatorio y lo
compararemos con el mismo punto*/
y_funcio=funcio(x);
/*3o. Si la función es positiva en este punto, y este cae por debajo de la función,
consideramos que el punto ha caído dentro y sumará un acierto. En cambio, si la
función es negativa en este punto, y este cae por encima de la función, también ha
caído dentro, pero al ser negativa la función, restará un acierto*/
if(y_funcio>0 && y< y_funcio){
aciertos=aciertos+1;
}
else if(y_funcio<0 && y> y_funcio){
aciertos=aciertos-1;
}

}
/*Aquí calculamos la integral, y la imprimimos*/
area= (maxim_y-minim_y)*(X_SUP-X_INF);
integral= area*(aciertos/TIRS);
printf("El valor de la integral de la funcion seleccionada entre %f y %f es %f",X_INF,
X_SUP, integral);
scanf(“\n”);

return 0;
}

FUNCIONAMIENTO DEL CÓDIGO:


El código escrito usa el Algoritmo de Montecarlo seleccionando un área rectangular
que abarque toda la función en el intervalo que deseamos integrar. Sease decir, va
de un límite de integración al otro, y de el mínimo absoluto al máximo absoluto de la
función en el intervalo. Para esto, primero el usuario ha de escoger los límites de
integracion (X_INF, X_SUP), seguidamente el código recorre la función desde
X_INF hasta X_SUP y guarda el máximo y el mínimo valor de esta. Es importante
anotar que, como la integral es el área de una función hasta el eje de las abscisas,
el máximo no podrá ser menor a 0 y el mínimo no podrá ser mayor a 0, ya que
entonces la región rectangular que utilizamos para calcular el área de la función no
llegaría a abarcar toda la integral. Una vez tenemos la región rectangular,
empezamos a escoger puntos aleatorios dentro de esta y comprobamos si están
entre la función y el eje de las abscisas, es decir, si pertenece al área de la integral.
Si la función es negativa en ese punto, lo contaremos cómo restante, y si es positiva
lo contaremos como sumante. Finalmente, generada una cierta cantidad de puntos
aleatorios, calculamos la proporción que cae dentro de la integral. Dividimos el
número de puntos que caen dentro entre el total de puntos que hemos tirado, y esta
proporción multiplicada por el área total de la región nos dará como resultado una
aproximación del valor de la integral.

COMENTARIOS ADICIONALES SOBRE EL CÓDIGO:


-Es evidente que cuantos más tiros haces más precisión se consigue en el cálculo.
-Si la función contiene o está próxima a una discontinuidad o singularidad al
intervalo que se va a integrar, el código dará errores.
-El usuario ha de ser capaz de escribir la función en C con la librería math.h.
-Los límites de integración no pueden ser infinito ni menos infinito.
EJEMPLOS DE EJECUCIONES
x^x:

1/ln(x):

exp(-x^2):
CONCLUSIÓN
El documento explicativo proporcionado por el profesor junto con la información
buscada en internet, han sido suficientes para entender el algoritmo de Monte Carlo
y poder realizar la tarea de forma exitosa. Definitivamente nuestro programa es
capaz de calcular la integral definida de cualquier función mediante el algoritmo de
Monte Carlo. La finalidad del programa es facilitar el cálculo de áreas envueltas por
funciones que no pueden ser definidas de forma elemental por lo que hemos
probado 3 funciones diferentes acotadas en diferentes intervalos, asegurándonos
que nuestro programa funciona correctamente, ya que el valor resultante se
aproxima mucho al valor real de la integral. Afirmamos así que el algoritmo de
Monte Carlo es realmente un método muy eficaz y muy útil en el ámbito tanto
matemático como físico.

BIBLIOGRAFÍA
https://es.wikipedia.org/wiki/M%C3%A9todo_de_Montecarlo
http://www.sc.ehu.es/sbweb/fisica_/numerico/montecarlo/montecarlo.html
http://www.acclab.helsinki.fi/~knordlun/mc/mc5nc.pdf

También podría gustarte