Robitex's Blog

Ideas in the web

Archivi Mensili: maggio 2011

Plot della funzione Gamma con matplotlib


Scarica l’articolo in formato pdf

Abstract

Utilizzando alcune librerie Python di calcolo numerico utilizzeremo il pacchetto matplotlib per disegnare il grafico della funzione Gamma di Eulero. Questa infatti è la funzione scelta per introdurre questo interessante ambiente di computazione e visualizzazione, integrato e circoscritto all’interno del linguaggio Python.

Lo scopo è quello di mostrare le capacità di questo software libero e dare un idea delle caratteristiche di un linguaggio testuale basato su Python per il calcolo e la visualizzazione tecnico-scientifica.

Numeri, numeri ed ancora numeri per Python

Il linguaggio Python è particolarmente portato per i numeri. Lo dimostra questo piccolo e classico esempio in cui si calcola il fattoriale di un numero intero elevato.
Il fattoriale non è altro che il prodotto di tutti i numeri da 1 ad n e può essere calcolato da una funzione ricorsiva. Ecco l’esempio di codice:

def fact(n):
    if n==1:
        return 1
    return n * fact(n-1)

print(fact(100))

Salvato il file contenente il codice con il nome fact.py , per eseguirlo aprire una finestra di terminale e digitare $ python fact.py. Sarà immediatamente mostrato a video un numero di 158 cifre. Nello screenshot seguente vi ho riportato l’esecuzione di fact.py posizionato nel mio caso nella cartella Scrivania:

Esecuzione dello script Python per il fattoriale di 100

Esecuzione dello script Python per il fattoriale di 100

È preferibile riscrivere il codice senza copiarlo per rendersene meglio conto, inoltre ricordatevi che se non vogliamo digitare il percorso completo del nome del file da eseguire, la directory di lavoro del terminale o della console di Windows, deve essere la stessa di quella in cui si trova il file. Per settare la directory di lavoro, e quindi spostarsi nell’albero del file system, basta usare il comando cd (che sta per change directory) seguito dal nome della directory.

Ultima cosa da ricordare, questa volta agli utenti Linux, è l’assegnazione agli script Python dei permessi di esecuzione, per esempio semplicemente spuntando il flag Esecuzione nella scheda Permessi del dialogo Proprietà del file stesso.

Preparazione del sistema

In Ubuntu installare i file necessari per svolgere l’esercizio proposto è semplice perché l’interprete Python è pre-installato di default mentre le librerie matplotlib e scipy si installano sul sistema con i due comandi (la libreria numerica numpy è una dipendenza obbligatoria del pacchetto python-matplotlib e non è necessario richiederne l’installazione esplicitamente):

$ sudo apt-get install python-matplotlib
$ sudo apt-get install python-scipy

Per gli utenti Windows serve un po’ più di tempo ma mutatis mutandis, non è difficile seguire le procedure d’installazione di Python e delle librerie numeriche indicate. La documentazione è ottima.

matplotlib plotting example

La libreria matplotlib funziona allo stesso modo di Matlab: la curva di una funzione è disegnata unendo un insieme di punti del piano le cui coordinate sono definite da un set di valori del dominio della funzione e dai corrispondenti valori calcolati nel codominio.

Quello che dobbiamo fare è scrivere un programma in Python che utilizzi motori numerici e di visualizzazione sotto forma di librerie

Consideriamo un esempio di plot di funzione per f(x)=sen^2(x). Il set di valori sull’asse x saranno i 100 punti egualmente intervallati da 0 a 2\pi: setx = np.linspace(0, 2*np.pi, 100), dove np è l’oggetto che fa riferimento alla libreria numpy definito con un precedente import numpy as np (il nome assegnato è una sorta di scorciatoia).
Il plottaggio avviene utilizzando il metodo plot dell’oggetto matplotlib.pyplot, a cui passiamo il set di valori sull’asse x ed i corrispondenti ordinate sull’asse y calcolate con la funzione seno al quadrato: plt.plot(setx, np.sin(setx)**2) dove plt è l’oggetto che fa riferimento alla libreria matplotlib.pyplot definito con import matplotlib.pyplot as plt.

