Как я могу оценить объем пересечения круга и площадь над линией.Я также хотел бы применить это.- питон - PullRequest
0 голосов
/ 23 декабря 2018

Это использует Python.

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

Я называю пересечение детали внутри круга(центр которого равен (0, 0), а радиус равен 1) и часть над линией (y = x). Я называю это желтой частью.

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

Плюс, я также применяю это к 3-D. То есть, пересечение части внутриэллипс (2x ^ 2 + 3y ^ 2 + z ^ 2-4 = 0) и часть над плоскостью (x + y + 2z-1 = 0).Но это дополнительный вопрос.Это было бы легко сделать, если бы я мог сделать это в 2-х измерениях.

Я хотел бы рассчитать некоторые объемы в моем эксперименте.Я пробовал некоторые из моих кодов, но они не работают.Буду признателен, если вы ответите на мой вопрос.

То, что я закодировал ↓

import numpy as np
size = 10000

if y - x > 0:
    x = np.random.uniform(-1, 1, size)
    y = np.random.uniform(-1, 1, size)
area = x**2 + y**2
print(len(area[area < 1])/size)

Область желтой части можно было бы ожидать от этого кода.

Ответы [ 3 ]

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

Условное значение yx> 0 находится не в том месте.

import numpy as np
size = 10000
# Generate random x and y in the square ((-1, -1) (1, 1))
x = np.random.uniform(-1, 1, size)
y = np.random.uniform(-1, 1, size)
area = x*x + y*y

# Move the y-x conditional into the boolean array.
print(len(area[np.logical_and(area < 1, (y-x)>0)])/size)
# The logical and of the points inside the circle and those where y>x.
0.3963

Это дает вам долю точек в области, которую вы хотите вычислить.

Площадь квадрата =4.
Соотношение как в круге, так и в gt yx = 0 .3963
4 * .3963 = 1.5852, что достаточно близко к ожидаемому пи / 2.

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

Идея состоит в том, чтобы определить точки в каждом наборе. np.where помогает для этого:

size=10000
x,y = 2*np.random.rand(2,size)-1 # random points in a square
circle= np.where( x*x+y*y<=1)

xc,yc=x[circle],y[circle]  # points in circle

half_circle = np.where(yc<xc)

xh,yh= xc[half_circle],yc[half_circle]  # points in half circle

from pylab import scatter

scatter(x,y,c='red')
scatter(xc,yc,c='blue')
scatter(xh,yh,c='yellow',s=1)
print(len(xh)/size)
#0.39441

enter image description here

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

Ну, чтобы сделать это без оператора for или while, нужно использовать векторные возможности NumPy.Вот код, который сэмплирует равномерно в единичном круге, подсчитывает количество точек над y=x линией и печатает область.

import numpy as np

N=100000 # number of trials

# sampling uniformly in the circle
angle  = 2.0 * np.pi * np.random.random(N)
radius = np.sqrt(np.random.random(N))

x = radius * np.cos(angle)
y = radius * np.sin(angle)

t = np.where(y > x)[0]

print(np.pi * len(t)/float(N))

Он печатает 1.5705135834560735, что составляет около π / 2.

...