【问题标题】:Numeric solver (approximate decimal solution) in RR中的数值求解器(近似十进制解)
【发布时间】:2020-07-20 23:33:29
【问题描述】:

我正在尝试使用 R 对人口数据进行几何插值。

我有一个 2000 年的数字(称为 P0)和一个 2006-2010 年的数字(称为 PT)。 2006-2010 年的 PT 是所有这五年的平均值。我想对 2006、2007、2008、2009 和 2010 年的数字进行插值,并且我希望它是一个几何级数,以便结果值加起来达到所需的总数。

我们在数学上使用

new value = P*exp(r*t)

确定 t 个几何增长期后的值。 因此,如果我让 t 成为自 2000 年以来的年数,那么在数学上我可以说

5*Pt = P0*exp(6*r) + P0*exp(7*r) + P0*exp(8*r) + P0*exp(9*r) + P0*exp(10*r)

或者,等价

5*Pt/P0 = exp(6r)+exp(7r)+exp(8r)+exp(9r)+exp(10r)

然后求解 r 将允许我计算我想要的几何插值。

我很难在 R 中找到一种方法。solve() 和 fsolve() 函数似乎更喜欢使用矩阵乘法,而这不是我正在做的。

我查看了一个优化库 (lbfgs),但用它来解决我的问题看起来充其量只是一个丑陋的 hack。

在 R 中是否有一种简单的好方法可以做到这一点?

【问题讨论】:

  • 涉及指数和的方程的解析解通常很难或不可能。您可能不得不采用蛮力最小化解决方案。您不需要外部包,内置的optim() 应该可以用于此...
  • 我知道分析解决方案不会简单或容易。我真的在寻找一种近似它的方法。我希望有一个简单的 R 命令可以做到这一点,看起来 optim() 是我最接近的。感谢您的意见。

标签: r math interpolation solver


【解决方案1】:

事实证明,这里最好的解决方案是uniroot() 功能。

完整的代码最终是

xmin <- uniroot(f = function (x) (exp(6*x) + exp(7*x) + exp(8*x) + exp(9*x) + exp(10*x) - target), interval = c(-1,3), f.lower = 0, f.upper = 0)

然后为了得到合适的 x 值,我使用xmin$root

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多