#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. Я удалил несколько строк в коде ответа. От них не было никакой пользы