Интегрирование по методу Монте-Карло для области под кривой

#c #montecarlo

Вопрос:

Мне удалось написать программу, которая использует метод Монте-Карло для оценки pi. Теперь я пытаюсь вместо этого оценить площадь плоских кривых, в частности квадрифолия.См. Изображение для справки, до сих пор мне это не удавалось. Конечно, это связано только с настройкой моего текущего кода? Любая помощь или совет будут оценены по достоинству. Вот что у меня уже есть:

 #include <math.h>
#include <ctime>
#include <xmemory>
using namespace std;
double pi_(double accuracy)
{
int n = 0, d = 0;
double x, y, latest_pi = 0;
double Origin_dist = 0;
do
{
    x = 0;
    y = 0;
    x = rand() % 100;
    y = rand() % 100;
    Origin_dist = sqrt(x * x   y * y);
    if (Origin_dist < 100.0)
    {
        d  ;
        n  ;
    }
    else
    {
        n  ;
    }
    latest_pi = 4.0 * (d   1.0) / (n   1.0);
} while ((d < 3100) || (4.0 / (n   1.0) < accuracy));
return latest_pi;
}
int main()
{
double accuracy;
srand((int)time(0));
cout << "Enter the accuracy: n";
cin >> accuracy;
cout << pi_(accuracy) << endl;
 

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

1. Вы дали изображение, но ваш код использует расстояние, чтобы оценить, принадлежит ли точка диску. Есть ли у вас уравнение, которое позволило бы определить, находится ли точка в вашем квадрифолии?

2. К сожалению, я этого не делаю, и проблема не была решена. У меня есть только уравнение квадрифолия. ((x^2 y^2)^3) = 4 * x^2 * y^2. Мне также удалось закодировать программу для оценки натурального логарифма чисел. Хотя я не могу этого понять.

3. Это уже что-то. Поскольку ваша поверхность центрирована, способ решения вашей проблемы может заключаться в том, чтобы найти для каждой точки пересечение линии, образованной этой точкой, с началом координат и частью кривой, расположенной в одной и той же четверти плоскости. Если вы обнаружите, что расстояние между началом координат и этим пересечением превышает расстояние между точкой и началом координат, то точка принадлежит поверхности. Если нет, или если вы просто не можете найти пересечение, то оно не принадлежит поверхности.

Ответ №1:

Во-первых, я должен уточнить, что Монте-Карло-далеко не лучший метод решения этой проблемы. Это решение использует тот факт, что как для x, так и для y, превосходящих 0, ((x^2 y^2)^3 < 4 x^2 y^2) => (x,y) принадлежит поверхности.

 #include <math.h>
#include <ctime>
#include <iostream>

double pow(double x, int n){
    double r=1.0;
    for (int i=0; i<n; i  ){
        r=r*x;
        }
    return x;
    }

bool belongTo_quadrifolium(double x, double y){
    return pow(pow(x,2)   pow(y,2), 3) - 4 * (pow(x, 2) * pow(y, 2)) < 0; 
    }



double montecarlo(double accuracy){
    unsigned int n = 0, d = 0;
    double x, y;
    do
    {
        x = 1.0*rand() / (RAND_MAX-1);
        y = 1.0*rand() / (RAND_MAX-1);
        if (belongTo_quadrifolium(x, y)){
            d  ;
            n  ;
            }
        else{
            n  ;
            }
        } while (d < 3100|| (1.0/n > accuracy));
    return 4.0*d/n;
    }

int main(){
    double accuracy;
    srand((int)time(0));
    std::cout << "Enter the accuracy: n";
    std::cin >> accuracy;
    std::cout << montecarlo(accuracy) << std::endl;
    return 0;
    }
 

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

1. Большое спасибо за это! Это чрезвычайно полезно.

2. Я удалил несколько строк в коде ответа. От них не было никакой пользы