2015-09-23 5 views
0

На прошлой неделе я спросил следующее: https://stackoverflow.com/questions/32658199/vectorizing-gibbs-sampler-in-matlab Возможно, было не совсем понятно, что я хочу делать, поэтому это может быть более ясным. Я хотел бы векторизовать цикл «for» в matlab, где некоторые переменные внутри цикла связаны двунаправленно. Итак, вот пример:векторизация цикла «для» с двунаправленными переменными

A=2; 
B=3; 

for i=1:10000 

    A=3*B; 
    B=exp(A*(-1/2)) 

end 

Еще раз спасибо за ваше время.

+0

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

ответ

2

Быстрый расчет Excel показывает, что это быстро сходится к 0,483908 (после гораздо меньше, чем 10000 циклов, поэтому одним из способов ускорения его будет проверка на конвергенцию). Если A и B всегда 2 и 3 соответственно, вы можете просто заменить петлю этим значением.

В качестве альтернативы, используя некоторый анализ серии вы можете быть в состоянии придумать с аналитическим выражением для В когда я велико - хотя и с вложенным экспонентом вывода это немного выше моих собственных способностей!

Редактировать

Немного прибегая к помощи показывает this. Википедия утверждает, что для тетрация из х до бесконечности (т.е. х^х^х^х^х ...), решение у удовлетворяет у = х^у. В вашем случае, например, 0.483908 = e^(- 3/2)^0.483908, поэтому 0.483908 является решением. Не знаете, как бы вы это использовали.

Википедия также дает условие конвергенции, которое может вам пригодиться: x лежит между e^-e и e^1/e.

Final Edit (?)

Оказывается, вам нужна функция Ламберта W для решения уравнений вида из у = х^у. Кажется, для этой функции нет никакой нативной функции, но в FileExchange есть что-то вроде: here и here.

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