Centro de masas
El centro de masas de un sistema discreto es el punto geométrico que dinámicamente se comporta como si en él estuviera aplicada la resultante de las fuerzas externas al sistema.
Representamos un conjunto de n masas en el plano mediante una lista de n pares de la forma ((a(i),b(i)),m(i)) donde (a(i),b(i)) es la posición y m(i) la masa puntual. Las coordenadas del centro de masas (a,b) se calculan por
1 2 |
a = (a(1)*m(1) + a(2)*m(2) + ... + a(n)*m(n)) / (m(1) + m(2) +...+ m(n)) b = (b(1)*m(1) + b(2)*m(2) + ... + b(n)*m(n)) / (m(1) + m(2) +...+ m(n)) |
Definir la función
1 |
centrodeMasas :: [((Float,Float),Float)] -> (Float,Float) |
tal que (centrodeMasas xs) es las coordenadas del centro
de masas del sistema discreto xs. Por ejemplo:
1 |
centrodeMasas [((-1,3),2),((0,0),5),((1,3),3)] == (0.1,1.5) |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 |
-- 1ª definición (por comprensión): centrodeMasas :: [((Float,Float),Float)] -> (Float,Float) centrodeMasas xs = (sum [a*m | ((a,_),m) <- xs] / t, sum [b*m | ((_,b),m) <- xs] / t) where t = sum [m | (_,m) <- xs] -- 2ª definición (por recursión): centrodeMasas2 :: [((Float,Float),Float)] -> (Float,Float) centrodeMasas2 xs = aux xs (0,0,0) where aux [] (as,bs,ms) = (as/ms, bs/ms) aux (((a,b),m):ys) (as,bs,ms) = aux ys (as+a*m,bs+b*m,ms+m) |
Usando un monoide
Solución por comprensión: