鉴于:
a = b ln [ max (11, b) ]
如果a
已知,如何计算b
?(我需要使用迭代逼近方法吗?)
如果a / ln(11) <= 11
,那么这是您的解决方案,您不需要任何迭代。否则b * ln(b) - a = 0
,例如使用 Newton-Raphson 求解。
这是您的函数图,其中我们有 x 和 y 而不是 b 和 a。
请注意,点 (11, 11 ln(11)) 处有一个“角”。这是因为您的函数可以重写为:
a = b ln 11 if b <= 11
b ln b if b > 11
(我希望我可以在这里像在其他一些 StackExchange 站点中一样使用 MathJax!)
请注意,第二个版本的解决方案是Lambert W 函数在b = exp(W(a))
哪里。许多编程语言都有实现 Lambert W 函数的包。例如,在 Python 中,通用包调用它。W()
scipy
lambertw()
lambertw
因此,在从 scipy 模块导入函数并从数学模块导入函数exp
和log
(相当于 ln)之后,Python 中的完整解决方案是
b = (a / log(11) if a <= 11 * log(11)
else exp(lambertw(a)))
这比重新发明轮子更容易。请注意,scipy 的lambertw
函数使用连分数来获得近似值,然后使用一到两轮 Newton-Raphson 方法来获得最终结果。这比仅使用 Newton-Raphson 更快。