вторник, 9 мая 2017 г.

Метод Монте-Карло: примеры для языка C++

Метод Монте-Карло используется для нахождения определённых интегралов путём определения среднего значения функции на отрезке интегрирования. Он применяется в физике (теория струн, физика плазмы, физика твёрдого тела), экономике, химии, теории управления, поэтому владение этим методом наверняка будет для вас полезным.

468x60 #2

В самом простом случае интегрирование способом Монте-Карло выглядит так: вы генерируете N чисел в пределах промежутка интегрирования [a;b], находите f(x) для каждого из них, складываете полученные значения, умножаете на (b-a) и делите на N. Чтобы было понятнее – простой пример.

Задача 1. Найти площадь фигуры, ограниченной половиной синусоиды.

//Половина синусоиды - это sin x при xє[0;pi]
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
int main(){
    double res=0; //Значение определённого интеграла
    srand(time(0));
    for(int i=0;i<100;i++){ //Ищем f(x) для 100 случайных значений
        res+=sin(acos(-1)*rand()/RAND_MAX);
    }
    cout << res*acos(-1)/100 << '\n';
    system("pause");
    return 0;
}

Результат должен быть приблизительно равен двум.

Задача 2. Найти площадь фигуры, ограниченной параболой y=x2, прямой x=2 и осью абсцисс.

//Нарисуйте то, что описано в условии, и увидите простейший табличный интеграл
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
    double res=0;
    srand(time(0));
    for(int i=0;i<100;i++){
        double x=2.0*rand()/RAND_MAX;
        res=res+x*x;
    }
    cout << res*0.02 << '\n';
    system("pause");
    return 0;
}

Но это ещё не всё – есть также геометрическая вариация метода Монте-Карло. Она немного сложнее вышеописанного алгоритма, и выглядит следующим образом: находим прямоугольник, такой, что любая его сторона содержит хотя бы одну точку графика функции, но не пересекает его, выбираем N случайных точек внутри него и смотрим, сколько из них попали под график функции (назовём эту величину K). Значение интеграла находится как площадь прямоугольника, умноженная на K/N.

Задача 3. Найти число π, вычислив площадь единичного круга геометрическим методом Монте-Карло

//Площадь круга S=pi*R^2, pi=S/R^2
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(){
    srand(time(0));
    int k=0;
    //Используем прямоугольник с левым верхним углом в (-1;1) и правым нижним в (1;0)
    //Найдём площадь половины круга как площадь под графиком функции y=sqrt(1-x^2)
    for(int i=0;i<1000;i++){
        double x=-1+2.0*rand()/RAND_MAX, y=1.0*rand()/RAND_MAX;
        if(y<=sqrt(1-x*x)){
            k++;
        }
    }
    double pi=k/250.0;
    cout << pi << '\n';
    system("pause");
    return 0;
}

Комментариев нет:

Отправить комментарий