7 votos

método de integración

Quiero calcular una integral utilizando el método de acierto y error . No puedo entender cómo funciona este método. Agradecería que alguien me explicara y me ayudara a calcular el valor, con un ejemplo realista y sencillo como
$I=\int_{0}^{1} x^2dx$

o cualquier cosa que desee. Muchas gracias por su preocupación, de antemano.

18voto

Knox Puntos 1543

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:

quadratic

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,'.')

points

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.')

pointsred

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.

9voto

Matthew Scouten Puntos 2518

Su integral es el área $A$ bajo el gráfico de $y = x^2$ y superiores $y=0$ para $x$ de $0$ a $1$ :

enter image description here

La superficie total del cuadrado $0 \le x \le 1$ , $0 \le y \le 1$ es $1$ . Si eliges un punto al azar $(X,Y)$ en este cuadrado, la probabilidad de que este punto esté en la región roja será la fracción del área del cuadrado que es roja, es decir $A$ . Ahora imagina que eliges $n$ puntos aleatorios $(X_j, Y_j)$ , de forma independiente, en este cuadrado. Cada uno tiene una probabilidad $A$ de estar en la región roja, por lo que si $n$ es grande el número $R$ de puntos en la región roja probablemente se acercará a $n A$ . Por lo tanto, podemos utilizar $R/n$ la fracción de nuestros puntos que caen en la región roja, como una estimación para $A$ .

1voto

Felix Marin Puntos 32763

$\newcommand{\+}{^{\dagger}}% \newcommand{\angles}[1]{\left\langle #1 \right\rangle}% \newcommand{\braces}[1]{\left\lbrace #1 \right\rbrace}% \newcommand{\bracks}[1]{\left\lbrack #1 \right\rbrack}% \newcommand{\ceil}[1]{\,\left\lceil #1 \right\rceil\,}% \newcommand{\dd}{{\rm d}}% \newcommand{\down}{\downarrow}% \newcommand{\ds}[1]{\displaystyle{#1}}% \newcommand{\equalby}[1]{{#1 \atop {= \atop \vphantom{\huge A}}}}% \newcommand{\expo}[1]{\,{\rm e}^{#1}\,}% \newcommand{\fermi}{\,{\rm f}}% \newcommand{\floor}[1]{\,\left\lfloor #1 \right\rfloor\,}% \newcommand{\half}{{1 \over 2}}% \newcommand{\ic}{{\rm i}}% \newcommand{\iff}{\Longleftrightarrow} \newcommand{\imp}{\Longrightarrow}% \newcommand{\isdiv}{\,\left.\right\vert\,}% \newcommand{\ket}[1]{\left\vert #1\right\rangle}% \newcommand{\ol}[1]{\overline{#1}}% \newcommand{\pars}[1]{\left( #1 \right)}% \newcommand{\partiald}[3][]{\frac{\partial^{#1} #2}{\partial #3^{#1}}} \newcommand{\pp}{{\cal P}}% \newcommand{\root}[2][]{\,\sqrt[#1]{\,#2\,}\,}% \newcommand{\sech}{\,{\rm sech}}% \newcommand{\sgn}{\,{\rm sgn}}% \newcommand{\totald}[3][]{\frac{{\rm d}^{#1} #2}{{\rm d} #3^{#1}}} \newcommand{\ul}[1]{\underline{#1}}% \newcommand{\verts}[1]{\left\vert\, #1 \,\right\vert}$ De hecho, nosotros $\large never$ do Montecarlo con $\ds{\int_{0}^{1}x^{2}\,\dd x}$ . Hacemos la siguiente transformación para que el integrando se acerque más a una función suave: $$ \int_{0}^{1}x^{2}\,\dd x =\half\bracks{\int_{0}^{1}x^{2}\,\dd x + \int_{0}^{1}\pars{1 - x}^{2}\,\dd x} =\int_{0}^{1}\bracks{x\pars{x - 1} + \half}\,\dd x $$ enter image description here

$\large\mbox{You can use this little}\quad \verb=C++=\quad \mbox{<strkeep>script<strkeep>}$ :

#include <cstdlib>
#include <iostream>
using namespace std;
const double RANDMAX1=double(RAND\_MAX) + 1.0;
const unsigned long long ITERATIONS=1000000ULL; // For example, one million. 

int main()
{
 double result=0,x;

 for ( unsigned long long n=0 ; n<ITERATIONS ; ++n ) {
     x=rand()/RANDMAX1;
     result+=x\*(x - 1.0) + 0.5;
 }

 result/=ITERATIONS;

 cout<<"Result = "<<result<<endl;

 return 0;
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X