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должны быть включены в старые категории. Значения, которые были в удаленных категориях, будут установлены в NaNk = -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)