在R中求解简单方程

时间:2014-01-20 21:13:02

标签: r

关于在R中解决函数的可能性,我可能有一个非常基本的问题,但要知道答案真的有助于更好地理解R。

我有以下等式:

0 = -100 /(1 + R)+(100-50)/(1 + R)^ 2 +(100-50)/(1 + R)^ 3 + ...(100-50) /(1 + R)^ 10

如何在R中求解变量r?

中的这个等式

我试过了......像这样:

n <- c(2:10)
0 = -100/(r+1)+sum((100-50)/((1+r)^n))

但收到了错误消息:

Error in 0 = -100/(r + 1) + sum((100 - 50)/((1 + r)^n)) : 
invalid (do_set) left-hand side to assignment

问题是什么,如何找到r ??

非常感谢您的帮助!

此致,

broesel

3 个答案:

答案 0 :(得分:4)

R link here有很多优化和根查找库。但在本土R:

fnToFindRoot = function(r) {
  n <- c(2:10)
  return(abs(-100/(r+1)+sum((100-50)/((1+r)^n))))
}
# arbitrary starting values
r0 = 0
# minimise the function to get the parameter estimates
rootSearch = optim(r0, fnToFindRoot,method = 'BFGS', hessian=TRUE)
str(rootSearch)
fnToFindRoot(rootSearch$par)

该功能非常不稳定。如果您愿意支持根,那么uniroot

可能会更好
fnToFindRoot = function(r,a) {
  n <- c(2:10)
  return((-100/(r+1)+sum((100-50)/((1+r)^n)))-a)
}
str(xmin <- uniroot(fnToFindRoot, c(-1E6, 1E6), tol = 0.0001, a = 0))

a参数存在,因此您可以查找任意值的根。

答案 1 :(得分:3)

尝试二分。这在25次迭代中收敛到r = 0.4858343

> library(pracma)
> bisect(function(r) -100/(1+r) + sum(50/(r+1)^seq(2, 10)), 0, 1)
$root
[1] 0.4858343

$f.root
[1] 8.377009e-07

$iter
[1] 25

$estim.prec
[1] 1.490116e-08

答案 2 :(得分:1)

x = 1/(1+r),所以您的等式应为:

0-100 x + 50 x ^ 2 + 50 x ^ 3 + ... + 50 x ^ 10 = 0。

然后在R中

x <- polyroot(c(0, -100, rep(50, 9)))
(r <- 1/x - 1)

这是答案:

 [1]        Inf+      NaNi  0.4858344-0.0000000i -1.7964189-0.2778635i
 [4] -0.3397136+0.6409961i -0.3397136-0.6409961i -1.4553556-0.7216708i
 [7] -0.9014291+0.8702213i -0.9014291-0.8702213i -1.7964189+0.2778635i
[10] -1.4553556+0.7216708i