我有一个关于在 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))
Run Code Online (Sandbox Code Playgroud)
但是收到一条错误信息:
Error in 0 = -100/(r + 1) + sum((100 - 50)/((1 + r)^n)) :
invalid (do_set) left-hand side to assignment
Run Code Online (Sandbox Code Playgroud)
有什么问题,我怎样才能找到 r?
这里有很多 R链接的优化和寻根库。但是在原生 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)
Run Code Online (Sandbox Code Playgroud)
该功能非常不稳定。如果您愿意将根括起来,您可能最好使用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))
Run Code Online (Sandbox Code Playgroud)
该a参数是有那么你可以找一根根地任意值。
尝试平分。这r = 0.4858343在 25 次迭代后收敛:
library(pracma)
bisect(function(r) -100/(1+r) + sum(50/(r+1)^seq(2, 10)), 0, 1)
Run Code Online (Sandbox Code Playgroud)
给予:
$root
[1] 0.4858343
$f.root
[1] 8.377009e-07
$iter
[1] 25
$estim.prec
[1] 1.490116e-08
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34514 次 |
| 最近记录: |