Найти, сколько случайных точек лежит внутри эллипса с центром в точке - PullRequest
0 голосов
/ 02 декабря 2018

Приведенный ниже код генерирует набор случайных координат x, y и использует уравнение эллипса, чтобы сравнить, сколько из этих точек находится внутри эллипса с центром в (1,1) и прямоугольника области 2a * 2b, построенного вокруг эллипсау которых большая и большая полуось являются осями a и b, но b является переменной и принимает значение из списка b каждый раз.Я хочу иметь все значения b, для которых отношение всех точек, лежащих внутри эллипса, к точкам, лежащим внутри прямоугольника, больше 0,5.

Проблема, с которой я сталкиваюсь, заключается в том, что если я проверяюодно значение b = 0,63.условие ellipse_points / rectangle_points приблизительно равно 0,5, но когда я повторяю цикл по списку b и использую инструкцию If, чтобы получить все точки, для которых ellipse_points / rectangle_points> 0,5, я не вижу значений, близких к 0,63, вместо этого я вижу значения изОт 1.2 до 1.9, я не понимаю, почему, когда я перебираю список значений для b, оператор if, кажется, дает ошибочные значения.пожалуйста, обратитесь к следующему набору кода, где я устанавливаю значение b = 0,63 и нахожу соотношение ellipse_points / rectangle_points

import numpy as np

x = np.random.uniform(0, 2, 10000) #generates random x coordinates
y = np.random.uniform(0, 2, 10000) #generates random y coordinates 
ellipse_points, rectangle_points = 0, 0
a = 1
b = []
for i in range(1, 200):
    b.append(i/100)
#print(b)

for p in b:
    for i, j in zip(x, y):
        if (((i - 1) ** 2) / a ** 2 + ((j - 1) ** 2) / p ** 2) < 1:
            ellipse_points += 1
        rectangle_points += 1
    if ellipse_points/rectangle_point > 0.5:
        print(p)

ВЫХОД: 1.2, 1.21 ............. 1.9

#
x = np.random.uniform(0, 2, 10000) #generates random x coordinates
y = np.random.uniform(0, 2, 10000) #generates random y coordinates 
ellipse_points, rectangle_points = 0, 0
a = 1
b = 0.63

for i, j in zip(x, y):
    if (((i - 1) ** 2) / a ** 2 + ((j - 1) ** 2) / b ** 2) < 1:
        ellipse_points += 1
    rectangle_points += 1
print(ellipse_points/rectangle_points)

ВЫХОД 0.5001

1 Ответ

0 голосов
/ 02 декабря 2018

Если я правильно понял вашу проблему, вот векторизованное решение.

Создает двоичную маску для точек внутри эллипса, подсчитывает, где маска True, и делит ее на общее количество точек.

# np.random.seed(42)
N = 10000
x = np.random.uniform(0, 2, N) #generates random x coordinates 
y = np.random.uniform(0, 2, N) #generates random y coordinates

a = 1
b = 0.63

ratio = ((((x - 1)/a)**2 + ((y - 1)/b)**2) < 1).sum()/N

>>> print(ratio)
0.4954
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...