écrire une simple simulation de Monte Carlo d'un faisceau de neutrons. Avoir des problèmes avec la logique de la géométrie (si quelque chose est dans un environnement ou un autre). Mon problème est que Ruby semble traiter les conditions de façon séquentielle et garder la première valeur à laquelle il arrive.Problème avec la logique combinée en ruby
Le code ci-dessous illustre cela très bien:
def checkPosition(*args)
polyCylRad = 2.5
polyCylFr = 15
polyCylB = -2.0
borPolyBoxL = 9.0/2
pbCylRad = 3.0
pbBoxL = 10.0/2
cdBoxL = 9.5/2
position = Array.new
material = String.new
args.each do |item|
position << item.inspect.to_f
end
xSquared = position.at(0) ** 2
ySquared = position.at(1) ** 2
zSquared = position.at(2) ** 2
modX = Math.sqrt(xSquared)
modY = Math.sqrt(ySquared)
modZ = Math.sqrt(zSquared)
puts xSquared
puts Math.sqrt(ySquared + zSquared) <= polyCylRad
puts (position.at(0) >= polyCylB)
puts (position.at(0) <= polyCylFr)
puts (position.at(0) >= polyCylB)and(position.at(0) <= polyCylFr)
puts (position.at(0) <= polyCylFr)and(position.at(0) >= polyCylB)
puts zSquared
polyCylinder = (Math.sqrt(ySquared + zSquared) <= polyCylRad)and((position.at(0) >= polyCylB)and(position.at(0) <= polyCylFr))
puts polyCylinder
borPolyBox = ((modX <= borPolyBoxL)or(modY < borPolyBoxL)or(modZ <= borPolyBoxL)) and not((modX >= cdBoxL)or(modY >= cdBoxL)or(modZ >= cdBoxL)) and not(Math.sqrt(ySquared + zSquared) <= polyCylRad)
puts borPolyBox
cadmiumShield = ((modX <= cdBoxL)or(modY < cdBoxL)or(modZ <= cdBoxL)) and not((modX >= pbBoxL)or(modY >= pbBoxL)or(modZ >= pbBoxL)) and not(Math.sqrt(ySquared + zSquared) <= polyCylRad)
puts cadmiumShield
leadShield = (((modX <= pbBoxL)or(modY <= pbBoxL)or(modZ <= pbBoxL)) or ((position.at(0) <= ployCylFr)and(Math.sqrt(ySquared + zSquared) <= pbCylRad))) and not(Math.sqrt(ySquared + zSquared) <= polyCylRad)
puts leadShield
if (polyCylinder) : material = "poly"
elsif(borPolyBox) : material = "borPoly"
elsif(cadmiumSheild) : material = "cd"
elsif(leadSheild) : material = "pb"
elsif(material == nil) : position = Array.new
end
thisEnvironment = Array.new
thisEnvironment << position << material
puts thisEnvironment.at(0)
puts thisEnvironment.at(1)
end
checkPosition(40, 0, 0)
appel le code que vous voulez, mais lui donnent * args comme argument (je suis paresseux et peut vouloir ajouter plus args à l'avenir) puis appelez-le avec 3 flotteurs, avec la géométrie définie dans la logique et vous verrez ce que je veux dire.
Ma question est: comment puis-je faire fonctionner comme il se doit (c'est-à-dire évaluer la logique correctement) sans un tas de si imbriqués? (Ce qui est ce que je suis sur le point de refaire, mais il est un cauchemar à lire et la mémoire ne coûte pas cher.)
Pouvez-vous être plus précis sur la façon dont vous voulez évaluer la logique? Quel devrait être le code de sortie? – wdebeaum
Eh bien, pour le moment tout ce que je veux regarder sont les valeurs de vérité données aux différents domaines. Cela dépend du tableau d'arguments. Mon problème est décrit dans le premier groupe de déclarations puts, l'ordre des questions de logique évaluées, quand il ne devrait pas * si j'utilise &&, || ou ou et et *, pourquoi est-ce? Je ne pense pas que ce soit le cas, mais: j'utilise l'interpréteur jEdit (que je suis sûr de regarder dans mon PATH). – morb