求解一个变量的非线性方程,但写成求和形式,"R"

Solve a Non-linear Equation of one variable but written in a summation form, in "R"

这是“mu”中的非线性方程,我想用 R 对其进行数值求解。所有成对的 (x, y) 都是已知的。所以唯一的变量是“mu”

现在,我已经在 R 中编写了函数。然后,我尝试使用“rootSolve”包获取根。但是它给出了一个错误。

这是我的函数代码:

f = function(k){
sum(((2*exp(-x) - 1)*(2*exp(-y)- 1))/
    (1 + k*(2*exp(-x) - 1)*(2*exp(-y)- 1)))
}

这是从“rootSolve”包中运行宁“uniroot.all”后的错误:

> library(rootSolve)
> uniroot.all(f, interval = c(-1, 1))
numeric(0)
Warning message:
In k * (2 * exp(-x) - 1) :
longer object length is not a multiple of shorter object length

此外,我在区间 (-1, 1) 中搜索我的根。

有人可以帮忙吗?我认为,我定义函数的方式是错误的。因此这个错误来了。

谁能确认我在图片中定义函数的方式是否正确?

提前致谢!

让我再补充一点:

我定义函数的方式(方式错误的可能性很高)并给出我的数据 (x, y),我有 f(-1) < f(1) and also f(-1) * f(1) < 0。这些条件都满足了。

让我质疑我编写函数的方式的其他问题:

我无法在 R 中 运行 曲线函数。例如,curve(f, from = -1, to = 1) 但是,如果我绘制 Vectorize(f),则 curve 函数有效。

谁能帮我改正定义函数的方式?

非常感谢!

看来uniroot.all想要一个矢量化函数。我尝试使用它并得到与您相同的错误。我在 uniroot.all 的文档中找不到关于此的任何内容。

我试过包 nleqslv 并且可以得到解决方案。 我已经将你的函数重写如下(我认为你在设置等式时犯了一些错误):

f <- function(k){
    A <- 2*exp(-x)-1
    B <- 2*exp(-y)-1
    sum((A*B)/(1+k*A*B))
}

和运行具有这些数据的函数

set.seed(13)
x <- runif(10)*10
y <- runif(10)*5

并按如下方式解决了您的函数:

library(nleqslv)
nleqslv(0,f)

具有以下输出:

$x
[1] 1.42992

$fvec
[1] 2.300633e-09

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1

$nfcnt
[1] 7

$njcnt
[1] 1

$iter
[1] 7

这用正割法求解。如果您想尝试其他方法,可以使用 testnslv 进行探索。

** 添加 **

函数 uniroot.all 将在我的示例中起作用,只要您这样做:

fvec <- Vectorize(f)

并将间隔更改为 c(-1,1.7)