2012-06-01 6 views
0

J'essaye de faire un programme dans scilab (heureusement il en va de même pour matlab) pour obtenir le temps où un vecteur stable est trouvé, je veux dire, après avoir fait plusieurs fois le vecteur produit et la matrice le résultat deviendra stable et ne changera pas.Stable vecteur de probabilités

Je pense que la meilleure façon de le faire est avec une fonction récursive donc je coder les éléments suivants:

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 

Laissez-moi vous expliquer qu'un peu un peu, V est un produit de vecteur initial et la matrice, si le résultat est le même que le paramètre vectoriel puis doit renvoyer l'heure à laquelle cela s'est produit, sinon il appellera la même fonction avec le résultat comme premier paramètre. Cependant, j'obtiens l'erreur suivante

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

Est-ce que ma fonction est correcte? Pouvez-vous m'aider s'il vous plaît?

+1

Je pense qu'il ya un moyen plus efficace d'utiliser la décomposition propre de la matrice, je ne suis pas sûr de savoir comment? Peut-être que vous pourriez ajouter la balise 'math' pour attirer les bonnes personnes :) – Amro

+0

Calcul des vecteurs propres. Avec ou sans décomposition, ce qui n'est qu'un outil. – JohnB

+0

Pouvez-vous poster un exemple de matrice et de vecteur? – Ansari

Répondre

1

Votre fonction ne semble pas correcte. Cela pourrait être plus comme ça:

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

La déclaration de retour ne fonctionne pas sur Scilab, mais la condition a résolu mon problème, merci –

+0

Content de l'entendre. Pour une implémentation plus robuste, je suggérerais de diviser 'norme (V - v)' par 'norme (v)', puis de vérifier si elle est inférieure à 0.001 ou quel que soit le seuil que vous voulez. – Ansari

1

Probablement stable ne signifie pas "ne change pas" mais "converge"? Ensuite, vous ne pouvez pas tester l'égalité V == v pour terminer la boucle. Vous pouvez regarder la différence relative entre les deux vecteurs et terminer si elle devient inférieure à, par exemple. 1% ou 0,1%.

Avez-vous l'erreur également lorsque vous (à des fins de test) terminent si i == 10 au lieu de V == v?