2016-02-03 26 views
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函數適合我的需求,但我不知道如何開始。

+0

也許我錯過了明顯的,但我沒有看到任何數據對象的工作。 –

+0

我很可能錯了,但不是x1數據對象,它將被操縱以最小化函數a_and_b - overlap()? – drumminactuary

+0

我現在看到60,30和10是你的「數據」,所以你會最小化abs(10 - overlap(。))。我認爲你可以在不失一般性的情況下將自己限制在y0 = y1 = 0並設置x0 = 0,然後讓r0,r1,x2成爲重疊()的輸入。 –

回答

1

這是近似x1解決方案所需的代碼行。

x1 <- optimize(function(x) abs(overlap(r0=r0, x1=x, r1=r1)-a_and_b), interval=c(0,r0+r1))