繁体   English   中英

nleqslv,R,非线性方程组

[英]nleqslv, R, nonlinear equation system

我有以下非线性方程组:

r1*r2*(0.25*0.6061-0.5)+r1+(0.25*r2) = 0.6061
r1*r2*(0.25*0.6429-0.5)+r1+(0.25*r2) = 0.6429

我需要找到r1r2 他们的解决方案应等于:

r1 = 0.5754
r2 = 0.6201

这是由Fortran产生的。
我不知道如何使用nleqslv软件包找到解决方案。

如果有人可以帮助我,我将不胜感激。

谢谢。

使用nleqslv方法是定义一个返回2维矢量的函数,就像c(r1, r2)
该函数采用2维参数x 我分别用x[1]x[2]代替了r1r2
我还用其值-0.348475替换了您的第一方程常数(0.25*0.6061-0.5) 并且在第二等式中, (0.25*0.6429-0.5)-0.339275
至于初始值,我首先尝试了c(0, 0)但是没有用。 如果您使用初始值c(0.5, 0.5)运行下面的代码c(0.5, 0.5)您将在浮点精度内获得相同的解决方案。

fn <- function(x){
    c(-0.348475*x[1]*x[2] + x[1] + 0.25*x[2] - 0.6061,
      -0.339275*x[1]*x[2] + x[1] + 0.25*x[2] - 0.6429)
}

nleqslv(c(1, 1), fn)
#$`x`
#[1] 1.000000 3.999999
#
#$fvec
#[1] 4.773959e-14 4.607426e-14
#
#$termcd
#[1] 1
#
#$message
#[1] "Function criterion near zero"
#
#$scalex
#[1] 1 1
#
#$nfcnt
#[1] 2
#
#$njcnt
#[1] 1
#
#$iter
#[1] 2

请注意, $fvec接近零,而$termcd1 这意味着算法已经收敛。 要拥有解决方案,您可以运行

sol <- nleqslv(c(1, 1), fn)
sol$x
#[1] 1.000000 3.999999

如果您可以计算jacobian,并且在这种情况下甚至非常简单,则该算法会更加准确。

jacfn <- function(x) {
    n <- length(x)
    Df <- matrix(numeric(n*n), n, n)
    Df[1,1] <- -0.348475*x[2] + 1
    Df[1,2] <- -0.348475*x[1] + 0.25
    Df[2,1] <- -0.339275*x[2] + 1
    Df[2,2] <- -0.339275*x[1] + 0.25

    Df
}

sol2 <- nleqslv(c(1, 1), fn, jac = jacfn)
sol2$x
#[1] 1 4

解决方法是相同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM