Matlab: решение логарифмического уравнения
у меня есть следующее уравнение, которое я хочу решить относительно a
:
x = (a-b-c+d)/log((a-b)/(c-d))
здесь x
, b
, c
и d
известны. Я использовал Wolfram Alpha для решения уравнения, и результат:
a = b-x*W(-((c-d)*exp(d/x-c/x))/x)
здесь W
является функцией журнала продукта (функция Lambert W). Возможно, будет легче увидеть его в страница Вольфрам Альфа.
я использовал встроенный Matlab чтобы решить уравнение. Это довольно медленно и является узким местом в моем сценарии. Есть ли другой, более быстрый способ сделать это? Он не должен быть точным вплоть до десятичного знака.
изменить: Я понятия не имел, что это уравнение так трудно решить. Вот картина, иллюстрирующая мою проблему. Температуры b-d плюс LMTD меняют в каждом шаге времени, но знаны. Тепло передается от красной линии (CO2) к Голубой линии (вода). Мне нужно найти температуру "а". Я не знал, что это так трудно. рассчитать! :P
2 ответов
другой вариант основан на более простой функция ω Райта:
a = b - x.*wrightOmega(log(-(c-d)./x) - (c-d)./x);
предусмотрено, что d ~= c + x.*wrightOmega(log(-(c-d)./x) - (c-d)./x)
(т. е. d ~= c+b-a
, x
is 0/0
в данном случае). Это эквивалентно основной ветви Ламберт W функции, W0, который, я думаю, является ветвью решения, которую вы хотите.
как lambertW
, есть wrightOmega
два (комбинируются) параметры:
- ваш сценарий уже векторизован? Оцените функцию для более чем одного аргумента. Выполнение
for i = 1:100, a(i)=lambertw(rhs(i)); end
медленнее, чемa=lambertw(rhs)
. - если вы имеете дело с реальной ценной ветвью LambertW (т. е. ваши аргументы находятся в интервале
[-1/e, inf)
), вы можете использовать реализациюLambert_W
, представленного Клив Молер на Обмен.