Arxiu de la categoria: Matemàtiques

Gràfics interactius amb Jupyter Notebooks: tir parabòlic

Ara que ja he començat a fer proves amb Jupyter Notebook, el següent pas que vull provar és fer gràfics interactius. Doncs ha resultat ser més fàcil i ràpid del que pensava.

Parteixo d’un script python que simula les dades experimentals d’una trajectòria parabòlica, i calcula la paràbola que millor s’hi ajusta (regressió quadràtica). A partir de l’equació de la paràbola es pot deduir la constant g (=9,81 m/s2). Simulo les dades experimentals introduïnt un error de soroll en les dades teòriques. Doncs bé, amb el meu gràfic interactiu puc jugar amb el nivell de soroll, i amb el número de punts de mostreig, tal com es veu en el video. El codi queda de la següent manera:

%matplotlib inline
from ipywidgets import interactive
import numpy as np
import pylab as plt
from IPython.display import display, Math, Latex

# tir parabòlic: y = vy*t - .5gt^2
vy = 10 # 10m/s
g = 9.81 # m/s^2
t_max = 2*vy/g

def f(nivell_soroll, num_punts):
    t = np.linspace(0, t_max, num_punts)
    y_or = vy*t - .5*g*t**2
    noise = np.random.normal(0, nivell_soroll, num_punts) # simulem dades experimentals
    y = y_or + noise

    # ajustament a una paràbola
    z = np.polyfit(t, y, 2)
    g_exp = 2.0*z[0]

    t_ = np.linspace(0, t_max, 100)
    y_ = z[0]*t_**2 + z[1]*t_ + z[2]

    fig, ax = plt.subplots()
    plt.plot(t_, y_, t, y, 'bo')
    plt.suptitle("Tir parabòlic. Regressió quadràtica")
    plt.title("y = " + str(round(z[0],3)) + "t^2 + " + str(round(z[1],3)) + "t + " + str(round(z[2],3)) + " -> g exp = " + str(round(g_exp,3)) + " m/s^2")
    ax.set(xlabel='temps (s)', ylabel='y (m)')
    ax.grid()
    plt.show()
    
interactive_plot = interactive(f, nivell_soroll=(0.0, 2.0),  num_punts=(10, 50))
interactive_plot

Una altra cosa que m’interessa és la manera d’exportar aquests Jupyter Notebooks a una web, conservant les gràfiques i les fórmules en format Latex (encara que es perdi la interacció amb les gràfiques). Això s’aconsegueix directament exportant el Notebook a html:

$ jupyter nbconvert --execute tir_parabolic.ipynb --to html

i integrant aquest codi en una web on hi hagi més text i explicacions, i amb la llibreria Bootstrap.

Introducció a Jupyter Notebooks

Ja feia temps que tenia ganes de mirar què és això de Jupyter Notebook, que se n’està parlant i cada cop se’n parlarà més. Aquest és el primer exemple que faig, la solució de l’equació de 2n grau amb python i la llibreria sympy, que he agafat d’una pàgina que m’agrada molt: arachnoid.com.

El següent pas serà mirar Jupyter Lab, que és una interfície més moderna, i tinc ganes de jugar amb widgets i sliders per poder fer coses més interactives. Ara que estic programant bastant amb Python per preparar exemples per les classes de CNED a la UPC, fer-ho amb les Notebooks de Jupyter seria una manera molt puntera de fer classes interactives.

Referències:

OpenCV: detectar cercles

Un cop ja sabem detectar les rectes, ara fem la part de detectar els cercles. El OpenCV ens dóna el cercle de millor ajustament, amb el seu centre i radi. Per tant només ens cal aplicar l’algorisme de calcular l’error d’ajustament, com s’explica en l’anterior post.

Com a fitxer d’entrada tenim un CSV amb el nom dels participants, el nom del fitxer de les rectes, i el nom del fitxer dels cercles. Com a sortida tenim el fitxer resultats.txt amb les puntuacions obtingudes per cadascun dels participants.

