首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决一个简单的(?)非线性方程组

解决一个简单的(?)非线性方程组
EN

Stack Overflow用户
提问于 2021-01-17 11:45:55
回答 1查看 72关注 0票数 1

我正在尝试解决这个post中描述的一个简单的非线性方程组。

该系统是具有两个未知数p和q以及一个自由参数λ的两个方程:

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

有一个唯一的解,它在p= 0.3,q= 0.1附近。

我正在试着用nleqslv解决这个问题。我的目标函数是:

代码语言:javascript
复制
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))
}

但结果与图中的内容不符:

代码语言:javascript
复制
> xstart = c(0.1, 0.3)
> nleqslv(xstart, fn)$x
[1]  1.994155 -8.921285

我的第一个问题是:我是否正确地使用了nleqslv?在看了其他例子之后,我也这么认为。但现在我不确定了。

我的第二个问题:这是一个好问题吗?还是我找错人了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-17 16:44:38

您的函数没有正确反映您想要的内容。

您可以通过评估fn(c(0.3,0.1))来看到这一点,如下所示。

代码语言:javascript
复制
fn(c(0.3,0.1))
[1] 0.3100255 0.1192029

因此,输出非常接近输入。您希望(几乎)零作为输出。

所以你想要解决pq的系统。您需要做的是让函数返回pstar的输入p和表达式之间的差异,以及qstar的输入q和表达式之间的差异。

所以重写你的函数如下

代码语言:javascript
复制
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))。

代码语言:javascript
复制
library(nleqslv)
xstart <- c(0.1, 0.3)
nleqslv(xstart, fn)

这将显示函数的完整输出。检查是否成功总是一个好主意。始终检查$termcd是否成功。

代码语言:javascript
复制
$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来解决这个问题并没有错。你只犯了一个小错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65757137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档