M’està rondant el cap fer una sèrie d’experiments captant dades amb sensors i processant les dades a l’ordinador. Espero parlar-ne aviat, hi ha bastantes idees xul·les que es poden desenvolupar. Aquí va una petita mostra. I una de les tècniques claus per fer tot això que vull fer és enviar pel protocol sèrie les dades del sensor (arduino) a un programa C++ que s’està executant a l’ordinador.
En la foto es pot veure com es recull les dades del sensor a l’ordinador. Les dades es van gravant en un fitxer, i es poden processar a posteriori. En aquest cas tinc un sensor LDR que capta la llum solar, i es tracta de veure com decau la il·luminació a mida que es fa fosc. Quin comportament tindrà? L’estat inicial és assimptòtic (il·luminació plena), i l’estat final també (foscor). Què passa pel mig? Sabem que a la natura no li agraden els canvis bruscos. Hem d’unir les dues rectes amb una corba. Això ens dóna una corba sigmoide, en la qual hi hauria un punt d’inflexió de canvi màxim en el decreixement de la il·luminació? Serà cert aquest comportament, aquest model matemàtic? Anem a comprovar-ho.
Un cop tenim el fitxer amb les dades, les processarem amb les llibreries científiques numpy i scipy de Python. Com podem veure en el codi, es proposa una línia de màxim ajustament de tipus sigmoide. I efectivament obtenim una bona solució i un bon ajustament com es pot veure en la gràfica. En aquest cas, l’equació obtinguda és:
y =987.24 * (1 / 1 + exp(-0.07*(x-393.87))) +-8.02
No hem de fer massa cas a les dades de l’eix de les X, són tan sols punts. Senzillament tenir en compte que la distància entre punts són 30 segons.
Aquesta és una senzilla i bona demostració d’estiu (un divertimento) de què la natura es descriu amb funcions matemàtiques. Les mates són una bona eina per descriure el comportament de la naturalesa. I que els fenòmens exponencials són inherents a la Física.
Aquest últim any he estat estudiant mètodes numèrics i les llibreries científiques de Python, i realment hi veig un munt de possibilitats, que vull anar explorant aquest curs que començarà d’aquí poc.
# -*- coding: utf-8 -*-
#cel·la LDR que ha gravat com decau la llum al capvespre.
#La funció que s’ajusta a les dades és una sigmoideimport numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fitdef sigmoid(x, a, b, c, d):
y = c / (1 + np.exp(-b*(x-a))) + d
return yy = np.loadtxt(‘../dades/LDR_capvespre.txt’)
x = np.linspace(1,len(y),len(y))
#print (x)
#print (len(x))popt, pcov = curve_fit(sigmoid, x, y, p0=[350, 0.001,1000, 2]) #és necessari ficar uns bons paràmetres inicials
print popt
print (‘y =c * (1 / 1 + exp(-b*(x-a))) +d ‘)
print (‘y =’ + ‘%.2f’%popt[2] + ‘ * (1 / 1 + exp(‘ + ‘%.2f’%popt[1] + ‘*(x-‘ + ‘%.2f’%popt[0] + ‘))) +’ + ‘%.2f’%popt[3] )plt.figure()
plt.plot(x, y, ‘k’, label=”Original Noised Data”)
plt.plot(x, sigmoid(x, *popt), ‘r-‘, label=”Fitted Curve”)plt.legend()
plt.show()# Resultat:
#y =c * (1 / 1 + exp(-b*(x-a))) +d
#y =987.24 * (1 / 1 + exp(-0.07*(x-393.87))) +-8.02
- Funció sigmoide a la viquipèdia: https://es.wikipedia.org/wiki/Funci%C3%B3n_sigmoide
- Sensor LDR a la viquipèdia: https://ca.wikipedia.org/wiki/LDR