El método que quieres es muy parecido a lanzar dardos. Creas puntos al azar dentro de un rectángulo del que conoces el área y cuentas cuántos de ellos están por debajo de la curva que intentas integrar.
Por ejemplo, en Matlab podríamos hacer esto para obtener la curva que estamos tratando de integrar:
>> x = 0:0.01:1; % Creates a list [0, 0.01, ... 0.99, 1]
>> plot(x,x.^2)
que da el siguiente gráfico:
A continuación, tenemos que generar algunos puntos aleatorios para esparcirlos por la parcela:
>> N = 100;
>> xpts = rand(N,1);
>> ypts = rand(N,1);
>> hold on % Plot over the top of our last plot
>> plot(xpts,ypts,'.')
Ahora necesitas saber cuáles son los puntos que caen bajo la curva (y vamos a trazarlos también, por diversión)
>> under = ypts < xpts.^2;
>> plot(xpts(under),ypts(under),'r.')
El vector under
es ahora un vector de 1s siempre que el punto (x,y) esté por debajo de la curva y 0s cuando esté por encima de la curva. Para aproximar el área bajo la curva encontramos la media de este vector (con el mean
) y multiplicarlo por el área del rectángulo (que es 1 en este caso, pero podría no serlo en general).
>> area = 1 * mean(under);
>> disp(area)
0.3800
Sabemos que el área exacta es 1/3, así que no es una aproximación demasiado mala.
Si quieres averiguar algo sobre la varianza de la aproximación, puedes escribir un bucle que haga esto 1000 veces, para darte 1000 estimaciones diferentes del área, y mirar algunas de sus estadísticas:
>> for i = 1:1000
>> X = rand(N,1);
>> Y = rand(N,1);
>> I(i) = mean(Y < X.^2);
>> end
Puedes mirar la media, la varianza y la desviación estándar de I
:
>> mean(I)
ans =
0.3321
>> var(I)
ans =
0.0022
>> std(I)
ans =
0.0469
Así que la media está cerca de 1/3, la varianza está cerca del valor teórico de (1/3) * (2/3) / 100 = 0,00222... y la desviación estándar está en torno a 0,05, lo que significa que tu estimación con 100 puntos estará entre 0,23 y 0,43 aproximadamente el 95% de las veces. Usando más puntos podrías hacer esto mucho más preciso, aunque obviamente sería más lento.