Arxiu mensual: novembre de 2019

Ruta pels arbres singulars de Barcelona (minimitzant la distància)

El problema del viatjant de comerç (traveling salesman problem) és un problema clàssic de l’algorísmica: es tracta de passar per una sèrie de punts, sense repetir-ne cap, i minimitzant la distància recorreguda. Fa unes poques setmanes vaig importar els arbres singulars de Barcelona a OpenStreetMaps, i crec que és una bona activitat didàctica per conèixer els arbres de la ciutat fer una ruta per uns quants d’aquests arbres.

Per fer-ho més interessant, podem plantejar-nos el problema de fer un recorregut que minimitzi la distància, passant per tots els arbres, i que retorni al punt de partida. Vaig estar cercant diferents implementacions amb Python que resolguin el problema, fins que en vaig trobar una que satisfeia la meva restricció de tornar al punt de partida.

Sobre aquesta solució he fet alguna modificació per tal de generar un fitxer JSON amb la solució. Finalment, hem de pintar sobre un mapa OSM els nostres punts (nodes); traçar una línia recta entre els punts; i afegir un label-text informatiu sobre aquests punts. El resultat es pot veure en la imatge.

Evidentment hem fet unes simplificacions: la distància mínima entre dos punts és la línia recta, però per la ciutat no podem anar en línia recta, i a més poden haver-hi pujades i baixades. Però com a exercici didàctic crec que és interessant.

Aquí Catalunya són populars les Curses d’Orientació. Crec que es podria aprofitar aquestes activitats en el lleure i afegir-hi una capa de coneixement, com ara conèixer els arbres, conèixer monuments, etc. Crec que per als joves i infants pot ser una activitat engrescadora.

Referències:

Llibre: Elementary Mechanics Using Python

Tinc un nou repte pel que queda de 2019 i per al primer semestre del 2020. He començat a llegir el llibre Elementary Mechanics Using Python: A Modern Course Combining Analytical and Numerical Techniques, de Anders Malthe-Sørenssen. És tot un curs de física, i combina de manera bastant entenedora els exemples clàssics de moviment, forces, energia,… amb les seves solucions numèriques, utilitzant les llibreries matemàtiques i de fer gràfiques de Python.

Es tracta d’implementar tots els exemples del llibre a codi Python. No he vist cap enllaç per descarregar tot el codi, en qualsevol cas, els exemples vull adaptar-los i fer-me’ls meus. He començat per l’exemple del pes suspès d’una molla, que com tothom sap la solució del moviment és sinusoidal al voltant del punt d’equilibri, la velocitat és zero en els punts màxim i mínim, i la velocitat és màxima en el punt d’equilibri. Aquest exemple s’explica en l’apartat 5.7, que parla de forces, i no n’hi ha prou en copiar i enganxar el codi, sinó que l’he hagut d’adaptar. Aquesta és la meva solució:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

# Initialize
m = 1.0
# kg
k = 100.0 # N/m
v0 = 1.0
# in m/s
time = 2.0 # s
g = 9.8 # m/s^2

# Numerical setup
dt = 0.0001 # s
n = int(round(time/dt))
t = np.zeros(n,float)
y = np.zeros(n,float)
v = np.zeros(n,float)
# Initial values
y[0] = 0.0
v[0] = v0
# Simulation loop
for i in range(n-1):
\tF = -k*y[i] – m*g
\ta = F/m
\tv[i+1] = v[i] + a*dt
\ty[i+1] = y[i] + v[i+1]*dt
\tt[i+1] = t[i] + dt

fig = plt.figure()
fig.suptitle(u”Objecte suspès d’una molla”)
plot1 = fig.add_subplot(211)
#plot1.set_xlabel(‘t [s]’)
plot1.set_ylabel(‘y [m]’)
plot1.xaxis.grid()
plot1.plot(t,y)
plot2 = fig.add_subplot(212)
plot2.set_xlabel(‘t [s]’)
plot2.set_ylabel(‘v [m/s]’)
#plot1.grid(axis=’y’)
#plt.grid(b=True, which=’minor’, color=’#666666′, linestyle=’-‘)
plot2.xaxis.grid()
plot2.plot(t,v)

