我有以下非线性方程系统:
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
我需要找到r1
和r2
。他们的解决方案应该等于:
r1 = 0.5754
r2 = 0.6201
由Fortran产生。
我不知道如何使用nleqslv
包找到解决方案。
如果有人能帮助我,我将不胜感激。
感谢。
答案 0 :(得分:0)
使用nleqslv
的方法是定义一个返回2-dim向量的函数,就像c(r1, r2)
一样。
该函数采用2-dim参数x
。我已分别将r1
和r2
替换为x[1]
和x[2]
。
我还用它的值(0.25*0.6061-0.5)
替换了你的第一个等式常量-0.348475
。在第二个等式中,(0.25*0.6429-0.5)
由-0.339275
至于初始值,我首先尝试c(0, 0)
,但它没有工作。如果您使用初始值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
接近于零,$termcd
为1
。这意味着算法收敛了。要拥有可以运行的解决方案
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
解决方案是一样的。