我一直在尝试编码此问题: https://sg.answers.yahoo.com/question/index?qid=20110127015240AA9RjyZ
我相信有一个R函数可以解决以下等式的根值:
(x+3)^2 + (y-50)^2 = 1681
(x-11)^2 + (y+2)^2 = 169
(x-13)^2 + (y-34)^2 = 625
我尝试使用'解决'函数,但它们只适用于线性方程(?)
也尝试了#nls'
dt = data.frame(a=c(-3,11,13), b = c(50, -2, 34), c = c(1681,169,625))
nls(c~(x-a)^2 + (y-b)^2, data = dt, start = list(x = 1, y = 1))
但始终出错。 (是的,我已经尝试过更改最大迭代次数)
nls中的错误(c~(x - a)^ 2 +(y - b)^ 2,data = dt,start = list(x = 1,: 迭代次数超过最大值50
如何解决R中的根值?
答案 0 :(得分:3)
nls
无法使用零残差数据 - 请参阅?nls
这里提到的内容。在输入参数方面,nlmrt包中的nlxb
与nls
大致相似,并且支持零残留数据。使用问题中的dt
,只需将nls
替换为nlxb
:
library(nlmrt)
nlxb(c~(x-a)^2 + (y-b)^2, data = dt, start = list(x = 1, y = 1))
,并提供:
nlmrt class object: x
residual sumsquares = 2.6535e-20 on 3 observations
after 5 Jacobian and 6 function evaluations
name coeff SE tstat pval gradient JSingval
x 6 7.21e-12 8.322e+11 7.649e-13 -1.594e-09 96.93
y 10 1.864e-12 5.366e+12 1.186e-13 -1.05e-08 22.45
答案 1 :(得分:1)
你不能总是求解两个变量的三个方程。你可以求解两个变量的两个方程,并测试解是否满足第三个方程。
使用包nleqslv
,如下所示。
library(nleqslv)
f1 <- function(z) {
f <- numeric(2)
x <- z[1]
y <- z[2]
f[1] <- (x+3)^2 + (y-50)^2 - 1681
f[2] <- (x-11)^2 + (y+2)^2 - 169
f
}
f2 <- function(z) {
x <- z[1]
y <- z[2]
(x-13)^2 + (y-34)^2 - 625
}
zstart <- c(0,0)
z1 <- nleqslv(zstart,f1)
z1
f2(z1$x)
,它提供以下输出:
>z1
$x
[1] 6 10
$fvec
[1] 7.779818e-09 7.779505e-09
$termcd
[1] 1
$message
[1] "Function criterion near zero"
$scalex
[1] 1 1
$nfcnt
[1] 9
$njcnt
[1] 1
$iter
[1] 9
>f2(z1$x)
[1] 5.919242e-08
因此找到了一个解决方案,解决方案来自向量z$x
。在函数f2
中插入z $ x也几乎为零。
因此找到了解决方案。
您也可以尝试包BB
。
答案 2 :(得分:-2)
只需浏览 rootSolve 包即可完成:
https://cran.r-project.org/web/packages/rootSolve/vignettes/rootSolve.pdf