2016-05-04 3 views
0

для некоторых симуляций мне нужно использовать приближение экспоненциальной функции. Теперь проблема, что у меня есть, что:Имитация экспоненциальной функции с пертубацией

function s=expone(N,k) 
s=0 
for j=1:k 
    s=s+(exp(-N+j*log(N)-log(factorial(j)))); 
end 
end 

является довольно стабильным, в том смысле, что это почти 1 для к достаточно большим. Однако, как только N больше 200, он быстро падает до нуля. Как я могу улучшить, что мне нужно большое N. Я не могу изменить математическое почему написания этого, так как у меня есть дополнительный pertubation, мой окончательный код будет выглядеть что-то ложь:

function s=expone(N,k) 
s=0 
for j=1:k 
    s=s+(exp(-N+j*log(N)-log(factorial(j))))*pertubation(N,k); 
end 
end 

THe pertubation находится в диапазоне от 0 до 1, так что это не проблема, но префактор, похоже, не работает для N> 200. Может ли кто-нибудь помочь? Спасибо большое!

+1

что является целью приближения, вместо того чтобы использовать экспоненциальную функцию сам? Что вы подразумеваете под «это почти 1 для k достаточно большой»? Экспонента не должна равняться 1, не так ли? Что вы подразумеваете под «быстро падает до нуля»: при дальнейшем увеличении «N» или увеличении «k»? Чего вы ожидаете от вас? – tvo

+0

Должно ли это быть пертутацией (N, j) вместо пертутации (N, k)? – dmuir

+0

да, спасибо за указание, что наш! – Liealgebrabach

ответ

1

Бревно функция (х) - х имеет положительную и отрицательную часть Graphic in Wolframalpha

а х - журнал (! Х) отрицательна при х> = 0 Graphic in Wolframalpha

Таким образом, проблема возникает, когда (N - log (N)) много больше (j - log (j)). Поэтому решение состоит в том, чтобы выбрать j намного больше, чем N. Exp (отрицательный) стремится к нулю

например expone (20,1) = 7.1907e-05, но expone (20,20) = 0.5591 и expone (20,50) = 1.000

Как заключение, если вы хотите работать с N большой, J должно быть больше, а в качестве дополнительного наконечника вы можете изменить вы действуете, чтобы избежать для петель:

function s = expone(N,k) 
j = 1:k; 
s = sum ((exp(-N+j*log(N)-log(factorial(j))))); 
end 
+0

Большое спасибо за ваш ответ! Просто два вопроса: когда я использую ваш код, и я хочу его построить (я имею в виду вектор, меняя N), я просто получаю постоянный график, он, похоже, не обрабатывает вектор. Во-вторых, вы бы предложили начать суммирование, когда j очень велико, поэтому j >> N? – Liealgebrabach

+0

Я также считаю, что использование формулы смешивания помогает, потому что факториал ломается для больших чисел ... – Liealgebrabach

+0

Да, я пробовал с формулой Стирлинга, и он еще более стабилен. с другой стороны, код может использоваться вектором либо с помощью arrayfun, либо для цикла – daleonpz

Смежные вопросы