0
我試圖在R中編寫一個函數來確定具有已知半徑(r0和r1)和給定重疊區域的兩個圓之間的距離。如何在R中尋找目標
我第一次寫了一個函數來確定重疊區域。
overlap <- function(x0=0, y0=0, r0, x1, y1=0, r1) {
#plot two circles and calculate the area of overlap
#doesn't work if one circle completely overlaps the other!
library("plotrix", lib.loc="~/R/win-library/3.2")
xmin = min(x0 - r0, x1 - r1)
xmax = max(x0 + r0, x1 + r1)
ymin = min(y0 - r0, y1 - r1)
ymax = max(y0 + r0, y1 + r1)
plot(c(x0,x1), c(y0,y1), xlim=c(xmin, xmax), ylim=c(ymin, ymax), asp=1)
draw.circle(x=x0, y=y0, radius=r0)
draw.circle(x=x1, y=y1, radius=r1)
d = sqrt((x1-x0)^2 + (y1-y0)^2) #distance between centroids
CBA = acos((r1^2 + d^2 - r0^2)/(2*r1*d))
CBD = 2 * CBA
CAB = acos((r0^2 + d^2 - r1^2)/(2*r0*d))
CAD = 2 * CAB
area = .5 * (r1^2 * (CBD - sin(CBD)) + r0^2 * (CAD - sin(CAD)))
return(area)
}
我想編寫另一個函數,其中包含重疊函數並將3個區域作爲輸入。
dist_between <- function(a_not_b, b_not_a, a_and_b) {
r0 <- sqrt((a_not_b + a_and_b)/pi)
r1 <- sqrt((b_not_a + a_and_b)/pi)
#minimize a_and_b - overlap(r0=r0, x1=?, r1=r1) by changing x1
return(x1)
}
我希望能夠進入像dist_between(60, 30, 10)
並有函數返回值5.805。
我認爲optim
函數適合我的需求,但我不知道如何開始。
也許我錯過了明顯的,但我沒有看到任何數據對象的工作。 –
我很可能錯了,但不是x1數據對象,它將被操縱以最小化函數a_and_b - overlap()? – drumminactuary
我現在看到60,30和10是你的「數據」,所以你會最小化abs(10 - overlap(。))。我認爲你可以在不失一般性的情況下將自己限制在y0 = y1 = 0並設置x0 = 0,然後讓r0,r1,x2成爲重疊()的輸入。 –