【问题标题】:root values of simultaneous nonlinear equations in RR中联立非线性方程的根值
【发布时间】:2016-05-13 22:06:15
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案1】:

    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  
    

    【讨论】:

    • 我倾向于这个解决方案,因为我有很多变量,我只需要找到可能的最佳点。
    【解决方案2】:

    你不能总是为两个变量解三个方程。你可以为两个变量解两个方程,然后测试解是否满足第三个方程。

    使用包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

    【讨论】:

    • 两个变量规则的两个方程在这种情况下不成立,因为方程是二次的。
    • 你需要第三个方程来推导出真实的点。有两个方程将提供两组点。但我喜欢这个。
    • 你应该解释这个说法。我根本不相信。这两个方程描述了圆。它们相交于 1 或 2 个点或根本不相交。
    • @geodex。您对 2 个二次方程是正确的。正如我在评论 0,1 或 2 解决方案中所述。根据这种情况下的原始问题,有1个解决方案。如果有人不知道,那么你可以使用包nleqslv中的函数searchZeros
    • @Bathsheba。您的第二条评论没有解释为什么two equation for two variables rule 不成立。您将解决方案的数量(0,1,2)与两个方程中的变量数量混淆了。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多