我是R的新手,想学习R如何用数字方法求解方程式的基础知识。
我的问题是:
让我解释:
我开始研究如何计算内部收益率,而不是因为没有任何函数来计算它,而是因为它是一个简单的例子。
作为提醒,给定一组相同时期的现金流(例如,一年又一年),IRR是利率i
,使得下面“公式”列中的公式之和为零;当然(1+i)^ 0 = 1
╔════════╦═════════════╦════════════════╗
║ period ║ cashflow ║ formulas ║
╠════════╬═════════════╬════════════════╣
║ 0 ║ -100 ║ -100 / (1+i)^0 ║
║ 1 ║ 10 ║ 10 / (1+i)^1 ║
║ 2 ║ 110 ║ 110 / (1+i)^2 ║
╚════════╩═════════════╩════════════════╝
我已将代码放在底部,并且它与uniroot
和fsolve
一起使用,例如(-100,10,110),其中解决方案是10%。
但是,当没有解决方案(例如所有正数)时,uniroot返回空,应该如此,但是fsolve给了我这个错误:
if(norm(s,“F”)<tol || norm(as.matrix(ynew),“F”)<tol)中断错误:缺少值需要TRUE / FALSE
我发现这个类似的question,但没有答案。我没有在docs找到任何东西。
为什么?这是什么意思?如果没有解决方案,如何在不破坏脚本执行的情况下让fsolve返回空或nan?
编辑:回答下面的答案:你能推荐另一个R包,与uniroot不同,你不需要指定寻找解决方案的上限和下限吗?
pracma::fsolve
仅适用于n >= 2
的情况。这记录了吗?我在docs找不到它。据我所知,Python Scipy和Matlab中的fsolve函数没有这个限制,也没有要求你指定上限和下限。我没有Matlab,但是当没有解决方案时,Scipy不会出错。此外,我试图找到x^2+5
的根,并且pracma::fsolve
发出警告,因为它没有收敛,但不是错误。
相关问题:如何在R中获得有意义且有用的回溯?
例如,这发生在Python中,在那里我得到的消息告诉我,我的代码中的行x在some_other_code中称为行y,但是失败了。
但在R?我在Rstudio中激活了调试 - >错误 - >错误检查器。如果我输入traceback()
我得到:
> traceback()
6: broyden(f, x0, J0 = J(x0), maxiter = maxiter, tol = tol)
5: fsolve(my_npv, x0 = 0.2, cf = cf) at solve_irr.R#20
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("H:/R/solve_irr.R")
这不是很有用,因为它根本不清楚错误在哪里;是的,solve_irr的第20行触发了它,但那么什么是“broyden”?
它在哪里?
一个函数包哪个(好的,这里必须是pracma的一部分,但是调试器应该告诉我 - 在更复杂的设置中理解导致错误的原因不会那么简单)?代码的哪一行是错误的? if (norm( etc
在哪里?在布罗登?
编辑:代码:
library(rootSolve)
library(pracma)
my_npv <- function(cf,i){
npv <- 0
for (t in 1:length(cf)){
npv <- npv + cf[[t]] / (1+i)^(t-1)
}
return(npv)
}
# this works
cf <- c(-100,10,110)
#this doesn't:
cf <- c(100,10,110)
i_uniroot <- uniroot.all(my_npv, c(0,1), cf = cf)
i_fsolve <- fsolve(my_npv, x0 = 0.2, cf = cf)
函数fsolve
,特别是Broyden方法不适用于单变量根发现,它仅适用于f:R ^ n - > R ^ n且n> = 2的情况。更确切地说:'Sherman-Morrison公式'不适用始终在1-dim情况下正常工作。将来,fsolve
将停止使用更具说法性的错误消息来处理单变量函数。
标准的根查找器是Base R中的uniroot
.R中有几个其他的1-dim根查找函数,其中一些在pracma包中。像uniroot.all
一样,findroots
将尝试在给定的区间内找到所有根。
这不能解答有关R中调试工具的问题。例如,请参阅Debugging with RStudio,其中包含有关“在包中调试”的部分。有关于使用R调试的Youtube视频。我仍然建议发送错误报告,而不是调试您自己没有编写的包代码。