我正在尝试解决这个post中描述的一个简单的非线性方程组。
该系统是具有两个未知数p和q以及一个自由参数λ的两个方程:

当lambda =1时,系统如下所示:

有一个唯一的解,它在p= 0.3,q= 0.1附近。
我正在试着用nleqslv解决这个问题。我的目标函数是:
library(nleqslv)
fn = function(x, lambda = 1){
# p = x[1]
# q = x[2]
pstar = exp(lambda * (1*x[2])) / (exp(lambda * (1*x[2])) + exp(lambda * (1 - x[2])))
qstar = exp(lambda * (1 - x[1])) / (exp(lambda * ((1 - x[1]))) + exp(lambda * (9*x[1])))
return(c(pstar,qstar))
}但结果与图中的内容不符:
> xstart = c(0.1, 0.3)
> nleqslv(xstart, fn)$x
[1] 1.994155 -8.921285我的第一个问题是:我是否正确地使用了nleqslv?在看了其他例子之后,我也这么认为。但现在我不确定了。
我的第二个问题:这是一个好问题吗?还是我找错人了?
发布于 2021-01-17 16:44:38
您的函数没有正确反映您想要的内容。
您可以通过评估fn(c(0.3,0.1))来看到这一点,如下所示。
fn(c(0.3,0.1))
[1] 0.3100255 0.1192029因此,输出非常接近输入。您希望(几乎)零作为输出。
所以你想要解决p和q的系统。您需要做的是让函数返回pstar的输入p和表达式之间的差异,以及qstar的输入q和表达式之间的差异。
所以重写你的函数如下
fn <- function(x, lambda = 1){
p <- x[1]
q <- x[2]
pstar <- exp(lambda * (1*x[2])) / (exp(lambda * (1*x[2])) + exp(lambda * (1 - x[2])))
qstar <- exp(lambda * (1 - x[1])) / (exp(lambda * ((1 - x[1]))) + exp(lambda * (9*x[1])))
return(c(pstar-p,qstar-q))
} 然后调用nleqslv,如下所示(请始终显示您正在使用的所有代码。您遗漏了library(nleqslv))。
library(nleqslv)
xstart <- c(0.1, 0.3)
nleqslv(xstart, fn)这将显示函数的完整输出。检查是否成功总是一个好主意。始终检查$termcd是否成功。
$x
[1] 0.3127804 0.1064237
$fvec
[1] 5.070055e-11 6.547240e-09
$termcd
[1] 1
$message
[1] "Function criterion near zero"
$scalex
[1] 1 1
$nfcnt
[1] 7
$njcnt
[1] 1
$iter
[1] 7$x的结果更符合您的预期。
最后,请使用<-进行赋值。如果你不这样做,总有一天你会被R及其魔力所吞噬。
使用nleqslv来解决这个问题并没有错。你只犯了一个小错误。
https://stackoverflow.com/questions/65757137
复制相似问题