【问题标题】:Solving 'a = b ln [ max (11, b) ]' for b为 b 求解 'a = b ln [ max (11, b) ]'
【发布时间】:2017-11-30 13:14:43
【问题描述】:

给定:

a = b ln [ max (11, b) ]

如果已知a,如何计算b? (是否需要使用迭代逼近法?)

【问题讨论】:

  • 你的问题不清楚。 “迭代”是什么意思?您使用的是哪种算法(有很多使用迭代)?
  • @RoryDaulton:问题很明确,如何获得 b,是否需要迭代技术。 “我正在使用哪种算法” - 我认为您只是再次问我的问题。这就是为什么我要问,我需要哪个迭代(是否需要,以前我不知道)
  • 我不知道为什么人们投了反对票。伙计们,我想我的问题很清楚,如何计算 b 。以前,我写过,需要哪个迭代。如果你们认为,这个问题不需要迭代,就这样回答,让我知道它是怎么回事。我之前只是假设这个问题需要迭代。如果您认为这是一个有用的问题,请离开此页面。

标签: math max approximation natural-logarithm


【解决方案1】:

如果a / ln(11) <= 11,那么这是您的解决方案,您不需要任何迭代。 否则解决b * ln(b) - a = 0 例如与 Newton-Raphson 合作。

【讨论】:

  • 谢谢@Henrik。这很有帮助。我会试试这个。
【解决方案2】:

这是您的函数图,其中我们有 x 和 y 而不是 b 和 a。

请注意,点 (11, 11 ln(11)) 处有一个“角”。这是因为您的函数可以重写为:

a = b ln 11 if b <= 11
    b ln b  if b > 11

(我希望我可以在这里使用 MathJax,就像在其他一些 StackExchange 网站中一样!)

请注意,the solution to the second versionb = exp(W(a)),其中 W()Lambert W function。许多编程语言都有实现 Lambert W 函数的包。例如,在 Python 中,常见的 scipycalls it lambertw()

因此,在从 scipy 模块导入 lambertw 函数并从数学模块导入 explog(相当于 ln)之后,Python 中的完整解决方案是

b = (a / log(11) if a <= 11 * log(11)
        else exp(lambertw(a)))

这比重新发明轮子更容易。请注意,scipy 的lambertw 函数使用连分数来获得近似值,然后使用一两轮牛顿-拉夫森方法来获得最终结果。这比仅使用 Newton-Raphson 更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2014-03-29
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多