Триангуляция наименьших квадратов в R

Каковы координаты неизвестной точки, если им даны наблюдения расстояний 3 точек с известными координатами?

eg:

x = c(30.0,10.0,50.0)
y = c(150.0,120.0,50.0)
distance = c("125.0 ± 0.5","133.5 ± 0.2","98.6 ± 0.2")
df = data.frame(x, y, distance) 

Можно ли использовать R для вычисления координат неизвестной точки методом наименьших квадратов с (а) методом косвенных наблюдений и (б) уравнениями условий?

Как данные в виде «125,0 ± 0,5» можно импортировать в R?


person netkostas    schedule 12.01.2016    source источник
comment
Данные вида 125,0 ± 0,5 будут импортированы в «символьном» режиме. Затем вы можете разбить его с помощью strsplit и привести результаты к «числовым». Вы также должны уточнить, что на самом деле требуется. Что такое неизвестная точка? Являются ли эти жесткие края предполагаемыми верхним и нижним радиусами вокруг центров или в этих границах неопределенности есть статистический аспект? Связаны ли радиусы с центрами по порядку?   -  person IRTFM    schedule 13.01.2016


Ответы (1)


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

## Your data
x = c(30.0,10.0,50.0)
y = c(150.0,120.0,50.0)
## distance = c("125.0 ± 0.5","133.5 ± 0.2","98.6 ± 0.2")
dists <- c(125, 133.5, 98.6)  # simplified

## Minimize this function:
## x: guesstimates
## centers: fixed points (x, y)
## b: distances
f <- function(x, centers, b) {
    sqrt(sum((sqrt(colSums((x - centers)^2)) - b)^2))
}

## Get estimate: initial guess of c(100, 100)
centers <- matrix(c(x, y), nrow=2, byrow=TRUE)
res <- nlm(f, c(100, 100), centers=centers, b=dists)

## Lets visualize to see if it worked
circle <- function(x, y, d, col='black') {
    theta <- seq(0, 2*pi, length.out=100)
    data.frame(x=d*cos(theta)+x, y=d*sin(theta)+y, col, stringsAsFactors=FALSE)
}
cols <- colorRampPalette(c('blue', 'red'))(3)
circs <- Map(circle, x, y, dists, cols)
ps <- do.call(rbind, circs)
plot(ps[1:2], type='n')
grid()
abline(h=0, v=0)
points(x, y, col=cols, pch=16, cex=2)
for (i in circs) points(i[1:2], col=i$col, type='l')

## Add the estimated point
points(x=res$estimate[1], y=res$estimate[2], 
       col='firebrick', pch=8, cex=2)

введите здесь описание изображения

person Rorschach    schedule 13.01.2016