R中联立非线性方程的根值

时间:2016-05-13 13:16:16

标签: r

我一直在尝试编码此问题: 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中的根值?

3 个答案:

答案 0 :(得分:3)

nls无法使用零残差数据 - 请参阅?nls这里提到的内容。在输入参数方面,nlmrt包中的nlxbnls大致相似,并且支持零残留数据。使用问题中的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)