Non rimane che esercitarci sul codice completo del programma che genererà un file pdf, quindi un file di qualità vettoriale che scalato non perderà risoluzione:

#!/usr/bin/python

import numpy as np
import matplotlib.pyplot as plt

setx = np.linspace(0.0, 2*np.pi, 100)
plt.plot(setx, np.sin(setx)**2)

plt.savefig('sen2plt.pdf')
Il grafico della funzione seno al quadrato (click to download the pdf)

Il grafico della funzione seno al quadrato (click to download the pdf)

Sul manuale troverete le usuali proprietà per personalizzare il grafico come etichette compreso testo in codice LaTeX per il typesetting matematico, spessori e colori, griglie, ecc. Le lavorazioni sui sorgenti assomigliano operativamente a quelle degli altri tool di visualizzazione come Matlab stesso o Gnuplot, ma con i vantaggi di un linguaggio ad oggetti intuitivo. Occorre solo l’abitudine ad orientarsi tra i moduli delle librerie.

Esiste anche la possibilità di visualizzare il grafico in una finestra grafica. Non seguiremo questa strada perché interattiva per l’utente e quindi poco adatta ad essere descritta in una guida. Dico solo che per usufruire di questa modalità basta sostituire nell’ultima istruzione il metodo savefig(‘nomefile’) con show().

The Gamma function

La funzione \Gamma fu trovata da Eulero su sollecitazione di Christian Goldbach e rappresenta il fattoriale di un numero reale (od anche complesso). Si tratta quindi di una sorta di estensione del calcolo del fattoriale di un numero intero infatti per essi sussiste la seguente relazione:

\displaystyle \Gamma(n+1)=n!

La definizione standard della funzione Gamma di Eulero è la seguente:

\displaystyle \Gamma(z)=\int_0^\infty e^{-t} t^{z-1}\, dt

Per conoscere ulteriori dettagli matematici visitate la classica pagina di Wikipedia o quella di MathWorld.

matplotlib plots Gamma

La funzione \Gamma è stata implementata nel modulo speciale della libreria scipy. Il nostro obbiettivo meno ambizioso quanto a visualizzazioni 3D nel piano complesso, è tracciare il grafico per un dominio reale ed evidenziare i punti sulla curva corrispondenti ai fattoriali dei numeri interi.
Ma la funzione \Gamma non si domina facilmente. Giustamente matplotlib non disegna punti a distanza infinita, quindi occorre gestire le discontinuità ovvero i valori infiniti che essa assume per 0 e per i numeri interi negativi, appiattendo i valori della funzione quando superano un range scelto opportunamente e molto al di fuori dei limiti del grafico (questo per la verità va fatto per qualsiasi altra funzione con asintoti verticali nell’intorno dei quali i valori diventano ovviamente elevatissimi).
Poi occorre infittire molto i punti in cui calcolare \Gamma altrimenti nel grafico compariranno dei rami parassiti nei pressi degli asintoti verticali.

Passo infine la parola al codice:

#!/usr/bin/python

# import delle librerie necessarie
import numpy as np
from scipy.special import gamma as Gamma
import matplotlib.pyplot as plt

# definizione dei limiti del grafico
# per il facile 'aggiustamento'
x0, x1 = -5.0, 5.2
y0, y1 = -6.5, 7.0

# dominio lineare sull'asse x
x = np.linspace(x0, x1, 50000)

# dominio numeri interi
xx = [2,3,4]

# creazione dei vettori di ordinata
y = Gamma(x)
yy = Gamma(xx)

# 'gestione' delle discontinuita
ulim = 100*y1
llim = 100*y0
y[y>ulim] =  np.inf
y[y<llim] = -np.inf
# plottaggio della Gamma
plt.plot(x, y)

