2016-03-01 1 views
0

В моем подходе, я буду использовать гипотетическую прямоугольник с координатами (2,0), (4,0), (2, 256) и (4, 256). Я буду генерировать случайные координаты xy внутри этого прямоугольника и найти соотношение между количеством координат, которые попадают в область, определяемую y ≤ x^4, и количеством координат, которые попадают во весь прямоугольник. Умножая это на область прямоугольника, я должен указать область под графиком.Нахождение площади под у = х^4 в области 2 ≤ х ≤ 4, используя метод Монте-Карло

Я изо всех сил пытаюсь создать случайные десятичные координаты xy в определенном прямоугольнике. Любая помощь будет очень благодарна :)

Я только начал интеграцию в школу, поэтому мои знания в этой области на данный момент довольно узкие.

Вот мой код:

public class IntegralOfX2 { 

    public static double randDouble(double min, double max) { 
     min = 2; 
     max = 4; 
     Random rand = new Random(); 
      double randomNum; 
     randomNum = min + rand.nextDouble((max - min) + 1); // an error keeps occuring here 

     return randomNum; 
    } 



    public static void main(String[] args) { 

     double x = 0; // x co-ordinate of dart 
     double y = 0; // y co-ordinate of dart 
     int total_darts = 0; // the total number of darts 
     int success_darts = 0; // the number of successful darts 
     double xmax = 4; 
     double xmin = 2; 
     double ymax = 256; 
     double ymin = 0; 
     double area = 0; 


     for (int i = 0; i < 400000000; i++) { 
     // x = randDouble(xmin, xmax); 
     // y = randDouble(ymin, ymax); 


      x = xmin + (Math.random() * ((xmax - xmin) + 1)); 
      y = ymin + (Math.random() * ((ymax - ymin) + 1)); 

        total_darts++; 


      if (y <= (x * x * x * x)) { 
       success_darts++; 
      } 

     } 


     double ratio = (double)success_darts/(double)total_darts; 
     area = ratio * 512; 
     System.out.println(area); 

    } 
} 
+1

@RC. 400 миллионов в порядке, 4 миллиарда нет. –

+0

misread, my bad –

ответ

4

randomNum = мин + rand.nextDouble ((макс - мин) + 1); // здесь сохраняется ошибка

Это ошибка, потому что такой метод не существует. То, что вы можете это

public static double randDouble(double min, double max) { 
    return min + Math.random() * (max - min + Math.ulp(max)); 
} 

Вы можете уронить Math.ulp, но это ближе всего к добавлению 1 для случайного целого числа.

Для большого количества образцов вы можете использовать равномерное распределение, например.

int samples = 100000; 
double spacing = (max - min)/spacing; 
for (int i = 0; i < samples; i++) { 
    double x = min + (i + 0.5) * spacing; 
    // use x as an input. 
} 
+0

Спасибо большое! Однако мой ответ все еще кажется крайне неточным. Хотя правильный ответ - 198,4, моя оценка составляет примерно 302. Есть ли ошибки в моей логике, которые я должен исправить? – Abhinav

+0

@Abhinav Я не вижу, как вы вызываете этот метод в своем коде. Я предлагаю вам использовать его. –

+0

Ох, да, я прокомментировал это раньше. Спасибо что подметил это. Моя оценка теперь составляет 198,3 с помощью метода! Еще раз спасибо! – Abhinav

0

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

def f(x) { 
    return x**4 
} 

range_min = 2 
range_max = 4 
range = range_max - range_min 
sample_size = 100000 
sum = 0 
loop sample_size times { 
    sum += f(range_min + range * U) // where U is a Uniform(0,1) random number 
} 
estimated_area = range * (sum/sample_size) 
+0

Это интересный способ приблизиться к нему. Я попробую. Благодаря! – Abhinav

Смежные вопросы