В самом простом случае интегрирование способом Монте-Карло выглядит так: вы генерируете 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;
}
Комментариев нет:
Отправить комментарий