求解一个变量的非线性方程,但写成求和形式,"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)
。
这是“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)
。