当没有解决方案时,fsolve会给出错误+帮我回溯错误消息

问题描述 投票:1回答:1

我是R的新手,想学习R如何用数字方法求解方程式的基础知识。

我的问题是:

  • 当没有解决方案时,fsolve会返回错误。为什么?我如何让它返回南或空?
  • (更一般):请帮助我理解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  ║
╚════════╩═════════════╩════════════════╝

我已将代码放在底部,并且它与unirootfsolve一起使用,例如(-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 ScipyMatlab中的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)
r numerical-methods
1个回答
2
投票

函数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视频。我仍然建议发送错误报告,而不是调试您自己没有编写的包代码。

© www.soinside.com 2019 - 2024. All rights reserved.