scipy.special.

lambertw#

scipy.special.lambertw(z, k=0, tol=1e-8)[источник]#

Функция Ламберта W.

Функция Ламберта W W(z) определяется как обратная функция w * exp(w). Другими словами, значение W(z) таков, что z = W(z) * exp(W(z)) для любого комплексного числа z.

Функция Ламберта W является многозначной функцией с бесконечно многими ветвями. Каждая ветвь дает отдельное решение уравнения z = w exp(w). Здесь ветви индексируются целым числом k.

Параметры:
zarray_like

Входной аргумент.

kint, необязательный

Индекс ветви.

tolfloat, опционально

Допуск оценки.

Возвращает:
wмассив

w будет иметь ту же форму, что и z.

Смотрите также

wrightomega

функция Райта Омега

Примечания

Все ветки поддерживаются lambertw:

  • lambertw(z) дает главное решение (ветвь 0)

  • lambertw(z, k) даёт решение на ветке k

Функция Ламберта W имеет две частично вещественные ветви: главную ветвь (k = 0) является вещественным для вещественных z > -1/eдолжны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaN k = -1 ветвь является вещественной для -1/e < z < 0. Все ветви, кроме k = 0 имеют логарифмическую особенность в z = 0.

Возможные проблемы

Оценка может стать неточной вблизи точки ветвления в -1/e. В некоторых крайних случаях, lambertw может в настоящее время не сходиться или оказаться на неправильной ветви.

Алгоритм

Итерация Халли используется для обращения w * exp(w), используя асимптотическое приближение первого порядка (O(log(w)) или O(w)) в качестве начальной оценки.

Определение, реализация и выбор ветвей основаны на [2].

Ссылки

[2]

Corless et al, “On the Lambert W function”, Adv. Comp. Math. 5 (1996) 329-359. https://cs.uwaterloo.ca/research/tr/1993/03/W.pdf

Примеры

Функция Ламберта W является обратной к w exp(w):

>>> import numpy as np
>>> from scipy.special import lambertw
>>> w = lambertw(1)
>>> w
(0.56714329040978384+0j)
>>> w * np.exp(w)
(1.0+0j)

Любая ветвь дает допустимую обратную функцию:

>>> w = lambertw(1, k=3)
>>> w
(-2.8535817554090377+17.113535539412148j)
>>> w*np.exp(w)
(1.0000000000000002+1.609823385706477e-15j)

Приложения к решению уравнений

Функция Ламберта W может использоваться для решения различных типов уравнений. Мы приводим здесь два примера.

Во-первых, функция может использоваться для решения неявных уравнений вида

\(x = a + b e^{c x}\)

для \(x\). Мы предполагаем \(c\) не равно нулю. После небольшой алгебры уравнение может быть записано как

\(z e^z = -b c e^{a c}\)

где \(z = c (a - x)\). \(z\) может быть выражена с использованием функции Ламберта W

\(z = W(-b c e^{a c})\)

давая

\(x = a - W(-b c e^{a c})/c\)

Например,

>>> a = 3
>>> b = 2
>>> c = -0.5

Решение для \(x = a + b e^{c x}\) равен:

>>> x = a - lambertw(-b*c*np.exp(a*c))/c
>>> x
(3.3707498368978794+0j)

Проверить, что оно решает уравнение:

>>> a + b*np.exp(c*x)
(3.37074983689788+0j)

Функция Ламберта W также может использоваться для нахождения значения бесконечной степенной башни \(z^{z^{z^{\ldots}}}\):

>>> def tower(z, n):
...     if n == 0:
...         return z
...     return z ** tower(z, n-1)
...
>>> tower(0.5, 100)
0.641185744504986
>>> -lambertw(-np.log(0.5)) / np.log(0.5)
(0.64118574450498589+0j)