2012-06-01 6 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

eigenvectors를 계산하십시오. 분해의 유무에 관계없이 이는 단지 도구 일뿐입니다. – 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 %.

V == v 대신 i == 10이면 (테스트 목적으로) 종료 될 때 오류가 발생합니까?