这是“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
函数可以正常工作。
任何人都可以帮我纠正定义功能的方式吗?
非常感谢!
答案 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)
。