# aggiunta dei punti notevoli del fattoriali
# l'opzione 'ro' si riferisce a singoli caratteri:
# r = red , o = pallino
plt.plot(xx, yy , 'ro')

# limiti sugli assi
plt.axis([x0, x1, y0, y1])

# tracciamento di una griglia base
plt.grid()

# creazione del file pdf con il grafico
plt.savefig('gammaplt.pdf')
Grafico della Gamma di Eulero (click to download the pdf file)

Grafico della Gamma di Eulero (click to download the pdf file)

Conclusioni

Secondo me bene si fa a tener conto delle librerie Python introdotte in questo post. Basta dare un occhiata ai numerosi talk ai meeting europei di Scipy.
Impara l’arte e mettila da parte…

Inviare pdf in modo sicuro


Attenzione: la procedura di messa in sicurezza di un pdf utilizzando la cifratura interna sembra essere non molto sicura.
Provvederò quindi ad aggiornare il post. Grazie.

Scarica l’articolo nel formato pdf per la stampa

Il problema

Con la diffusione di internet lo scambio di documenti avviene sempre più spesso tramite il servizio base della posta elettronica. Tuttavia i messaggi e-mail non sono sicuri ed i documenti che un tempo venivano consegnati o ritirati a mano con la sicurezza della fisicità, oggi possono essere letti da terzi con la violazione dei messaggi digitali che transitano su connessioni internet non protette.

Pensiamo al caso di una piccola azienda od un artigiano che ogni mese riceve nel formato PDF i moduli di pagamento F24 od i cedolini delle buste paga dei propri dipendenti dall’ufficio del commercialista.

Quasi sicuramente il testo del messaggio e-mail conterrà la classica dicitura sulla protezione dei dati personali secondo la legge sulla privacy, ma i documenti PDF allegati saranno invariabilmente in chiaro!!!

Cosa possiamo fare? Tornare a visitare i vari uffici per raccogliere di persona i documenti cartacei? Saremo costretti a prendere l’auto impiegando tempo ed inquinando ulteriormente l’ambiente urbano, anche se ne gioverebbero i rapporti interpersonali (il computer ci fa vivere in un mondo cerebrale…).

Una soluzione

La soluzione più robusta è quella di blindare il messaggio di posta elettronica garantendo non solo l’integrità dell’e-mail ma anche la sicurezza sull’identità del mittente. Ci si può rivolgere per esempio a software come GNUPG che fa esattamente quello che serve e di cui potete trovare una splendida guida in italiano di Mario Pascucci sempre valida e completa sia per Windows che per Linux.

Per usare GNUPG è necessario creare una coppia di chiavi, quella pubblica e quella privata, creare una password phrase per la sicurezza locale del sistema, utilizzare il sistema di server per l’upload della chiave pubblica, ed accertarsi fisicamente che la chiave pubblica del proprio corrispondente appartenga effettivamente a lui. Da quel momento sarà possibile crittografare i messaggi e pure firmarli digitalmente.

Tuttavia questo sistema mi sembra un po’ troppo. Direi quindi di sacrificare un po’ di sicurezza ma di acquistare semplicità concettuale rinunciando alla certezza del mittente del messaggio.

Una soluzione più comoda

Assumendo di voler trasmettere solo file PDF, li blinderemo con l’utility libera pdftk. Ecco quel che dovremo fare: preparare i due PC di mittente e destinatario e costruire una password robusta nota solo ad entrambi e cifrare/decifrare i documenti.

Se solo al mittente ed al destinatario è nota la password e se il destinatario riesce a decifrare correttamente il file pdf contenuto nel messaggio, allora possiamo ragionevolmente supporre che solamente i due soggetti hanno avuto accesso al messaggio (e quindi la comunicazione è sicura), e che il nostro mittente sia effettivamente colui che ha spedito il messaggio.
Diversamente vorrà dire che la password sarà stata violata in qualche modo. Dunque è essenziale che la password sia robusta e nota solo agli interessati, altrimenti tutta la procedura verrà inficiata.

Preparare il PC

