求解一个变量的非线性方程,但以求和形式写入“R”

时间:2017-06-08 14:33:45

标签: r nonlinear-functions

This is the Non-Linear Equation in "mu" which I want to solve numerically using R. All of the paired (x, y) are known. So the only variable is "mu".

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

现在,我已经在R中编写了函数。然后,我试图通过使用“rootSolve”包来获取root。但这是错误的。

这是我的功能代码:

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函数可以正常工作。

任何人都可以帮我纠正定义功能的方式吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

似乎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

这解决了Secant方法。如果您想尝试其他方法,可以使用testnslv进行探索。

**加法**

只要你这样做,函数uniroot.all就可以在我的例子中使用:

fvec <- Vectorize(f)

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