2012-06-01 3 views
0

Я пытаюсь сделать программу в scilab (надеюсь, что то же самое относится к Matlab), чтобы получить время нахождения стабильного вектора, я имею в виду, сделав несколько раз вектор продукта и матрицу результатом станет стабильным, поэтому не изменится.Стабильный вектор вероятностей

Я думаю, что лучший способ сделать это с помощью рекурсивной функции, так что я закодировано следующее:

function [R]=vector_stable(v,m,i) 
    V=v*m; 
    if(V == v) then 
     R=i; 
     abort; 
    else 
     vector_stable(V,m,i+1); 
    end 
endfunction 

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

-->R=vector_stable(V,M,0) 
!--error 18 
: Too many names. 

Является ли моя функция правильной? Не могли бы вы мне помочь?

+1

Я думаю, что существует более эффективный способ использования собственной декомпозиции матрицы, я просто не уверен, как это сделать? Может быть, вы можете добавить тег 'math', чтобы привлечь нужных людей :) – Amro

+0

Вычислить собственные векторы. С или без разложения, что является лишь инструментом. – JohnB

+0

Можете ли вы разместить образец матрицы и вектор? – Ansari

ответ

1

Ваша функция выглядит неправильно. Это может быть больше похоже на:

function [R] = vector_stable(v, M, i) 

V = v*M; 
if(norm(V - v) < 0.001) 
    R = i; 
    return; 
else 
    R = vector_stable(V,m,i+1); 
end 

return 
end 
+0

Операция возврата не работает на Scilab, однако условие решило мою проблему, спасибо –

+0

Рад это услышать. Для более надежной реализации я бы предложил разделить «norm (V - v)» на «norm (v)», а затем проверить, меньше ли это 0,001 или какой бы пороговый вам ни был. – Ansari

1

Возможно, стабильный не означает, что «не меняется», но «сходится»? Тогда вы не можете проверить равенство V == v для завершения цикла. Вы можете посмотреть на относительную разницу между двумя векторами и закончить, если она станет меньше, например, 1% или 0,1%.

Вы получаете ошибку также, когда вы (для целей тестирования) заканчиваете, если i == 10 вместо V == v?