Així doncs, ara només cal portar-ho a la pràctica. Espero que sigui aviat.

Mesurar la rodonesa d’un cercle

Després de resoldre el problema de mesurar la linialitat d’una recta, ara toca mesurar la rodonesa d’un cercle. En la imatge hi ha una captura de la solució que hem implementat.

Hi ha bastanta literatura sobre el tema, però he preferit cercar la solució pel meu compte. Donat un cercle, openCV ens dóna ja el cercle de millor ajustament, amb el centre i el radi. La primera idea és recórrer tots els punts del cercle i fer el sumatori de totes les diferències entre el punt i el radi. El valor dóna una bona idea de com de bo és el cercle, en termes absoluts. Però si ara escalem x2 o per x0.5 el nostre cercle, els resultats seran diferents. Per tant, no he de cercar un error absolut, sinó un error relatiu.

La segona idea és mesurar àrees. Concretament, el quocient entre la diferència d’àrees entre el cercle dibuixat i el cercle aproximat, dividit per l’àrea del cercle. Com es veu en el paper, ara sí que obtenim un valor relatiu de la rodonesa del cercle. Una cosa que hem de tenir en compte és que quan sumem àrees, hem d’agafar el valor absolut de la diferència, per tal de què no hi hagi cancel·lacions.

Com més s’aproxima a 0 el valor, més bo és el cercle. Si el valor el resto de 1, aleshores el cercle perfecte val R=1, i R=0.98 no seria tan bo. Ara falta implementar-ho en el meu programa.

Block (or book) stacking problem

Aquest matí he fet el problema d’apilar llibres (o blocs). Es tracta d’estudiar sota quines condicions puc apilar blocs (de longitud L) de manera que els vagi desplaçant un respecte l’anterior, de manera que no caiguin. Quina és la condició límit per tal de què no caiguin? Amb blocs de longitud L puc aconseguir un desplaçament de longitud L?

Aquest problema recordo haver-m’hi barallat (i crec que en el seu dia no el vaig solucionar) l’estiu de 1989 a Bagà, doncs el problema estava enunciat en el Schaum de Mecànica Teòrica (Murray R, Spiegel). He cercat el llibre (l’he trobat en pdf a la xarxa, segur que el tinc en una estanteria), i a la foto es veu l’enunciat del llibre en la pàg 249. NOTA: Val a dir que la figura que ensenya el llibre està malament i que genera confusió: és al revés, el bloc de dalt és el que sobresurt la meitat, i els blocs de baix són els que estan més junts (la figura del llibre té un apilament clarament inestable, els blocs segur que cauen perquè el centre de gravetat està fora del bloc de més a sota).

En aquella època no existia Internet, o sigui que m’hi vaig barallar sense poder demanar ajuda. Ara l’he resolt (tot sol, va a dir, veure el pdf en els enllaços de sota), i després de resoldre’l he cercat informació complementària que he trobat d’allò més interessant (videos de Youtube inclosos), veure els enllaços.

La solució. Tot el sistema dels blocs 1…N-1 que estan sobre el bloc N no cauen si el seu centre de masses cau just en l’extrem del bloc N. Es pot resoldre de forma iterativa: el bloc 1 s’aguanta sobre el bloc 2 si el posem a la meitat, L/2. El sistema blocs 1+2 s’aguanta sobre el bloc 3 si el centre de masses dels blocs 1+2 està just en l’extrem del bloc 3. Anem posant blocs, i anem calculant els centres de masses, i anem veient quina és la condició d’equilibri. I al final (veure la solució) es troba que el centre de masses és una sèrie harmònica:

Xi+1cm = L/2 * (1 + 1/2 + 1/3 + … + 1/i)

I ara una mica de matemàtiques: la sèrie harmònica és divergent (encara que divergeix molt lentament). La qual cosa significa que es pot aconseguir un desplaçament teòric tan gran com es vulgui (veure el video de l’enllaç, on s’aconsegueix un desplaçament bastant gran).