Per preparare il PC basta installare pdftk. Assumendo che il sistema sia un pc Ubuntu è sufficiente digitare il comando:

sudo apt-get install pdftk

Anche per gli utenti Windows l’installazione è semplice: è sufficiente seguire la procedura descritta alla pagina ufficiale del pacchetto (si tratta di scaricare un file e scompattarlo in una cartella opportuna).

Scambiarsi la password

Una volta costruita una password robusta, per esempio ‘g456Wsa+dh’, annotatela su un foglio e recatevi di persona dal vostro corrispondente. Questo passaggio è essenziale perché come già detto, dalla sicurezza di questa password dipenderà la sicurezza di tutti i vostri documenti contenuti nei messaggi e-mail.
Se il corrispondente è geograficamente lontano potreste ricorrere al telefono od alla posta, con le modalità fantasiose che si possono inventare divertendosi (per esempio una specie di caccia al tesoro in cui la password viene suddivisa in due o tre tronconi e trasmessa con mezzi fisici diversi assieme alle istruzioni di montaggio, ma solo se il corrispondente mostra spirito goliardico).

Procedura operativa: cifratura

Sia mydoc.pdf il file pdf da trasmettere allora per cifrarlo a 128 bit aprite il Terminale (o la finestra di console di Windows) e digitate il comando:

pdftk mydoc.pdf output cryptmydoc.pdf owner_pw g456Wsa+dh user_pw IlMioNome

Fatto.

Si tratta di una normale sintassi per utility a linea di comando dove gli argomenti separati da spazi seguono il nome del comando da lanciare e sono strutturati in un primo gruppo costituito dal file di input e da un secondo gruppo composto dal nome da dare al file di output con le opzioni, separati dalla con la chiave ‘output’. Volendo elencare la sintassi potremo costruire l’elenco degli argomenti:

1 – il nome del file pdf da cifrare (nel nostro esempio mydoc.pdf);
2 – la chiave ‘output’;
3 – il nome del file cifrato (tipo ‘crypt_mydoc.pdf’) al quale va applicata la protezione con password (opzione owner_pw seguita dalla password) e l’attribuzione all’utente (opzione ‘user_pw’ seguita dal nome utente).

Procedura operativa: decifratura

Dal punto di vista del destinatario, una volta ricevuta l’e-mail con il documento pdf cifrato, potrà o aprirlo direttamente inserendo la password o riportarlo in chiaro per un utilizzo successivo più agevole, con il comando:

pdftk cryptmydoc.pdf input_pw g456Wsa+dh output mydoc.pdf

Finito.

Anche per questo comando un commento: il primo gruppo di argomenti è costituito dal file da decifrare seguito dall’opzione ‘input_pw’ a cui far seguire la password (altrimenti pdftk non potrà operare sul documento), mentre il secondo gruppo sempre separato dal primo con la chiave ‘output’, è semplicemente il nome da dare al pdf decifrato.

Alcuni screenshot dell’operazione

Ecco cosa viene mostrato se apriamo con Evince, il lettore di pdf predefinito in Ubuntu, un file pdf cifrato:

La richiesta della password per aprire il pdf cifrato con pdftk

La richiesta della password per aprire il pdf cifrato con pdftk

Nel seguente screenshot potete osservare una sessione di terminale per la cifratura ed una decifratura di un file pdf in Linux Ubuntu:

pdftk al lavoro nel terminale di Ubuntu

pdftk al lavoro nel terminale di Ubuntu

Nell’immagine seguente invece vi ho riportato il dialogo di proprietà di Acrobat Reader relativo ad un file cifrato con pdftk dove è chiaramente leggibile che ci troviamo davanti un documento blindato con cifratura a 128bit.

Il pdf è proprio blindato!

Il pdf è proprio blindato!

Evoluzione

