【问题标题】:Solve a Non-linear Equation of one variable but written in a summation form, in "R"求解一个变量的非线性方程,但以求和形式写在“R”中
【发布时间】:2017-11-10 08:11:42
【问题描述】:

这是“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 函数就会起作用。

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

非常感谢!

【问题讨论】:

  • 你没有显示全部。 xy 的值是多少?
  • 你似乎把mux 搞混了。你想解决mu,所以在函数中指定它(也作为函数的参数)。
  • @Bhas,我已编辑。我希望现在一切都清楚了。我有关于(x,y)的双向数据。总共近 1000 次观察。
  • 我们没有您的 xy 数据。所以我们不能运行你的东西。它是不可重现的。制作一小组数据,看看会发生什么。

标签: r nonlinear-functions


【解决方案1】:

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)

【讨论】:

  • Bhas,非常感谢您的帮助!我很感激。其实我已经试过nlesqlv这个包了。这个包的问题是,我无法指定要检查根的所需间隔。就我而言,我想在 (-1, 1) 的间隔中找到根。在您的示例中,根也超出了此间隔。
  • 还有一件事,你和我写了同样的函数。以两种不同的方式就是这样。但是,我仍然认为编写函数的方式不正确。我认为还有另一种编写函数的方法,尤其是当它涉及对所有配对观察值求和时(x, y)。谢谢!
  • 我们确实没有写过同样的函数。我相信我纠正了您的错误;查看您在问题中提出的方程式。仔细查看并检查示例输入。 -11 之间没有解决方案。画出函数的曲线,可以查看。
  • 在我的示例中,unitroot.all 确实有效,只要您执行fvec &lt;- Vectorize(f) 并设置间隔c(-1,1.7) 并求解fvec。来自 base R 的uniroot 也可以完成这项工作。
  • 是的,我可以。像这样:fvec &lt;- Vectorize(f) 后跟 curve(fvec,-1,2.0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
相关资源
最近更新 更多