Ara només em falta fer l’experiència amb la Maria i el Pere, a veure si ho podem fer aquest mes. Si ho aconseguim, penjarem també el video.

Enllaços:

Llibre d’equacions diferencials. Capítol “Equació de la corda pesant: la catenària”

Recordo en els meus dies de la facultat que vam resoldre a la pissarra l’equació de la corda pesant. És un cas típic d’anàlisi infinitessimal, amb solució analítica: la corba catenària. L’equació va ser obtinguda per primera vegada per Leibniz, Huygens i Johann Bernoulli el 1691.

M’ho he passat molt bé escribint aquest article. M’ha servit per aprofundir en LaTeX, i en la llibreria Matplotlib per fer les gràfiques amb Python.

Com es comenta a l’article, un cas pràctic molt divertit podria ser la construcció d’una bicicleta de rodes quadrades que circulés sobre una superfície feta a base de corbes catenàries. La idea seria pròpia del Cirque du Soleil, segur que triomfaria!

Pots descarregar aquest capítol en el següent enllaç:

Llibre d’equacions diferencials. Capítol “La ciència de l’enamorament”

Vaig amb la idea d’escriure alguns articles sobre equacions diferencials, que podrien desembocar en un llibre. M’agradaria donar un to amè, centrant-me en aspectes pràctics, per demostrar que les equacions diferencials es poden aplicar a molts àmbits diferents. El títol podria ser alguna cosa com ara: Equacions diferencials per tot arreu: de com el càlcul infinitesimal resol problemes en tots els camps del coneixement

De fet he pensat un guió per al llibre, seria alguna cosa com ara:

Fı́sica

  • Problemes clàssics: la molla i el pèndol
  • Dinàmica de coets. Equació de Tsiolkovski
  • Isòtops radioactius

Biologıia

  • Ecologia de poblacions
  • Teorıia de l’evolució
  • Hàbits d’alimentació en poblacions animals

Sociologia

  • La ciència de l’amor
  • Sistemes de votació, dinàmica de partits polı́tics

Economia

  • Evolució dels preus
  • Crisi financera

Matemàtiques

  • Equació de la corda pesant: la catenària
  • La braquistòcrona i la tautòcrona

Medicina

  • Dinàmica dels tumors
  • Modelitzar el càncer: competència i selecció natural

Electrònica

  • Càrrega del condensador. Oscil·ladors LC, RLC
  • Unió PN, difusió de portadors

Quı́mica

  • Dinàmica de les reaccions quı́miques
  • Intercanvi de calor

Fluids

  • Llei de Torricelli
  • Mecànica de fluids. Coeficient de resistència

Sistemes complexos

  • Caos
  • Fractals

He estat treballant en varis capítol. Per exemple, en La ciència de l’enamorament s’analitza un cas de com una parella tenen un comportament diferent davant de l’enamorament, que es pot modelitzar amb una equació diferencial. I com a resultat de resoldre el problema, el resultat podria ser (en funció de les condicions inicials i del valor dels paràmetres), un estira-i-arronsa cíclic en la manera com senten l’atracció mútua.

En qualsevol cas el problema no és original (com els altres que es presenten en el guió que són, de fet, problemes bastant clàssics), però sí que se li vol donar un to personal, i a més es vol donar tot el codi python i la generació de les gràfiques que es presentaran en els articles.

Pots descarregar aquest capítol en el següent enllaç:

Equacions diferencials. MDF: Mètode de les diferències finites

En anàlisi numèrica, el mètode de les diferències finites és un mètode utilitzat per calcular de manera aproximada les solucions a les equacions diferencials usant equacions diferencials finites per aproximar derivades.

En aquest article hem fet una introducció i una exposició aclaridora sobre aquest mètode bàsic de càlcul numèric per a la resolució d’equacions diferencials, i ho hem aplicat a l’exemple de la balística, en tres supòsits: projectil sense fregament; fregament proporcional a la velocitat; i fregament proporcional al quadrat de la velocitat.