2010-09-24 25 views
3

Je suis en train de réécrire un modèle de simulation de monte carlo dans Matlab en mettant l'accent sur la lisibilité. Le modèle implique de nombreuses particules (représentées par (x, y, z)) suite à une marche aléatoire sur un petit ensemble d'états avec certaines probabilités de terminaison. L'information pertinente pour la sortie est le nombre de particules qui se terminent dans un état donné.Comment vectoriser une simulation de marche aléatoire dans Matlab

La simulation nécessite suffisamment de particules pour que chaque particule soit individuellement coûteuse. La vectorisation semble être le moyen d'obtenir des performances de Matlab, mais existe-t-il une manière idiomatique de créer une version vectorisée de cette simulation dans Matlab? Je me bats la tête contre le mur pour y arriver - j'ai même essayé de créer une matrice nStates x nParticles représentant chaque combinaison particule-état, mais cette approche devient rapidement hors de contrôle (lisibilité) car les particules rebondissent état à déclarer indépendamment l'un de l'autre. Devrais-je juste mordre la balle et passer à une langue plus appropriée pour cela?

+0

Difficile de faire des commentaires utiles lorsque vous donnez si peu de détails sur la nature du problème. –

+0

Excuses, j'essayais de le garder abstrait pour plus de clarté. Je simule le transport de la lumière à travers des couches de matière organique. Chaque particule (photon) frappe le matériau et peut être réfléchie ou réfractée. Ceci est déterminé avec une certaine probabilité proportionnelle aux propriétés du matériau et à l'angle d'incidence. La particule peut "rebondir" à l'intérieur des couches. Je veux savoir combien sont reflétés dans l'ensemble, et combien le traversent. Je fais ceci en tirant beaucoup de particules et en traçant leurs chemins. La question est, comment tracer ces chemins en tant que code vectorisé plutôt qu'une boucle while pour chaque particule. – Cosbynator

Répondre

3

Il suffit d'écrire le code comme vous le feriez normalement. Presque toutes les fonctions de matlab peuvent accepter et retourner une entrée vectorisée. Par exemple, pour simuler un mouvement brownien de particules N en 1 dimension

position = zeros([N 1]); %start at origin 
sigma = sqrt(D * dt); %D is diffusion coefficient, dt is time step 
for j = 1:numSteps 
    position = position + sigma*randn(size(position)); 
end 

si vous voulez avoir un autre sigma pour chaque position, vous feriez sigma un vecteur de la même taille que la position et l'utilisation « des temps de point » notation pour indiquer l'élément par élément opération

position = position + sigma.*randn(size(position)); 

si la diffusion était une fonction arbitraire de position et un élément aléatoire, vous devriez juste écrire une fonction vectorisée, par exemple

function newstep = step(position) 
%diffusion in a overdamped harmonic potential 
newstep = -dt*k*position + D*randn(size(position)); 

for j = 1:numsteps; position = position + step(position); 

et ainsi de suite

+0

Ceci est vraiment utile. J'ai une question supplémentaire: dans mon cas, la particule est représentée par la vitesse en 3D et le numéro de couche (entier), c'est-à-dire un 4-tuple. J'ai besoin d'un comportement différent en fonction du numéro de calque. Comment pourrions-nous changer l'exemple pour avoir plusieurs fonctions en fonction du premier élément du tuple et le garder vectorisé? Par exemple. il pourrait y avoir 6 fonctions "newstep", dont le choix dépend de quelle couche. – Cosbynator

+0

Puis-je utiliser la fonction ci-dessus pour simuler un ensemble d'utilisateurs mobiles. Si oui, comment pouvez-vous inclure les paramètres de l'utilisateur tels que la puissance d'émission et les interférences dans la fonction ci-dessus. –