Naturalmente vi sono modi di rendere il processo più comodo ed user friendly che convengono solo se si hanno un gran numero di file da gestire con destinatari diversi ognuno con password distinte. Penso per esempio ad un utility di spedizione ad interfaccia grafica che sfrutti un database, cifri i pdf, esegua gli invii dei documenti per e-mail e registri le trasmissioni. Con qualcosa del genere l’intera procedura diventerebbe non solo molto più sicura e professIonale ma anche molto più rapida ed efficiente rispetto alle soluzioni manuali caso per caso in chiaro.

Per approfondimenti sulle opzioni di cifratura offerte da pdftk consultate il suo manuale, mentre per il resto potete commentate il post per riportare esperienze e suggerimenti.
Bene, direi che siamo giunti al termine per cui vi saluto augurandovi buon lavoro!!!

Un brindisi matematico…


Una risposta estremamente difficile

Ecco la domanda:

Se brindano n persone quanti cin faranno i loro bicchieri?

Una domanda certamente fondamentale per il proseguo la cui risposta necessita di impegno estremo.

Sia B(n) la funzione che fornisce il risultato, allora considerando il punto di vista di un singolo partecipante al brindisi, egli effettuerà un cin cin con tutti gli altri ovvero n-1 tocchi e lui potrà dirsi soddisfatto. Rimarranno allora i brindisi seguenti:

\displaystyle B(n) = n-1 + B(n-1)

Applicando lo stesso ragionamento al gruppo rimanente, di fatto un ragionamento ricorsivo, dovranno essere ancora compiuti B(n-1)=n-2+B(n-2) brindisi.

Si finirà di brindare quando rimarranno due sole persone che faranno un unico tocco, allora:

\displaystyle B(n) = \sum_{i=1}^{n-1} i

Il risultato è che il numero dei brindisi in un gruppo di n persone è la somma dei numeri da 1 a n-1. Per esprimere la somma con una semplice espressione seguiamo il ragionamento del giovanissimo Gauss.
Su n, sommiamo il primo termine, ovvero il numero 1 e l’ultimo termine quindi n ed otteniamo naturalmente 1+n. Così facciamo per il secondo ed il penultimo termine della somma 2+(n-1)=1+n. Alla fine la somma è sempre il termine n+1 moltiplicato per le coppie il cui numero è n/2 ovvero:

\displaystyle (n+1)\frac{n}{2}

Tornando al numero dei brindisi fra n persone, dovremo sostituire alla relazione precedente ad n il termine n-1 ottenendo il risultato tanto atteso:

\displaystyle B(n)=n\frac{n-1}{2}

Altro percorso di dimostrazione

La cosa si fa più interessante se immaginiamo i brindisi tra le persone come rami di relazioni. questo punto di vista non si riferisce alla singola persona come quello precedente ma all’insieme intero delle relazioni.

Tutte le relazioni tra n persone, possono essere rappresentate in una griglia quadrata n \times n dove le righe e le colonne sono riferite a tutte le singole persone.
Così per esempio la cella della riga relativa alla persona A e della colonna relativa alla persona B, rappresenta il brindisi tra la A e B.

Ogni cella rappresenta una relazione di brindisi ma dobbiamo escludere quelle che si trovano sulla diagonale principale della griglia (quelle in cui la persona sulla riga è la stessa di quella della colonna) perché è escluso che si possa contare anche il brindisi con se stessi.

Delle celle rimanenti ne possiamo considerare tuttavia solo la metà perché se esiste la relazione di brindisi A \to B esisterà anche la relazione B \to A sulla griglia ma delle due ne possiamo conteggiare solo una perché si tratta delle stesso brindisi (ramo di relazione non orientato).

Una rappresentazione grafica della griglia è riportatata di seguito per 5 persone denominate da A a E, dove col pallino rosso sono evidenziate le celle di auto-relazione mentre con i quadratini verdi e blu sono evidenziate le relazioni doppie da contare solo una volta.

La griglia dei brindisi

La griglia dei brindisi

Alla fine ritroviamo elegantemente la relazione per il conteggio dei brindisi tra n persone:

\displaystyle B(n)=\frac{n^2-n}{2}.