for i in range(10, n-1, 400):
\tplot1.plot(t[i],y[i],’ob’)
\tplot2.plot(t[i],v[i],’ob’)

plt.show()

Aquests són els capítols i temes que es tracten en el llibre:

4. Motion in One Dimension .
5. Forces in One Dimension .
6. Motion in Two and Three Dimensions
7. Forces in Two and Three Dimensions
8. Constrained Motion
9. Forces and Constrained Motion
10. Work
11. Energy
12. Momentum, Impulse, and Collisions
13. Multiparticle Systems
14. Rotational Motion
15. Rotation of Rigid Bodies
16. Dynamics of Rigid Bodies

Troballa de la constant de gravitació g

Després d’ajustaments diversos, ja estic en condicions de realitzar l’experiment del pèndol per trobar la constant de la gravetat.

He provat diferents tipus de sensors, i finalment em quedo amb uns sensors d’efecte Hall que detecten el pas de l’iman (el pes del pèndol és un iman). Encara em falten fer unes quantes millores. De fet, la fórmula que fem servir (moviment harmònic) només és vàlida quan sin(x) = x, i això implica que l’estructura del moble ha de ser més gran i el cable més llarg, per poder limitar l’angle alfa, tot mantenint el període del cicle.

Importacions del Cadastre a OSM

Jo sóc nou amb això de OpenStreetMaps. Però de la gent que porta temps, veig que en les llistes de correu es parla bastant d’importacions del Cadastre. Importar el Cadastre és important perquè es tracta d’unir la informació geomètrica dels edificis amb altres capes d’informació, concretament la direcció postal d’un edifici. Si s’aconsegueix això a nivell general, serveis com Nominatim, que proporcionen geocoding (resoldre una direcció postal a coordenades geogràfiques; o a l’inversa), serà molt útil (com ho és el mateix servei que proporciona Google Maps).

Anem a fer un cas concret: Bagà, on no hi ha ficada la informació del cadastre. Faig la prova d’un edifici de Bagà, per exemple Carrer del Raval 13 Bagà. A partir de la informació de l’edifici on visc (a Barcelona, on sí que hi ha incorporada la informació del cadastre), veig com és el format de la informació que s’ha d’incorporar:

addr:housenumber=13
addr:postcode=08695
addr:street=Carrer del Raval
type=multipolygon

Per tant, modifico a OSM el builiding en qüestió i afegeixo aquesta referència.

Ara ja podem anar a Nominatim, i cercar per

Carrer del Raval 13 Bagà

I el troba! Aquí es veu la importància d’afegir la informació del Catastre a OSM.

També podem fer la consulta inversa, a partir de les coordenades trobar la direcció postal:

https://nominatim.openstreetmap.org/reverse?format=xml&lat=42.25255&lon=1.86283&zoom=18&addressdetails=1

I el resultat (en format XML):



13, Carrer del Raval, Bagà, Berguedà, Barcelona, Catalunya, 08695, Espanya

13 Carrer del Raval Bagà
Berguedà
Catalunya 08695 Espanya
es

Vista des del Refugi de Rebost (realitat virtual)

En el curs de Realitat Virtual ens fan fer una petita aplicació de realitat virtual. Entre les diferents propostes, RoundMe sembla ser una opció fàcil i ràpida.

Primer de tot hem de descarregar de Google Maps una fotografia panoràmica, i s’ha de convertir com està explicat en el tutorial en un panorama apte per ser importat a RoundMe.

RoundMe m’ha semblat bastant inestable. De fet, no podia penjar el meu panorama a Public, em donava un error de upload. De fet, vaig fer fins a 4 proves diferents el divendres passat, fins que ho vaig deixar per després del cap de setmana. I la meva sorpresa avui diumenge al vespre és que aquests 4 panorames estan com a Publics. Bueno, en fi…

Com a exemple he trobat una foto del refugi de Rebost (la foto no és meva, sinó que l’he trobat d’algú que l’ha penjada a Google Maps), i des del refugi puc identificar fàcilment unes muntanyes i paisatges que em són molt familiars.