Решение экспоненциального уравнения в MATLAB - PullRequest
3 голосов
/ 30 апреля 2011

Я сейчас пытаюсь решить экспоненциальное уравнение в MATLAB как часть моего задания.Легко видеть, что уравнение

exp(-t)+t*exp(-t)-n=0

будет иметь два решения: одно больше нуля, а другое меньше.

Однако, используя только функцию решения, MATLAB возвращает то, что называется функцией lambertwи это может только eval () для решения ниже нуля, что не является тем, который я хочу получить в ответ.Может ли кто-нибудь помочь мне здесь?

Заранее спасибо за все ответы и комментарии!

ps В качестве альтернативы, я думаю об использовании метода Ньютона-Рафсона для его решения, но мне интересно, кактакое сравнение скорости для решения ()?

Ziyao Wei

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

В приведенном ниже коде я численно решаю уравнение для n=0.5 (константа), но для вас оно должно быть аналогичным для других выбранных вами значений.

Обратите внимание, что функция SOLVE вернула только первое найденное решение. Поэтому я вызываю механизм MuPAD напрямую и указываю каждый раз интервал, в котором следует искать решение:

%# lets plot the function: f(x) = exp(-x)+x*exp(-x)
h(1) = ezplot('0.5', [-1.5 10]); hold on
h(2) = ezplot('exp(-x)+x.*exp(-x)', [-1.5 10]);
set(h(1), 'LineStyle',':', 'Color','r')
legend(h, 'y = 0.5', 'y = exp(-x)+x.*exp(-x)')

%# The numeric solver only returns the first solution that it finds
x = solve('exp(-x)+x*exp(-x)=0.5')
x = vpa(x)

%# we can call the MuPAD solver and give the interval where solution can be found
x1 = evalin(symengine, 'numeric::solve(exp(-x)+x*exp(-x)=0.5, x = -1..0)')
x2 = evalin(symengine, 'numeric::solve(exp(-x)+x*exp(-x)=0.5, x = 0..3)')

%# show the solutions on the plot
plot([x1 x2], 0.5, 'ro')

Решение, возвращаемое SOLVE:

x =
- 1.0*lambertw(0, -1/(2*exp(1))) - 1.0
x =
-0.76803904701346556525568352607755

Числовые решения MuPAD:

x1 =
-0.76803904701346556525568352607755
x2 =
1.6783469900166606534128845120945

enter image description here

1 голос
/ 30 апреля 2011

lambertw - это функция, которая вам нужна. Однако это многозначная функция и имеет несколько ветвей. Вам нужно выбрать правильную ветку для вашего ответа. См. мой ответ на другой вопрос о том, как выбрать другую ветвь для решения.

1 голос
/ 30 апреля 2011

Ответ, предоставленный matlab, верен, но дает только одну ветку.Чтобы получить другую ветку, используйте предоставленный ответ, но замените lambertw(x) на lambertw(k,x) для различных значений k.

См. документ lambertw для получения дополнительной информации.

Вы можете взглянуть на функцию Ламберта W на mathworld , чтобы узнать больше и визуализировать различные ветви.

...