Con questo punto di vista il numero dei brindisi non è altro che il numero delle celle della griglia che si trovano sotto oppure sopra alla diagonale principale (il numero dei quadratini di uno stesso colore se ci riferiamo all’immagine presentata che potete scaricare nel formato pdf da qui, se invece vi interessa il codice che l’ha generata consultare questo post sul forum del GuIT).

Epilogo

Se alla prossima festa siete in 12 preparatevi dunque a 66 rintocchi di bicchieri!
Alla salute!!!

L’esplosione di Caina


Salire sulla montagna di detriti

I tre edifici di Caina sono stati demoliti con circa 75 kg di microcariche di tritolo sabato 14 maggio 2011 alle 15:05.

Il filmato quì sotto girato da un mio collega in posizione migliore della mia (grazie…), mostra l’evento a cui hanno assistito in molti e che ha provocato in molti emozioni forti.
Emozioni e pensieri sulla storia recente della città di Carrara, su un quartiere testimone del passato e presenza urbana da 60 anni, imploso in meno di due secondi.
Ma è assistere al fatto in se che suscita a mio avviso l’emozione più grande perché in fondo si tratta della morte istantanea, quasi un esecuzione, dovuta all’uso dell’esplosivo, di edifici che sono stati la casa di tante famiglie.
E allora fa effetto. Una stretta al cuore. Solo dopo nuove emozioni di affacciano, quelle dell’orgoglio.

TeX, bello ed affidabile


Felicità

Sono proprio contento di TeX, un programma che ha già più di 32 anni di storia. I motivi derivano dall’esperienza nell’averlo utilizzato ormai dal 2007, quindi da quattro anni, per produrre ogni sorta di documenti, dalla lettera in serie ai fax, attività di “comunicazione epistolare”, ai documenti più importanti come le relazioni tecniche di progetto.

Soddisfazione

E proprio stamani un fatto conferma e testimonia ciò che offre TeX, professionalità dei documenti, forma tipografica impeccabile, vantaggi nella gestione informatica dei contenuti digitali (file di testo, immagini, grafica vettoriale, PDF ecc), ma anche affidabilità.
Un collega infatti, nel mezzo della mattinata, ha prodotto una specie di urlo, variegato e difficile da descrivere tipo “NOOoooOOoooOOO…” che si è diffuso per il corridoio, dovuto alla perdita di un documento scritto in Word (R) divenuto un ammasso di caratteri alieni. Peccato.

Affidabilità

Con TeX questo è assai difficile che si verifichi, infatti si gestiscono i dati nel formato più universale ed affidabile che si conosca: essenzialmente testo puro ASCII, che non solo garantisce di rimanere leggibile anche nel futuro, ma consente all’utente di adoperare un numero sbalorditivo di programmi diversi, da Blocco Note di Windows, agli editor più geek di Linux, come Vi ed Emacs, per la lettura.
Non c’è pericolo che il programma faccia a pezzi il file del documento ne che spariscano i programmi in grado di leggere i file. È questo che chiamo affidabilità.

Continuità

Se uso TeX e LaTeX da quattro anni, sono anche autorizzato, oltre che a sfoggiare un sorrisetto diciamo beffardo mentre allargo le braccia confermando che la relazione, il mio collega, la deve proprio riscrivere, a lanciare questo messaggio:

utilizzate TeX e compagni anche in ambito lavorativo ovunque voi siate e qualunque cosa stiate scrivendo!!!

In primis quelli che hanno scritto la tesi con LaTeX e che poi hanno ripiegato per strumenti più “visuali” e “veloci”, ma anche gli altri che devono redarre lettere aziendali, fatture od appunti, presentazioni ed insomma, tutto quello che deve essere, in una parola, professionale.

Dedica sorridente a:

Dedicato a tutti gli utilizzatori di TeX, che sanno come apprezzare le sfumature del sorriso e che forse si sanno spiegare quello enigmatico della Gioconda di Leonardo…

%d blogger hanno fatto clic su Mi Piace per questo: