Введение
Математический анализ знает множество прекрасных функций с необычными свойствами. Среди них интегральные синус и логарифм , также нельзя не отметить гамма-функцию или очень известную дзета-функцию Римана . Но сегодня я предлагаю читателю посмотреть на функцию W-Ламберта
Что такое W-функция Ламберта?
Для того, чтобы понять, что такое W-функция Ламберта, достаточно посмотреть на следующее равенство, которое по аналогии с основным тригометрическим тождеством предлагаю именовать «основное Ламбертово тождество»:
Другими словами, функция Ламберта — обратная для . Однако после первых же исследований станет понятно, что не инъективна, а именно одно и то же значение достигается при двух разных аргументах, если . Поэтому данное выше определение требует пояснений.
Исследовав производную функции , понимаем, что функция возрастает на и убывает на . Таким образом, давайте построим обратную функцию к данной на соответствующих промежутках монотонности.
Ветвь, для которой , называется , другая — .
Постановка задачи
Задача. Научиться находить действительные корни уравнения следующего вида:
Как вы, наверное, уже догадались, для решения будем использовать W-функцию Ламберта. Итак, сначала возведем и левую, и правую часть в степень (это преобразование не является равносильным при четных целых , а при нечетных нужно будет расширять множество значений до всех действительных чисел, поэтому решаем задачу для указанных выше ограничений).
Теперь для того, чтобы воспользоваться основным Ламбертовым тождеством, нам нужно получить выражение с такое, как и в показателе степени экспоненты. Для этого поделим и левую, и правую часть на .
И теперь мы можем воспользоваться основным Ламбертовым тождеством:
Откуда и получаем уже итоговую формулу для .
Вычисление W-функции Ламберта
Заметим, что при функция Ламберта дает два действительных значения: по одному на каждой из ветвей и соответственно. В этом случае у изначального уравнения будет 2 корня.
Вычисление W0. Будем использовать метод бинарного поиска по ответу. Мы можем так поступить, поскольку возрастает на .
Левая граница бинарного поиска понятна и равна. Теперь возникает вопрос, как выбрать правую границу. Первая идея, которая приходит на ум: положить ее равной , ибо верно неравенство , причем равенство достигается только в нуле.
Однако для достаточно больших это может быть не лучшим вариантом. Поэтому давайте посмотрим на другой: выберем правую границу равной .
Итого: при правой границей выбираем , а при.
Ассимптотика: , prec — изначально выбранная точность (например, 10-12)
Вычисление W-1. Здесь будем использовать следующее бесконечное выражение для :
Чем глубже мы спускаемся, тем выше точность вычислений.
Реализация на Python
from math import * def LambertW0(x): left = -1 right = x if x <= e else log(x) prec = 10**-12 # точность # бинарный поиск while right - left > prec: mid = (right + left) / 2 if mid * exp(mid) > x: right = mid else: left = mid return right def LambertW_1(x, t): # t - показатель точности if t == 100: return log(-x) else: return log((-x)/(-LambertW_1(x, t + 1))) def sol(p, q): s = q**(1/p) / p if s < -exp(-1): return "No real solutions" ans = "Solutions: " + str(p * LambertW0(s)) + " " if -exp(-1) < s and s < 0: ans += str(p * LambertW_1(s, 0)) return ans p = float(input()) q = float(input()) print(sol(p, q))
Проверка
Уравнение 1.
Уравнение 2.
Уравнение 3.
Заключение / выводы
Значения на 0 и -1 ветви W-функции Ламберта могут быть достаточно точно вычислены за короткое время, что делает возможным решение некоторых типов уравнений.
ссылка на оригинал статьи https://habr.com/ru/post/665634/