Personal Genomics

Personal Genomics

Whole Genome Sequencing was performed on the proband (me!) and three healthy family members: one paternal uncle and two maternal aunts. First-degree relatives were not available. Paired-FASTQ files were inputted to a GATK pipeline, according to GATK best practices workflows (R). After the generation of unmapped BAM from paired-FASTQ, a BAM file was obtained for each participant. The four GRCh38 BAM files were then submitted to joint variant calling along with other 50 genomes from the 1000 Genomes Project, used to maximize the signal/noise ratio. These analyses were all performed on the NHGRI AnVIL platform that offers virtual machines with optimized GATK configuration.

The resulting gVCF was submitted to Seqr for family filtering. Family filtering based on a dominant pattern of inheritance was performed with a threshold of zero for both QUAL and allele balance (quality filtering is performed in a following step). The result was downloaded and submitted to a custom R script (reported at the end of this page). The script filters out variants harbored by genes with a probability of being dominant below 0.5 (DOMINO score); it also eliminates calls with QUAL below 30. It then collects the remaining calls in a VCF file for submission to CADD GRCh38 v1.7 (R). The file containing the scores is then inputted again to the script that adds them to the Seqr output. Filtering is then performed as follows: the script retains only calls with CADD≥22.8, Eigen≥0, PolyPhen≥0.45, and SIFT≤0.05. Filtering is performed only when scores are available: so, for instance, a call with no available scores is kept.

Table. Results of Seqr permissive De Novo Dominant search on WGS, after filtering performed by my R script (see below). In the WES column: NA indicates that the variant is not present in the VCF file of WES, which can be due either to the fact that the position was not genotyped or to the fact that it was found homozygous for the reference allele; Y indicates that the position is present in WES with the same genotype. Same for 23&ME.

This pipeline selects four variants (see table). Two of them are present in a whole-exome performed on the proband, too. The other two are not present on WES and since only the VCF file is available for WES, we cannot say if they are absent because they were not genotyped or because the proband is homozygous for the reference allele. I then used reactome.org to select for each gene the pathway where its protein is involved in the higher number of reactions. Only CIC was not included in any pathway by Reactome, but it has been recently reported the involvement of CIC in folate transport into the brain and a few rare mutations in this gene have been proposed as causative for cerebral folate deficiency (R). None of the variants of the table has been associated with known diseases. The mitochondrial chromosome was analyzed by a custom R script, as detailed elsewhere (R), and nothing relevant was found. I’m currently performing further studies on these results and I am analyzing the structural variants of the proband.

# file name: Seqr_Dominant
#
# Rome 09th December 2023
#
#-------------------------------------------------------------------------------
# This script filters the results of Seqr's De Novo/Dominant Restrictive search
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
# Thresholds
#-------------------------------------------------------------------------------
#
co_CADD<-22.8 # a CADD phred score below co_CADD is considered tolerated 
co_Eigen<-0 # a Eigen score below co_EIGEN is considered tolerated
co_PolyPhen<-0.45 # a PolyPhen score below co_PolyPhen is considered tolerated
co_SIFT<-0.05 # a SIFT score ABOVE co_SIFT is considered tolerated
#
PAD<-0.5 # Cut-off for probability of being Autosomal Disease (PAD) 
#
co_Qual<-30 # threshold for quality score
#
#-------------------------------------------------------------------------------
# This function adds the probability of being a dominant gene
#-------------------------------------------------------------------------------
#
DOMINO<-function(variants) {
  #
  # Read the genes with their relative Domino probabilities 
  #
  genes<-read.csv(file="C:/Users/macpa/OneDrive/Appunti/Genetics/Domino/DOMINO_GENEID_feb_2019.txt",sep="\t")
  colnames(genes)<-c("SYMBOL","gene","Domino")
  #
  # For each variant assign the DOMINO score of its gene (if any)
  #
  string<-"SYMBOL"
  if (substr(variants$gene[1],1,4)=="ENSG") string<-"gene"
  variants<-merge(variants,genes,by=string,all.x=T)
}
#
#-------------------------------------------------------------------------------
# This function generates a VCF file for CADD submission
#-------------------------------------------------------------------------------
#
VCF<-function(variants) {
  #
  variants<-variants[,2:5]
  variants$id<-rep(".",length(variants[,1]))
  temporary<-c("chrom","pos","id","ref","alt")
  variants<-variants[,temporary]
  write.table(variants,file="DeNovoDominant_permissive.vcf",quote=F, 
              row.names=F,col.names=F,sep="\t")
}
#
#-------------------------------------------------------------------------------
# Read the seqr file and assign the domino probability
#-------------------------------------------------------------------------------
#
seqr_dom<-read.csv(file="DeNovoDominant_permissive.tsv", sep="\t", header = TRUE)
#
seqr_dom<-DOMINO(seqr_dom)
#
#-------------------------------------------------------------------------------
# Remove variants based on their Domino probability and quality  
#-------------------------------------------------------------------------------
#
seqr_dom<-subset.data.frame(seqr_dom, Domino>=PAD | is.na(Domino)==T )
#
seqr_dom<-subset.data.frame(seqr_dom, gq_1>=co_Qual)
#
#-------------------------------------------------------------------------------
# Write file for CADD submission
#-------------------------------------------------------------------------------
#
VCF(seqr_dom)
#
#-------------------------------------------------------------------------------
# Read file after CADD submission
#-------------------------------------------------------------------------------
#
f.name<-gzfile("DeNovoDominant_permissive_CADD.tsv.gz")
CADDed<-read.csv(file=f.name,sep="\t",skip=1,comment.char=" ")
colnames(CADDed)<-c("chrom","pos","ref","alt","rawscore","cadd")
#
#-------------------------------------------------------------------------------
# Add cadd score
#-------------------------------------------------------------------------------
#
seqr_dom<-merge(seqr_dom,CADDed,by=c("chrom","pos","ref","alt"),all.x=T)
#
#-------------------------------------------------------------------------------
# Remove variants based on their in silico scores
#-------------------------------------------------------------------------------
#
seqr_dom<-subset.data.frame(seqr_dom, cadd.y>=co_CADD | is.na(cadd.y)==T )
seqr_dom<-subset.data.frame(seqr_dom, eigen>=co_Eigen | is.na(eigen)==T )
seqr_dom<-subset.data.frame(seqr_dom, polyphen>=co_PolyPhen | is.na(polyphen)==T )
seqr_dom<-subset.data.frame(seqr_dom, sift<=co_SIFT | is.na(sift)==T )
#
#-------------------------------------------------------------------------------
# Write output
#-------------------------------------------------------------------------------
#
write.table(seqr_dom,file="DeNovoDominant_permissive_filt.tsv",quote=F,row.names=F,col.names=T,sep="\t")

La Pantera

La Pantera

Traduzione della poesia omonima di Jorge Luis Borges, pubblicata la prima volta nella raccolta El oro de los tigres, nel 1972. Pur conservando il contenuto di ciascun verso, ho stravolto le parole e cambiato lo schema delle rime, isolando due quartine e due terzine.

Sull'eterna barriera la pantera 
ripeterà l'ispezione rituale 
che per sempre sarà la sua galera,
pendolo di gioia buia e letale. 
Passano mille vite oltre le sbarre
e nessuna, rimane sola e uguale
la pantera che unica può protrarre  
la rincorsa di Achille, immortale:
la distanza infinita in una cella.
Non ha mai avuto il mondo oltre la gabbia,
la carne di una tenera gazzella
che avrebbe soddisfatto la sua rabbia.
Invano offre tante strade la vita,
i suoi giorni sono grani di sabbia. 

La poesia di Borges, che si può leggere qui, pare attingere esplicitamente alla omonima lirica di Rilke del 1903, dove ritroviamo una pantera in cattività. La ispezione psicologica anche si sofferma su considerazioni analoghe. In entrambi i casi il rapporto con il mondo esterno è di completa rimozione: <<und hinter tausend Stäben keine Welt>>, nella versione icastica di Rilke; “No sabe que hay praderas y montañas\De ciervos cuyas trémulas entrañas\Deleitarían su apetito ciego“, nella interpretazione più ariosa e patetica dello scrittore argentino. Entrambi gli autori adottano poi l’idea della moltiplicazione delle barre, che il moto oscillatorio dell’animale rende infinite. Per Rilke è “Ihm ist, als ob es tausend Stäbe gäbe“; Borges invece evoca, se non mi inganna, un paradosso di Zenone, quello di Achille e della tartaruga, che per la pantera si traduce in una evasione impossibile. La corrispondenza fra la serie convergente che risolve il paradosso e la realtà cinematica della pantera non è naturalmente del tutto puntuale, perché la fiera percorre sempre lo stesso segmento, all’infinito, mentre il semidio se ne trova davanti uno via via più corto. Sarebbe più attinente la metafora del pendolo ideale, che ho provato a inserire nella mia versione. Ma ad ogni modo trovo l’immagine borgesiana una meravigliosa illuminazione. Nonostante tutto però, la poesia di Rilke sembra più efficace, almeno al mio accesso indiretto, data la mia ignoranza del tedesco; perché non necessita la protesica di questi riferimenti dotti: gode di completa autonomia. Inoltre Rilke, molto meglio di Borges, descrive la follia apatica in cui si cristallizza la volontà felina nella cattività impietosa, con una profondità ed esattezza psicologica unica forse nella letteratura. Per me, mentre Borges esegue egregiamente un esercizio poetico sulla traccia di Rilke, Rilke immortala un destino terribile e possibile, per sempre e per tutti, in una soluzione che è difficile migliorare. Nella competizione tra il vecchio poeta di Buenos Aires e il boemo neanche trentenne, per me vince il lampo di intuito giovanile.

Quella che segue è una traduzione mia dei versi di Rilke, in cui conservo lo schema delle rime e delle strofe originali. La versione mantiene l’associazione fra versi e contenuto, ma si svincola dalla completa aderenza letterale, che sarebbe del resto resa difficile dal duplice vincolo dell’endecasillabo e delle rime.

La pantera

Lo scorrere delle sbarre ha sfinito 
lo sguardo, che non trattiene più niente. 
Come se il numero fosse infinito
e oltre l'infinito, nessun presente. 

La sua andatura potente e morbida
che si volta, in quello spazio ingrato
è come danza di una forza che orbita    
attorno a un volere paralizzato.

Delle volte gli occhi seguono un'ombra
nel silenzio, che trova una via giù
nella tensione muta delle membra,
raggiunge il cuore e non esiste più.

Di seguito riporto il conteggio delle sillabe, tenendo conto delle sinalefe, e con l’indicazione degli ictus in grassetto, per la traduzione della poesia di Borges.

sul-le-ter-na-bar-rie-ra-la-pan-te-ra (11 sillabe)
ri-pe-te--li-spe-zio-ne-ri-tua-le (11 sillabe)
che-per-sem-pre-sa--la-sua-ga-le-ra (11 sillabe)
pen-do-lo-di-gio-ia-bui-ae-le-ta-le (11 sillabe)
pas-sa-no-mil-le-vi-teol-tre-le-sbar-re (11 sillabe)
e-nes-su-na-ri-ma-ne-so-laeu-gua-le (11 sillabe)
la-pan-te-ra-cheu-ni-ca-può-pro-trar-re (11 sillabe)
la-rin-cor-sa-dia-chil-le-im-mor-ta-le (11 sillabe)
la-di-stan-zain-fi-ni-tain-u-na-cel-la (11 sillabe)
non-ha-maia-vu-toil-mon-dool-tre-la-gab-bia (11 sillabe)
la-car-ne-diu-na-te-ne-ra-gaz-zel-la (11 sillabe)
chea-vreb-be-sod-di-sfat-to-la-sua-rab-bia (11 sillabe)
in-va-noof-fre-tan-te-stra-de-la-vi-ta (11 sillabe)
i-suoi-gior-ni-so-no-gra-ni-di-sab-bia (11 sillabe)

Di seguito riporto il conteggio delle sillabe, tenendo conto delle sinalefe, e con l’indicazione degli ictus in grassetto, per la traduzione della poesia di Rilke.

lo-scor-re-re-del-le-sbar-reha-sfi-ni-to (11 sillabe)
lo-sguar-do-che-non-trat-tie-ne-più-nien-te (11 sillabe)
co-me-seil-nu-me-ro-fos-sein-fi-ni-to (11 sillabe)
eol-tre-lin-fi-ni-to-nes-sun-pre-sen-te (11 sillabe)

la-su-and-a-tu-ra-po-ten-tee-mor-bi-da (12 sillabe)
che-si-vol-ta-in-quel-lo-spa-zioin-gra-to (11 sillabe)
è-co-me-dan-za-diu-na-for-za-cheor-bi-ta (12 sillabe)
at-tor-noaun-vo-le-re-pa-ra-liz-za-to (11 sillabe)

del-le-vol-te-glioc-chi-se-guo-nou-nom-bra (11 sillabe)
nel-si-len-zio-che-tro-vau-na-via-giù (10 sillabe)
nel-la-ten-sio-ne-mu-ta-del-le-mem-bra (11 sillabe)
rag-giun-geil-cuo-ree-non-e-si-ste-più (10 sillabe)

L’errore di Leopardi

L’errore di Leopardi

L’articolo può essere scaricato qui.

Giacomo Leopardi è noto soprattutto per il giardino di endecasillabi e settenari coltivato nella cornice dei primi otto lustri dell’Ottocento, l’orizzonte temporale del suo arco. Ma l’eco di quella vita, l’orma impressa dalla stampa, popola di guardie monolitiche le nostre librerie anche con una fitta prosa di trattati, tra cui una precoce ed enciclopedica Storia dell’Astronomia, di epistole, di filologia, di filosofia morale e di riflessioni tra scienze umane e naturali, ovvero i Pensieri, le Operette Morali, e le quattromila e più pagine di Zibaldone in cui tutto si embrica in un labirinto del sapere; senza contare l’affastellarsi di parole moderne da lui donate alle fatiche di Omero e di Virgilio, traducendo, entro la maggiore età, il libro primo dell’Odissea e il secondo dell’Eneide.

I Pensieri furono redatti tra il 1831 e il 1835, per lo più a Napoli, sotto le premure di Paolina, sorella acquisita per la proprietà transiva dell’affetto; in maggior parte sintesi delle scintille di etologia umana dello Zibaldone. Ma mai conclusi davvero dal poeta, furono finiti dalla sua fine, e poi fatti conoscere da una stampa postuma per i tipi di Le Monnier e per la volontà di Ranieri, nel 1845. Un catalogo di centoundici appunti di viaggio sui primati bipedi, ironici e amari, misogini e disincantati. Machiavellismo sociale, secondo una definizione dell’autore.

Nel ventesimo pensiero Leopardi ventila la possibilità di speculare, nel mondo parallelo dei paradossi, sulla pandemica diffusione del vizio degli uomini di scrivere e di voler leggere i propri ingegni letterari agli amici; propone che si istituisca “una scuola o accademia ovvero ateneo di ascoltazione; dove, a qualunque ora del giorno e della notte, essi, o persone stipendiate da loro, ascolteranno chi vorrà leggere a prezzi determinati: che saranno per la prosa, la prima ora, uno scudo, la seconda due, la terza quattro, la quarta otto, e così crescendo con progressione aritmetica. Per la poesia il doppio.

E’ prezioso qui il riferimento alla progressione aritmetica, ma è sbagliato. Infatti, una successione di termini a_1 ,\,a_2 ,\,... si chiama progressione aritmetica quando, comunque si scelga n\,>\,2, si ha:

a_n\,-a_{n-1}\,=\,r_{a}

dove r_{a} assume il nome di ragione aritmetica. Altresì, una successione si dice geometrica quando

\frac{a_n}{a_{n-1}}\,=\,r_{g}

In questo caso si parla per r_{g} di ragione geometrica. E dunque la menzionata successione di esborsi con cui tassare gli autori molesti è una progressione geometrica, non aritmetica.

Può tuttavia sorgere il dubbio che in passato le due successioni rispondessero ad altri nomi. A tal proposito, abbiamo conoscenza dei manuali di matematica presenti nella celebrata libreria del conte Monaldo Leopardi, padre di Giacomo; tra essi gli Elementi di Matematica di Vito Caravelli (1770) [1]. E andando a recuperare il testo, scopriamo che le definizioni di progressione aritmetica e geometrica si trovano nei capitoli III (pagina 253) e IV (pagina 258), rispettivamente, di suddetto libro. Le due pagine menzionate sono riportate in figura e, come si può leggere, le definizioni date coincidono con quelle oggi in uso. Si noti tra l’altro che l’esempio di progressione geometrica crescente portato da Caravelli coincide con la successione usata da Leopardi nel suo testo, nutrendo almeno la suggestione che in effetti l’autore ricordasse proprio questa fonte.

Mi sono chiesto allora, proprio principiando dalla pagina dei Pensieri, quale fosse il rapporto di Leopradi con la matematica e ho interrogato per questo lo Zibaldone. Se si naviga il testo con la chiave “progressione” ci si imbatte in un riferimento del 1821 alla progressione geometrica. Ci troviamo a pagina 1924 del testo autografo:

<<L’andamento, o il così detto perfezionamento dello spirito umano rassomiglia interamente alla progressione geometrica che dal menomo termine, con proporzione crescente arriva all’infinito>>.

E alcune righe sotto, ad inizio della pagina seguente, in una variante per lo più tautologica e permutativa, leggiamo:

<<E non è dubbio che quella che si chiama perfettibilità dell’uomo è suscettibile di aumento in infinito come la progressione geometrica, e di un aumento sempre proporzionalmente maggiore>>.

Mi sembra che anche mettendo insieme le due proposizioni, non si pervenga con sicurezza a una definizione della progressione geometrica, come se l’autore non avesse in mente un riferimento puntuale ad essa ma ne usasse il nome per il suo valore evocativo.

Se si interroga lo Zibaldone con la parola “matematica”, si trova, a pagina 46 del manoscritto autografo, il seguente sillogismo, mutilato della conclusione:

<<La grazia non può venire altro che dalla natura, e la natura non istà mai secondo il compasso della gramatica della geometria dell’analisi della matematica ec.>>.

Siamo tra il 1818 e il 1820 e il giovane Leopardi sembra affermare che la natura non può essere descritta dalla matematica, una delle due premesse, e che la grazia non può attingere alla matematica, conclusione questa che potrei però avere frainteso. La premessa menzionata è ribadita altrove, già solo fermanadosi alle prime seicento pagine del testo. A pagina 583, siamo nel 1821, si legge:

<<E dovunque ha luogo la perfezione matematica, ha luogo una vera imperfezione (quando anche questa rimedii ad altri più gravi inconvenienti e corruzioni), cioè discordanza dalla natura, e dall’ordine primitivo delle cose, il quale era combinato in altro modo, e fuor del quale non v’è perfezione, benchè questa non sia mai assoluta, ma relativa>>.

A cavallo tra le pagine 584 e 585, Leopardi ribadisce:

<<Questa pure è una gran fonte di errori ne’ filosofi, massime moderni, i quali assuefatti all’esattezza e precisione matematica, tanto usuale e di moda oggidì, considerano e misurano la natura con queste norme, credono che il sistema della natura debba corrispondere a questi principii; e non credono naturale quello che non è preciso e matematicamente esatto: quando anzi per lo contrario, si può dir tutto il preciso non è naturale: certo è un gran carattere del naturale il non esser preciso>>.

Sembra certo allora che Leopardi sia convinto che la matematica non sia lo strumento adatto a descrivere la natura, posizione che lo vede solitario, consapevole di esserlo. E non sembrano esserci dubbi sulla accezione da selezionare per “natura”, perché proprio il poeta ce l’ha presentata questa accezione, letteralmente, nella sua letteratura: ha dialogato con essa, travestito da islandese, da qualche parte, in Africa, vicino l’equatore.

E dunque, se non ho frainteso tutto, Leopardi tradisce Galileo e Newton, di cui tuttavia menziona correttamente – sebbene in modo qualitativo – i risultati già nella citata storia dell’astronomia, scritta a quindici anni; quel monumento di oltre 400 pagine popolate da citazioni in varie lingue, sia parlate che seppellite, e scoperte che partendo dagli astronomi Caldei, arrivano all’anno 1813. Il ragazzo che fu menzionava diligentemente la legge di caduta dei gravi, a velocità linearmente crescente con il tempo, le leggi di Keplero, alcuni dei risultati di Newton. Ma è come se non avesse inteso la lezione principale del diciassettesimo secolo, quella che denuncia tutta l’opera, non solo dei due grandi, ma di Torricelli, Cavalieri, Stevin, Pascal, e altri, e che trova l’enunciato più esplicito e noto nel Galileo del Saggiatore, che dice:

<<La filosofia naturale è scritta in questo grandissimo libro che continuamente ci sta aperto innanzi agli occhi, io dico l’universo, ma non si può intendere se prima non s’impara a intender la lingua e conoscer i caratteri nei quali è scritto. Egli è scritto in lingua matematica, e i caratteri son triangoli, cerchi ed altre figure geometriche, senza i quali mezzi è impossibile a intenderne umanamente parola; senza questi è un aggirarsi vanamente per un oscuro labirinto>>.

Senza contare che Leopardi nasce dopo tutta la vita di Eulero, è contemporaneo di Fourier e di Gauss, è di sessant’anni più giovane di Lagrange. Ovvero vive l’epopea del calcolo differenziale come impareggiabile chiave decifrativa di ogni aspetto della natura, e sembra non accorgersene.

Resta il punto sulla grazia e la matematica. A cavallo tra pagina 247 e 248, nel 1820, l’autore scrive:

<<Perciò la matematica la quale misura quando il piacer nostro non vuol misura, definisce e circoscrive quando il piacer nostro non vuol confini (sieno pure vastissimi, anzi sia pur vinta l’immaginazione dalla verità), analizza, quando il piacer nostro non vuole analisi nè cognizione intima ed esatta della cosa piacevole (quando anche questa cognizione non riveli nessun difetto nella cosa, anzi ce la faccia giudicare più perfetta di quello che credevamo, come accade nell’esame delle opere di genio, che scoprendo tutte le bellezze, le fa sparire), la matematica, dico, dev’esser necessariamente l’opposto del piacere>>.

La matematica dunque è contraria al piacere e sottrae la bellezza a ciò che è bello. Una posizione questa difficilmente condivisibile, quanto largamente condivisa; per restare negli stessi anni, ma cambiando lato dello iato oceanico, Edgar Allan Poe si esprimeva in modo analogo nei confronti della scienza [2]:

Science! true daugther of Old Time thou art!
Who alterest all things with thy peering eyes.
Why preyest thou upon the poet's heart,
Vulture, whose wings are dull realities?

Ma volendo anche in questo caso risolvere la questione con parole altrui, interpello Godfred Harold Hardy:

<<The mathematician’s patterns, like the painter’s or the poet’s, must be beautiful; the ideas, like the colours or the words, must fit together in a harmonious way. Beauty is the first test: there is no permanent place in the world for ugly mathematics>>.

E inoltre:

<<It would be difficult now to find an educated man quite insensitive to the aesthetic appeal of mathematics>> [3].

Cosa si trova se si invoca ancora lo Zibaldone in nome di Galileo? C’è una osservazione di pagina 2013 (autunno del 1821), fra le altre, che lo menziona in rapporto a quanto espresso sulla matematica:

<<Torno a dire che la precisione moderna ch’è estrema, e che in tali scritti e generi è di prima necessità, e che oggi si ricerca sopra tutte le qualità ec. è assolutamente di sua natura incompatibile colla eleganza: ed infatti il nostro secolo che è quello della precisione, non è certo quello della eleganza in nessun genere. Bensì ell’è compatibilissima colla purità, come si può vedere in Galileo, che dovunque è preciso e matematico quivi non è mai elegante, ma sempre purissimo italiano>>.

Cioè Leopardi afferma che dove Galileo usa un linguaggio matematico non può essere elegante, coerentemente con quanto enunciato sulla matematica. Perché per Leopardi, come sappiamo, l’eleganza è appannaggio dell’indefinito:

<<Se attentamente riguarderemo in che soglia consistere l’eleganza delle parole, dei modi, delle forme, dello stile, vedremo quanto sovente anzi sempre ella consista nell’indeterminato, (v. in tal proposito quello che altrove ho detto circa un passo di Orazio) v. p.1337. principio o in qualcosa d’irregolare, cioè nelle qualità contrarie a quelle che principalmente si ricercano nello scrivere didascalico o dottrinale. Non nego io già che questo non sia pur suscettibile di eleganza, massime in quelle parti dove l’eleganza non fa danno alla precisione, vale a dire massimamente nei modi e nelle forme. E di questa associazione della precisione coll’eleganza, è splendido esempio lo stile di Celso, e fra’ nostri, di Galileo>>.

Quindi, nonstante la tensione verso la precisione che inaridisce, Leopardi non riesce a negare di ammirare la prosa di Galileo. E Galilei, tra le osservazioni sperimentali e le argomentazioni geometriche che hanno cambiato il mondo e fatto tremare gli dèi, ha effettivamente seminato dei paragrafi che rappresentano forse la migliore letteratura italiana:

<<Né sia chi creda che la lettura de gli altissimi concetti, che sono scritti in quelle carte, finisca nel solo vedere lo splendore del Sole e delle stelle e ‘l lor nascere ed ascondersi, che è il termine sin dove penetrano gli occhi dei bruti e del vulgo; ma vi son dentro misteri tanto profondi e concetti tanto sublimi, che le vigilie, le fatiche e gli studi di cento e cento acutissimi ingegni non gli hanno ancora interamente penetrati con l’investigazione continuate per migliaia e migliaia d’anni. E credino pure gli idioti che, sì come quello che gli occhi loro comprendono nel riguardo l’aspetto esterno d’un corpo umano è piccolissima cosa in comparazione de gli ammirandi artifizi che in esso ritrova un esquisito e diligentissimo anatomista e filosofo, mentre va investigando l’uso di tanti muscoli, tendini, nervi ed ossi, essaminando gli offizi del cuore e de gli altri membri principali, ricercando le sedi delle facoltà vitali, osservando le meravigliose strutture de gli strumenti de’ sensi, e, senza finir mai di stupirsi e di appagarsi, contemplando i ricetti dell’immaginazione, della memoria e del discorso; così quello che ‘l puro senso della vista rappresenta, è come nulla in proporzion dell’alte meraviglie che, mercè le lunghe ed accurate osservazioni, l’ingegno degli intelligenti scorge nel cielo>> [4].

Una possibile conclusione di questa breve esplorazione è che Leopardi sia stato vittima di una educazione incompleta; incredibilmente, vista la dimensione borgesiana della biblioteca paterna, che includeva anche le opere originali di Galileo e Newton. E’ stato in effetti suggerito che il recanatese non conobbe mai i logaritmi, introdotti già da quasi duecento anni, e non avesse studiato né la geometria analitica di Descartes, né il calcolo differenziale, che pure era vecchio di almeno un secolo alla sua nascita [1]. Può darsi che il poeta abbia ereditato un peccato paterno: se si confronta il piano di studi dell’educazione domestica matematica di Leopardi con il tipo di istruzione impartita nelle università spagnole del diciottesimo secolo, si trova una sovrapponibilità [1], [5]. Se chiedo al lettore il nome di un matematico spagnolo dell’epoca di Galilei e dei due secoli successivi, cosa mi dice? Esatto! Il calcolo differenziale arrivò in Spagna, in una forma didattica e non investigativa, solo dopo la cacciata dell’ordine dei Gesuiti (1767), con il ricambio del corpo docente. Fino ad allora, la matematica rimase cristallizzata nelle formule algebriche e nei teoremi di Euclide, umiliate spesso dalle semplici applicazioni finanziarie, di agronomia, e militari. E dopo progredì solo come un corpo minato da una grave malattia [5]. E dove apprese Monaldo la sua scienza? Il suo precettore fu un Giuseppe Torres, gesuita approdato in Italia dal rifiuto spagnolo del suo ordine. E’ possibile che la nuova matematica fosse troppo indissolubilmente legata alla nuova fisica, per questo condannata ad essere rifiutata con essa dai monopolisti gesuiti del sapere. Con il risultato che la storia della matematica moderna sarebbe forse la stessa se la Spagna non fosse mai esistita.

L’errore di Leopardi non sarebbe dunque quello della confusione tra la progressione aritmetica e quella geometrica, che non ha nessuna importanza, ma quello di essersi fermato sulla soglia di un mondo che forse avrebbe potuto soddisfare il suo anelito alla bellezza e alla felicità. Si affrancò dal sistema tolemaico, ma non dalla ignoranza che lo sottendeva. E ora che scrivo, aggiungendo una pagina al mio modesto Zibaldone, e me lo figuro ragazzo nelle ore dilatate dalla giovinezza, in quella dimora privilegiata che gli fu così angusta, mi piace immaginarlo distratto, su quella soglia, dal fascino opalino della Luna, o dal fruscio delle vesti di una Nerina di cui è stato da tempo dimenticato il nome.

Riferimenti

[1] M.T. Borgato, L. Pepe, Leopardi e le Scienze Matematiche, 1998

[2] E.A. Poe, Sonnet – To Science, vv 1-4, scritto e rimaneggiato tra il 1829 e il 1845

[3] G.H. Hardy, A Mathematician’s Apology, 1940

[4] G. Galilei, Lettera a Cristina di Lorena, 1615

[5] C. López-Esteban, A. Maz-Machado, Las matemáticas en España durante el siglo XVIII a través de los libros y sus autores, 2020

Il testo completo dei Pensieri si può consultare qui. Una edizione di questa opera con i commenti di Paolo Emilio Castagnola è disponibile qui. La edizione del 1770 degli Elementi di Matematica di Vito Caravelli è disponibile qui. Una copia completa dello Zibaldone può essere scaricata in pdf qui. Nel film su Leopardi di Mario Martone del 2014, Il giovane favoloso, la sezione del pensiero XX qui discussa è messa in bocca allo stesso poeta, durante una cena romana, presso dei parenti, e la menzione alla progressione aritmetica è stata eliminata, probabilmente perché ci si è resi conto della svista del poeta, e non potendo modificare le sue parole, le si è tagliate.

Human proportions

Human proportions

Artists have proposed different proportions for the human body, throughout history. In ancient Egypt, the height of a human figure was set at 6.33 times the length of his foot [1]. For Michelangelo, as well as for Lisippo, the ideal height of a man was 8 times the head [1], [2]. In 1958, Burne Hogarth proposed as a reference for human proportions an imposing frame standing more than 190 cm tall, about 8.7 times the head [3].

But what do we know about human proportions, from an experimental point of view? I considered a 1972 paper by Renato Contini (destined for laboratories that manufacture prosthetic limbs) with several geometric and mechanic measures on the bodies of a group of US citizens, both males and females. In particular, I considered the measures reported in Figures 7 and 8 of the aforementioned paper [4], where the length of the segments of the body is expressed as a function of the height, H. The problem with the illustrations in the original paper is that they do not respect the proportions reported on the figures themselves (figure 1). Therefore, they are pretty confusing for the artist.

Figure 1. The original illustration of [4]. I used the proportions that refer to the US population. H: total height.

In order to generate an illustration that faithfully represented the proportions experimentally determined by Contini, I wrote an Octave script (reported at the end of this article) which generates Figure 2, where the proportions are indicated in a way that is probably more useful for the artist: I express the lengths of the limbs as a function of both H and of h. This same script can be used to compare a male and a female of the same height (figure 3). The female body is exactly 8 times the head, while the male body is only 7.69 times the head. The head of a male is bigger than the head of a female of the same height, the shoulders are wider, and the hips are tighter, as expected. The relative length of the torso is a bit longer in women than in men. A woman stands 6.62 times her foot, a man 6.58; therefore the Egyptian statues had longer feet, in proportion, than the average US citizen.

Figure 2. The proportions of the human body, according to Contini [4]. I considered a female of 161.3 cm (left) and a male of 175.3 cm (right). H: total height; h: head.

Figure 3. The proportions of the human body, according to Contini [4]. I considered a female (left) and a male (right) of the same height (170.0 cm). H: total height; h: head.

References

[1] De Simoni Luigi, De Simoni Piero, Anatomia Umana Artistica, Volume I, Bonacci Editore, Roma 1986

[2] Bridgman George B, Bridgman’s Life Drawing, Dover Publications, New York, 1924

[3] Hogarth Burne, Dynamic Anatomy, Watson-Guptill Publications, New York, 1958

[4] Contini Renato, Body Segment Parameters, Part II, 1972

The script

% file name = Contini
% date of creation = 23/05/2023
%
close all
clear all
%
%-------------------------------------------------------------------------------
% US population
%-------------------------------------------------------------------------------
%
height(1) = 161.3; % height of female (cm)
height(2) = 175.3; % height of male (cm)
width1 = [0.245*height(1),0.259*height(2)]; % from the tip of one clavicole to the tip of the other
width2 = [0.219*height(1),0.200*height(2)]; % from one head of one femur to the head of the other
width3 = [0.057*height(1),0.055*height(2)]; % width of the footh
Length1 = [0.938*height(1),0.936*height(2)];
Length2 = [0.875*height(1),0.870*height(2)];
Length3 = [0.825*height(1),0.819*height(2)];
Length4 = [0.632*height(1),0.630*height(2)];
Length5 = [0.480*height(1),0.485*height(2)];
Length6 = [0.370*height(1),0.357*height(2)];
Length7 = [0.524*height(1),0.530*height(2)];
Length8 = [0.282*height(1),0.285*height(2)];
Length9 = [0.048*height(1),0.043*height(2)];
js = 5 % joint size
shift = [0,100] % I use this to shift the second plot on the right
%
figure(1)
%
for (i=1:2)
  %
  H = height(i)
  w1 = width1(i)
  w2 = width2(i)
  w3 = width3(i)
  L1 = Length1(i)
  L2 = Length2(i)
  L3 = Length3(i)
  L4 = Length4(i)
  L5 = Length5(i)
  L6 = Length6(i)
  L7 = Length7(i)
  L8 = Length8(i)
  L9 = Length9(i)
  h = H - L2 % head height
  l = h/3 % head width divided by two
  %
  %-------------------------------------------------------------------------------
  % bones
  %-------------------------------------------------------------------------------
  %
  plot([0+shift(i),0+shift(i)],[H-h,L7],"-k","linewidth",1.5) % backbone
  hold on
  rectangle ("Position",[-l+shift(i),H-h,2*l,h],"linewidth",1.5) % head
  plot([-l+shift(i),l+shift(i)],[L1,L1],"-k","linewidth",1.5) % eyes
  %
  plot([-w1/2+shift(i),w1/2+shift(i)],[L3,L3],"-k","linewidth",1.5) % shoulders (tips of the clavicles)
  %
  plot([-w1/2+shift(i),-w1/2+shift(i)],[L3,L4],"-k","linewidth",1.5) % homerus, left
  plot([w1/2+shift(i),w1/2+shift(i)],[L3,L4],"-k","linewidth",1.5) % homerus, rigth
  %
  plot([-w1/2+shift(i),-w1/2+shift(i)],[L4,L5],"-k","linewidth",1.5) % radius, left
  plot([w1/2+shift(i),w1/2+shift(i)],[L4,L5],"-k","linewidth",1.5) % radius, rigth
  %
  rectangle ("Position",[-w1/2-(3/4)*l/2+shift(i),L6,(3/4)*l,L5-L6],"linewidth",1.5) % hand, left
  rectangle ("Position",[w1/2-(3/4)*l/2+shift(i),L6,(3/4)*l,L5-L6],"linewidth",1.5) % hand, rigth
  %
  plot([-w2/2+shift(i),w2/2+shift(i)],[L7,L7],"-k","linewidth",1.5) % hip
  %
  plot([-w3+shift(i),w3+shift(i)],[0,0],"-k","linewidth",1.5) % feet, plant
  %
  plot([-w3+shift(i),-w3/2+shift(i)],[0,L9],"-k","linewidth",1.5) % ankle, left
  plot([-w3/2+shift(i),0+shift(i)],[L9,0],"-k","linewidth",1.5) % ankle, left
  plot([0+shift(i),w3/2+shift(i)],[0,L9],"-k","linewidth",1.5) % ankle, rigth
  plot([w3/2+shift(i),w3+shift(i)],[L9,0],"-k","linewidth",1.5) % ankle, rigth
  %
  plot([-w3/2+shift(i),-w3+shift(i)],[L9,L8],"-k","linewidth",1.5) % tibia, left
  plot([w3/2+shift(i),w3+shift(i)],[L9,L8],"-k","linewidth",1.5) % tibia, rigth
  %
  plot([-w2/2+shift(i),-w3+shift(i)],[L7,L8],"-k","linewidth",1.5) % femur, left
  plot([w2/2+shift(i),w3+shift(i)],[L7,L8],"-k","linewidth",1.5) % femur, rigth
  %
  %-------------------------------------------------------------------------------
  % joints
  %-------------------------------------------------------------------------------
  %
  plot(-w1/2+shift(i),L3,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % shoulder, left
  plot(w1/2+shift(i),L3,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % shoulder, rigth
  %
  plot(-w1/2+shift(i),L4,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % elbow, left
  plot(w1/2+shift(i),L4,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % elbow, rigth
  %
  plot(-w1/2+shift(i),L5,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % wirst, left
  plot(w1/2+shift(i),L5,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % wirst, rigth
  %
  plot(-w2/2+shift(i),L7,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % hip, left
  plot(w2/2+shift(i),L7,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % hip, rigth
  %
  plot(-w3+shift(i),L8,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % knee, left
  plot(w3+shift(i),L8,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % knee, rigth
  %
  plot(-w3/2+shift(i),L9,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % ankle, left
  plot(w3/2+shift(i),L9,'o','markersize',js,'markerfacecolor','k','markeredgecolor','k') % ankle, rigth
  %
  %-------------------------------------------------------------------------------
  % measures
  %-------------------------------------------------------------------------------
  %
  L = H/3;
  % head
  plot([-L+shift(i),0+shift(i)],[H,H],"--k","linewidth",1.0)
  plot([-L+shift(i),0+shift(i)],[H-h,H-h],"--k","linewidth",1.0)
  quiver(-L+shift(i),H-h,0,h,'-k',"maxheadsize",0.1)
  quiver(-L+shift(i),H,0,-h,'-k',"maxheadsize",0.1)
  factorH = h/H;
  text (-L+l/2+shift(i),H-h/2,strcat("h=",num2str(factorH),"H"),"fontsize",15)
  % homer
  homer = L3 - L4;
  plot([-L+shift(i),-w1/2+shift(i)],[L3,L3],"--k","linewidth",1.0)
  plot([-L+shift(i),-w1/2+shift(i)],[L4,L4],"--k","linewidth",1.0)
  quiver(-L+shift(i),L4,0,homer,'-k',"maxheadsize",0.1)
  quiver(-L+shift(i),L3,0,-homer,'-k',"maxheadsize",0.1)
  factorH = homer/H;
  factorh = homer/h;
  text (-L+l/2+shift(i),L3-homer/2,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15)
  % radius
  radius = L4 - L5;
  plot([-L+shift(i),-w1/2+shift(i)],[L4,L4],"--k","linewidth",1.0)
  plot([-L+shift(i),-w1/2+shift(i)],[L5,L5],"--k","linewidth",1.0)
  quiver(-L+shift(i),L5,0,radius,'-k',"maxheadsize",0.1)
  quiver(-L+shift(i),L4,0,-radius,'-k',"maxheadsize",0.1)
  factorH = radius/H;
  factorh = radius/h;
  text (-L+l/2+shift(i),L4-radius/2,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15)
  % hand
  hand = L5 - L6;
  plot([-L+shift(i),-w1/2+shift(i)],[L5,L5],"--k","linewidth",1.0)
  plot([-L+shift(i),-w1/2+shift(i)],[L6,L6],"--k","linewidth",1.0)
  quiver(-L+shift(i),L6,0,hand,'-k',"maxheadsize",0.1)
  quiver(-L+shift(i),L5,0,-hand,'-k',"maxheadsize",0.1)
  factorH = hand/H;
  factorh = hand/h;
  text (-L+l/2+shift(i),L5-hand/2,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15)
  % femur
  femur = L7 - L8;
  plot([-1.1*L+shift(i),-w1/2+shift(i)],[L7,L7],"--k","linewidth",1.0)
  plot([-1.1*L+shift(i),-w3+shift(i)],[L8,L8],"--k","linewidth",1.0)
  quiver(-1.1*L+shift(i),L8,0,femur,'-k',"maxheadsize",0.1)
  quiver(-1.1*L+shift(i),L7,0,-femur,'-k',"maxheadsize",0.1)
  factorH = femur/H;
  factorh = femur/h;
  text (-1.1*L+l/2+shift(i),L7-homer,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15)
  % tibia
  tibia = L8 - L9;
  plot([-L+shift(i),-w3+shift(i)],[L8,L8],"--k","linewidth",1.0)
  plot([-L+shift(i),-w3/2+shift(i)],[L9,L9],"--k","linewidth",1.0)
  quiver(-L+shift(i),L8,0,-tibia,'-k',"maxheadsize",0.1)
  quiver(-L+shift(i),L9,0,tibia,'-k',"maxheadsize",0.1)
  factorH = tibia/H;
  factorh = tibia/h;
  text (-L+l/2+shift(i),L8-tibia/2,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15)
  % ankle
  ankle = L9;
  plot([-L+shift(i),-w3/2+shift(i)],[0,0],"--k","linewidth",1.0)
  quiver(-L+shift(i),L9,0,-ankle,'-k',"maxheadsize",0.1)
  quiver(-L+shift(i),0,0,ankle,'-k',"maxheadsize",0.1)
  factorH = ankle/H;
  factorh = ankle/h;
  text (-L+l/2+shift(i),L9-ankle/2,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15)
  % shoulders
  quiver(-w1/2+shift(i),L3-l,w1/2,0,'-k',"maxheadsize",0.1)
  quiver(0+shift(i),L3-l,-w1/2,0,'-k',"maxheadsize",0.1)
  factorH = w1/(2*H);
  factorh = w1/(2*h);
  text (-2*l+shift(i),L3-2*l,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15,"backgroundcolor","white")
  % hips
  plot([-w2/2+shift(i),-w2/2+shift(i)],[L7,L7+2*l],"--k","linewidth",1.0)
  quiver(-w2/2+shift(i),L4-l,w2/2,0,'-k',"maxheadsize",0.1)
  quiver(0+shift(i),L4-l,-w2/2,0,'-k',"maxheadsize",0.1)
  factorH = w2/(2*H);
  factorh = w2/(2*h);
  text (-2*l+shift(i),L4-1.7*l,strcat(num2str(factorH),"H=",strcat(num2str(factorh),"h")),"fontsize",15,"backgroundcolor","white")
  % heads
  plot([w2/2+1.5*l+shift(i),w2/2+1.5*l+shift(i)],[H,0],"-k","linewidth",1.0)
  temp=0;
  while (temp<=H)
    plot(w2/2+1.5*l+shift(i),H-temp,'^','markersize',js,'markerfacecolor','k','markeredgecolor','k')
    temp=temp+h;
  endwhile
endfor
%
%-------------------------------------------------------------------------------
% grid and axes
%-------------------------------------------------------------------------------
%
axis([-70,140,-l,H+l],"equal")
ylabel("cm","fontsize",15)
grid on
grid minor

Non Solo Fatica, il mio intervento

Il mio intervento durante il convegno online Non Solo Fatica (15 aprile 2023). Riporto i risultati di una serie di analisi statistiche sui dati genetici di 1659 pazienti con ME/CFS. Le slide dell’intervento possono essere scaricate qui. L’intero convegno può essere visto gratuitamente a questo indirizzo, previa iscrizione.

The measure of Dante’s Universe

The measure of Dante’s Universe

At the end of the twenty-seventh canto of Paradiso (Divine Comedy), Dante Alighieri describes his ascension towards the ninth sphere of the Ptolemaic model of the universe: the Primum Movens, which contains and gives motion to all the previous skies (Moon, Mercury, Venus, Sun, Mars, Jupiter, Saturn, and Fixed Stars), that rotate around the center of the Universe, the Earth (Figure 1, left). Beatrice, the woman who leads the poet in his itinerarium in deum, explains that the Universe has a fixed center, the Earth, surrounded by eight rotating spheres or skies with an increasing radius, and all these physical elements are included in a ninth sphere, the Primum Movens, from which the movement arises; and this last sphere is not contained by other skies and has no physical place: it exists in the mind of God. The following are the verses in which Beatrice explains the mentioned architecture of the Ptolemaic system.

Ma ella che vedea il mio disire,
incominciò, ridendo tanto lieta, 
che Dio parea nel suo volto gioire:
"La natura del mondo, che quieta
il mezzo e tutto l'altro intorno move,
quinci comincia come da sua meta.
E questo cielo non ha altro dove
che la mente divina, in che s'accende
l'amor che 'l volge e la virtù ch'ei piove.
Luce ed amor d'un cerchio lui comprende
si come questo li altri; e quel precinto
colui che 'l cinge solamente intende."

Paradiso, XXVII, vv 103-114

At the beginning of canto XXVIII, Dante can now see what is beyond the Primum Movens, a reality called Empyreal, which has a structure that is symmetric to the one of the Ptolemaic universe, but this time God is the center and nine spheres or skies rotate around him (Figure 1, right; Figure 2). The union of these two points, the Erath and God, and of the two sets of nine spheres that include them, is the complete sum of all that exists, according to Dante: of what has been created and of its Creator. But what is its shape or geometric nature? If we imagine Dante as a bi-dimensional being and if we subtract a spatial dimension from all his surroundings, we can see the spheres as circles and assemble them as the parallels of a sphere of which the Earth is one pole and God is the other. Dante moves on the surface of this sphere (a space with two dimensions) and the circles are the intersection of the sphere itself with a family of parallel planes. If we now add again the third dimension to this model, we must conclude that the universe is a four-dimensional sphere and that the skies are its intersections with a family of three-dimensional spaces.

Figure 1. The Ptolemaic system, on the left. On the right, the structure of the Empyreal. From the paper by Peterson mentioned in below.

I found the idea of the universe of Dante as a hypersphere of a space with four dimensions in a 1979 paper by the physicist Mark A. Peterson, “Dante and the 3-sphere” (link). That said, it is possible to calculate the space (in four dimensions) occupied by such a universe. If we introduce a Euclidean space of dimension 4, we can calculate the volume of the sphere of radius R and center in the origin of the coordinate system, by solving the integral:

V(4,R)=2^4\int_{0}^{R}\int_{0}^{\sqrt{R^2-x_4^2}}\int_{0}^{\sqrt{R^2-\left(x_3^2+x_4^2\right)}}\int_{0}^{\sqrt{R^2-\left(x_2^2+x_3^2+x_4^2\right)}}dx_1dx_2dx_3dx_4

With a few passages, we get

V(4,R)=4\pi\left(\pi\frac{R^4}{4}-\frac{1}{3}\int_{0}^{R}\left(R^2-x_4^2\right)^\frac{3}{2}dx_4-\int_{0}^{R}x_4^2 \sqrt{R^2-x_4^2}dx_4\right)

The two integrals inside the brackets can be easily solved by integration by series (use the binomial expansion) and we get that

V(4,R)= \frac{\pi^2}{2}R^4

What is the value of R? It should be the radius of the largest sphere, the equatorial one: the Primum Movens. But it has no radius, to my knowledge, it is not material. We can use the radius of the sphere of the fixed stars, though, that according to Ptolemy (Almagest, book I, chapter V) is about 20 thousand times the radius of the Earth, r_T = 6,371 km . Therefore, we conclude that the volume of the four-dimensional hypersphere that includes the Universe, according to Dante Alighieri, is 8\pi^210^{16}r_T^4, which is about 1.3\cdot10^{45}m^4 . It is not clear what the meaning of this analysis might be, if any: Dante did not know geometry with more than three dimensions, to my knowledge. But one implication is that a three-dimensional being can not move from one sky of the Ptolemaic system to the other (because they are in different three-dimensional spaces) unless he finds a way to move along the fourth dimension. I think that this would resonate with Dante’s mind and that this would agree with what he had envisioned: he can accomplish his ascent to God only because of external intervention and help from Beatrice.

Figure 2. Dante and Beatrice in the Empyreal, incision by Gustave Doré.

Spot Finder, a regression analysis

Spot Finder, a regression analysis

Abstract

My ME/CFS regularly improves during the summer. In a previous study, I found that the improvement correlates with air temperature but not with other environmental parameters. In a simulation of summerish conditions performed in a room, during cold months, by artificially increasing air temperature, infrared radiation, and air humidity, the correlation between my symptoms and air temperature tended to be negative. Here I report on a further study where I consider again environmental parameters from a few locations in the temperate and subtropical regions of both hemispheres and I search for the best regression model between them and my status (n=20). The best regression model, among the ones tested, is Y=\beta_0+\beta_1 t +\beta_2 T^4 where Y is my status (the higher the value, the less the symptoms), t is air temperature (°C) and T is absolute air temperature (K). This regression model approximates the flux of thermic energy between my body and the environment, when indoors, but with two different signs for the coefficients of t and of T^4. I have used then the best regression model to predict the score over the year in several cities. These predictions can be used to find the optimal spot to live in, as a function of the month of the year.

Introduction

My ME/CFS improves during summer, in the period of the year that goes from May/June to the end of September (when I am in Rome, Italy). I don’t know why. In a previous study (Maccallini P. 2022), I analyzed the correlation between my symptoms and several environmental parameters, during three periods covering a total of 190 days: in one, I improved while the season was going toward summer, in another one we were in full-blown summer, and in the third one my functioning declined while summer was fading away. The statistical analysis showed a positive correlation between my functionality score and the temperature of the air and a negative correlation between the score and air density and dry air density (remember that the higher the functionality score, the better I feel). No correlation was found between my functionality score and: relative humidity, absolute humidity, atmospheric pressure, and the concentration of particulate with a diameter below or equal to 2.5 \mu m. In another study, I simulated summerish conditions in a room for five months, during cold months, by means of a heat pump, an infrared lamp, an air moisturizer, and mylar panels (Maccallini P. 2022) and despite an improvement during the experiment, the correlation between my status and air temperature tended to be negative. In the present study, I consider again environmental parameters from a few locations in the temperate and subtropical regions of both hemispheres and I search for the best regression model between them and my status.

Figure 1. The duplets City-Month are reported in the euclidean space Cl, R, T. The points City-Months that have already been classified based on the score I registered for them, are colored green (score of 6), red (score of 4), yellow with a black contour line (score of 5), and yellow with a green contour line (score of 5.5). Black dots are doublets City-Month without a classification. CO = Corrientes, Argentina; AS = Asunción, Paraguay; SM = Santa Maria, Cape Verde. F = February; Ma = March, and so on.

Methods and Results

I have considered a set of 20 points defined by the two coordinates City and Month. To each of them, I have assigned a score, from 4 to 6, based on the degree of severity (the lower the score, the worse the disease) of my symptoms in that particular city, for that specific month. For each point City-Month I have collected the monthly mean air temperature (T), mean cloudiness (Cl), and mean solar radiation (R) (Figure 1). I have considered several models of regression between the score (response variable) and the three explanatory variables T, Cl, and R (Table 1). For each regression model, I have calculated the p values of the estimates of the coefficients, and I have also calculated the p value of the F test, given by

(1) \,\,\,p\,=\,P\left(TS>\frac{R^2 \left(n-r-1\right)}{\left(1-R^2\right)r}\right)

where TS follows an F law of parameters r and n-r-1, with r the number of explanatory variables and n the number of data points. All the calculations and the plots of this article (except for Figure 3) have been performed by two custom scripts (reported at the end), one in Octave, and one in R. For the script in Octave I wrote a subroutine for the F-test. The R script also calculates Spearman’s, and Pearson’s correlation coefficients between the variables, including their p values and the corrections for temperature (Table 2).

Model\beta_0\beta_1\beta_2\beta_3F test
1)\,Y=\beta_0+\beta_1 R +\beta_2 t1.90**0.1100.129*1.98e-4
2)\,Y=\beta_0+\beta_1 Cl +\beta_2 t0.5140.0210.198**2.14e-4
3)\,Y=\beta_0+\beta_1 R +\beta_2 Cl + \beta_3 t0.2080.1360.02700.164*5.78e-4
4)\,Y=\beta_0+\beta_1 R +\beta_2 T^4-5.540.1001.36e-9*1.51e-4
5)\,Y=\beta_0+\beta_1 R +\beta_2 t + \beta_3 T^4-1.49e2*0.131-2.60*2.77e-8*3.58e-5
6)\,Y=\beta_0+\beta_1 T^4-7.38**1.70e-9***2.85e-5
7)\,Y=\beta_0+\beta_1 t +\beta_2 T^4-1.44e2*-2.47*2.69e-8*1.28e-5

Table 1. For each regression model, I have indicated the values of the estimates of the coefficients (with their degree of significance), and the p value of the F test. The meaning of the asterisks is * p < 0.05; ** p<0.001; *** p = 0. T = mean daily absolute temperature; t = meant daily temperature in Celsius, R = mean daily solar radiation; Cl = fraction of the day mainly cloudy.

I have used then the best regression model to predict the score along the year in several cities in the temperate and subtropical regions of both hemispheres (Figure 2). The diagrams have been interpolated by using cubic splines, to make them more smooth. These predictions can be used to find the best spot to live in, as a function of the month of the year.

Figure 2. Prediction for the score by the regression model Y=\beta_0+\beta_1 T^4. RM = Rome; AR = Arona, Tenerife, Spain; RO = Rosario, Argentina; BA = Buenos Aires, Argentina; AS = Asunción, Paraguay; CO = Corrientes, Argentina; SM = Santa Maria, Cape Verde.

Cor. between
Y and
Spearman
(p value)
Pearson
(p value)
Pearson
corrected for t
(p value)
Pearson
corrected for R
(p value)
R0.758
(1.10e-4)
0.706
(0.509e-4)
0.204
(0.401)
Cl-0.511
(0.214e-2)
-0.583
(0.696e-3)
0.182
(0.456)
t
0.875
(4.49e-7)
0.786
(4.04e-5)
0.519
(2.27e-2)
T^40.875
(4.49e-7)
0.794
(2.85e-5)
0.515
(2.43e-2)

Table 2. Correlation coefficients (Spearman and Person) between the variables. Corrected Pearson correlations were also computed, when possible. T = mean daily absolute temperature; t = meant daily temperature in Celsius, R = mean daily solar radiation; Cl = fraction of the day mainly cloudy.

I also used the 198 data points from my previous study (Maccallini P. 2022) to test models 7 and 6 of regression. I considered the mean data on three days for all the variables (Table 3). In this case, model 6 performs better. We still have a good level of significance in the F test, and we still have a negative coefficient for t in model 7. If we use this model to make previsions on the score as a function of the month in various cities, we get Figure 3. Consider that this regression model is based on a scoring system that is slightly lower if compared with the one used for the previous analysis.

Model\beta_0\beta_1\beta_2\beta_3F test
6)\,Y=\beta_0+\beta_1 T^48.19e-15.31e-10***1.54e-6
7)\,Y=\beta_0+\beta_1 t +\beta_2 T^4-4.67e1.-9.09e-1.9.41e-9.2.14e-6

Table 3. For each regression model, I have indicated the values of the estimates of the coefficients (with their degree of significance), and the p value of the F test. The meaning of the asterisks is: . p<01, * p < 0.05; ** p<0.001; *** p = 0. T = mean daily absolute temperature; t = meant daily temperature in Celsius, R = mean daily solar radiation; Cl = fraction of the day mainly cloudy.

Figure 2. Prediction for the score by the regression model 6 of Table 3. RM = Rome; AR = Arona, Tenerife, Spain; RO = Rosario, Argentina; BA = Buenos Aires, Argentina. AS = Asunción, Paraguay; CO = Corrientes, Argentina; SM = Santa Maria, Cape Verde.

Discussion

The best regression model is Y=\beta_0+\beta_1 t +\beta_2 T^4, followed by the model \beta_0+\beta_1 T^4, and model Y=\beta_0+\beta_1 R +\beta_2 t + \beta_3 T^4. These three models have a physical meaning; namely, they express the flux of thermic energy between my body and the environment. The human body must balance the energy exchanged with the environment to maintain thermic homeostasis. The power P exchanged with the environment can be written as

(2) \,\,\,P\,=\,R+CV+CD+E

where R is the power exchange in the form of radiant energy, C is the exchange by conduction, CV is the exchange by convection, and E is the dispersion of power by evaporation. This is a simplification of complex phenomena that should also take into account the exchange of thermic power associated with the passage of atmospheric gas through the respiratory system. The power R can be further specified in the form R\,=\,K_1 R_{sun} + K_2(T_me^4-T_env^4) where K_1 R_{sun} is the power absorbed from the Sun, and the other addend is the radiant power exchanged with the environment, whit K_2 a constant that expresses radiant and geometrical properties of both my body and of the environment. While R_{sun} is radiant power in the form of short wave radiation (wavelength below 3 \mu), the other addend represents radiant power exchanged by bodies at low temperatures with a wavelength above 3 \mu (according to the Stephan-Boltzman law) (R). But what temperature is T_{env}? One first approximation might be the absolute temperature of the air, because in warm months, with the windows open, the objects surrounding us tend to acquire a superficial temperature similar to that of the air. To show that point, I analyzed the power emitted by the soil in Rome, during the year 2020, and the temperature of the air (data from ARPALAZIO). If we indicate J the daily mean power emitted per surface unit by the soil in the hemispace, the Stefan-Boltzmann law states that

(3) \,\,\,J\,=\,a\chi T_s^4

where a is a constant below 1 dependent on the material of the surface of the soil, \chi\,=\,5.6696\cdot10^{-8}\frac{W}{m^2 K^4} is the Stefan-Boltzmann constant, and T_s is the absolute temperature of the soil. If the assertion that the temperature of the soil is about the same as the temperature of the air was correct, the regression for the following linear model should have a very low p value of the F test:

(4) \,\,\,J\,=\,B_0 + B_1(273.15 + t_a)^4

And this is in fact the case, we have the regression in Figure 3, with a p value of the F test below 2.2\cdot 10^{-16}. For further details on these calculations, see (Maccallini P, 2022).

Figure 3. Linear regression between the mean daily irradiance from the Earth and the fourth power of the absolute temperature of the air (daily mean value). Data from ARPA, Rome, 2020. The analysis is described in detail in (Maccallini P, 2022).

As for the exchange of power by conduction and convection, in both cases, they are expressed by a constant multiplied by the difference in temperature between my skin and the air. That said, we can write again eq. 1 as follows:

(5) \,\,\,P\,=\,K_1 R_{sun}+K_2 (T_{skin}^4-T_{air}^4)+K_3 (t_{skin} - t_{air})

were we have removed the term linked to evaporation. In other words, the power exchanged by my body with the environment could be expressed, in first approximation, by the equation

(6) \,\,\,P\,=\,B_0+B_1 R_{sun}+B_2 t_{air} + B_3 T_{air}^4

This is model 5 of Table 1. If we consider the case of a subject who rarely leaves home, we can get rid of R_{sun} and we get model 7, the best model of regression. In a previous article, I showed that the best correlation between my status and several environmental parameters was with air temperature (R), and yet in an experiment where I simulated summer in a room with the use of a heat pump, an infrared lamp, and an air moisturizer, there was no correlation between my status and air temperature (R) (in fact the correlation had a tendency to be negative). From the perspective of this new study, I would explain the previous results as follows: in the first study performed during worm months using environmental parameters we caught the Spearman’s correlation between my status and air temperature which was a reflection of the correlation between my status and the longwave infrared radiation from the environment (proportional to the fourth power of the absolute temperature of the air); in the second study, performed during cold months within a room with artificially heated air, there was no correlation between air temperature and the infrared emission of the environment (which came from a lamp), so we found a correlation that tended to be negative perhaps because when I was feeling worse I raised the temperature of the air. It should be noted though that in models 7 and 5 the coefficient of t is negative, therefore it seems that while the longwave infrared radiation plays a positive role, the temperature of the air does not.

Conclusion

The three best regression models suggest that my improvement is linked to the thermal energy balance of the body: the lower the dispersion of radiant thermic energy, the better I feel. But at the same time, the temperature of the air has a detrimental effect. But other interpretations might be possible: there might be an effect of thermal radiation on my biology that is not linked to thermic homeostasis but instead to some other biological targets. Moreover, there might be other models of regression that I have not considered, that perform better than the ones mentioned.

Scripts

The first script is written in Octave. It calculates the regressions and their F tests (by using a custom subroutine) and it plots Figure 1 and Figure 2. It also writes the data in csv format for the second script (in R), which performs the same statistical analyses and also calculates the p values associated with each coefficient estimate.

% file name = Spot_finder_2
% date of creation = 29/01/2023 
%
close all 
clear all
#
pkg load statistics % we need this package for the F law
spline = 1 % it is one if we want a cubic spline interpolation for the last plot
#
#-------------------------------------------------------------------------------
# Data
#-------------------------------------------------------------------------------
#
months = ["Je"; "F"; "Mr"; "Ap"; "Ma"; "Jn"; "Jl"; "Au"; "S"; "O"; "N"; "D"];
%
% data of Rome (RM), Italy
%
k=1;
Spot(1,:,k) = [2,3,4.3,5.6,6.8,7.5,7.5,6.5,4.9,3.4,2.2,1.8]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [47,44,44,43,39,25,13,18,32,43,47,46]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [7,8,11,13,18,22,25,25,21,17,12,8]; % Mean air temperature (°C)
Spot(4,:,k) = [3,3,6,8,12,16,18,18,15,12,7,4]; % Min air temperature (°C)
Spot(5,:,k) = [12,13,16,19,23,27,31,31,27,22,17,13]; % Max air temperature (°C)
%
% data of Arona (AR), Tenerife, Spain
%
k=2;
Spot(1,:,k) = [3.9,4.9,6.1,7.2,7.8,8.2,8.0,7.4,6.3,5.1,4.0,3.5]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [32,28,26,24,21,9,2,6,21,34,38,36]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [19,19,19,20,21,22,24,25,25,24,22,20]; % Mean air temperature (°C)
Spot(4,:,k) = [16,16,16,17,18,20,21,22,22,21,19,17]; % Min air temperature (°C)
Spot(5,:,k) = [22,22,23,23,24,26,28,28,28,27,25,23]; % Max air temperature (°C)
%
% data of Rosario (RO), Santa Fe, Argentina
%
k=3;
Spot(1,:,k) = [7.6,6.7,5.6,4.3,3.2,2.7,3.0,3.9,5.1,6.3,7.3,7.7]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [28,28,28,34,45,47,44,40,36,32,30,28]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [25,23,22,18,14,11,10,12,15,18,21,24]; % Mean air temperature (°C)
Spot(4,:,k) = [19,18,17,13,10,7,6,7,9,13,16,18]; % Min air temperature (°C)
Spot(5,:,k) = [30,29,27,23,19,16,16,18,21,24,27,29]; % Max air temperature (°C)
%
% data of Buenos Aires (BA), Argentina
%
k=4;
Spot(1,:,k) = [7.6,6.7,5.5,4.1,3.0,2.5,2.7,3.6,4.8,6.2,7.3,7.8]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [29,31,31,38,48,50,48,45,41,37,33,30]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [24,23,22,18,15,12,11,13,14,17,20,23]; % Mean air temperature (°C)
Spot(4,:,k) = [21,20,19,15,12,9,9,10,11,14,17,19]; % Min air temperature (°C)
Spot(5,:,k) = [28,27,25,21,18,15,14,16,18,21,24,27]; % Max air temperature (°C)
%
% data of Asuncion (AS), Paraguay
%
k=5;
Spot(1,:,k) = [7.0,6.6,6.0,5.0,4.1,3.5,3.8,4.5,5.3,6.1,6.9,7.1]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [45,42,33,31,32,37,35,32,32,38,38,42]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [28,27,26,23,20,18,18,20,21,24,25,27]; % Mean air temperature (°C)
Spot(4,:,k) = [23,23,21,19,16,14,14,15,16,19,21,22]; % Min air temperature (°C)
Spot(5,:,k) = [33,32,31,28,25,23,23,25,27,29,31,32]; % Max air temperature (°C)
%
% data of Corrientes (CO), Argentina
%
k=6;
Spot(1,:,k) = [7.2,6.7,5.9,4.8,3.9,3.4,3.6,4.3,5.3,6.2,7.0,7.3]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [39,35,30,30,33,37,35,33,32,34,34,36,]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [27,26,25,22,18,16,15,17,19,22,24,26]; % Mean air temperature (°C)
Spot(4,:,k) = [22,22,20,17,14,12,11,12,14,17,19,21]; % Min air temperature (°C)
Spot(5,:,k) = [33,32,30,26,23,21,21,23,25,27,29,31]; % Max air temperature (°C)
%
% data of SantaMaria (SM), Capo Verde
%
k=7;
Spot(1,:,k) = [5.0,5.9,6.8,7.3,7.3,7.2,6.7,6.2,5.8,5.6,5.0,4.6]; % Mean daily incident solar radiation (kWh/m^2)
Spot(2,:,k) = [42,35,34,33,25,19,36,53,56,48,54,49]; % Fraction of the day mainly cloudy (%)
Spot(3,:,k) = [22,22,22,22,23,24,25,27,27,27,25,23]; % Mean air temperature (°C)
Spot(4,:,k) = [20,19,20,20,21,22,23,25,25,24,23,21]; % Min air temperature (°C)
Spot(5,:,k) = [25,25,25,26,26,27,28,30,30,30,28,26]; % Max air temperature (°C)
%
names = {"RM","AR","RO","BA","AS","CO","SM"};
types = {"-k","--k",":k","-r","--r",":r","-b","--b","-.b",}
%
for i=1:5
  max_measure(i) = max([Spot(i,:,1),Spot(i,:,2),Spot(i,:,3),Spot(i,:,4),Spot(i,:,5),Spot(i,:,6),Spot(i,:,7)])
endfor
%
%-------------------------------------------------------------------------------
% Subroutine for F-test
%-------------------------------------------------------------------------------
%
function [pval,R2,TS] = F_test (M,b,beta)
  r = length(M(1,:))-1; % number of explanatory variables
  n = length(M(:,1)) % number of data points
  R = b-M*beta; % residues
  SSR = 0;
  Sbb = 0;
  for i=1:n
    SSR = SSR + R(i)^2; % sum of squared residues
    Sbb = Sbb + b(i)^2;
  endfor
  Sbb = Sbb - n*(mean(b))^2;
  R2 = (Sbb - SSR)/Sbb; % R squared
  TS = R2*(n-r-1)/(r*(1-R2)); % test statistics
  pval = 1 - fcdf(TS,r,n-r-1); % F-test
endfunction
%
%-------------------------------------------------------------------------------
% Subroutine plot_score
%-------------------------------------------------------------------------------
%
function Plot_score (score, h, model, names, types, spline)
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      if (spline==1)
        yi = interp1([1:1:12],score(:,k),[1:0.25:12],"spline")
        plot([1:0.25:12],yi,char(types{k}),"linewidth",1.5)
        hold on
      else
        plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
        hold on
      endif
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h})
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
endfunction
%
%-------------------------------------------------------------------------------
figure 1 % mean temp, irradiation, cloudiness with storing of data for regressions
%-------------------------------------------------------------------------------
%
% plotting Rome
%
k=1;
n=1;
for i=1:12
  if (and(i>=6,i<9))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (or(i<6,i>9))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
  if (or(and(i>3,i<5),i>9))
    b(n)=4;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i==5)
    b(n)=5;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i==9)
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','g')
    b(n)=5.7;
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  hold on
endfor
%
% plotting Arona
%
k=2;
for i=1:12
  if (i==5)
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (and(i>=1,i<5))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
    b(n)=4
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
    hold on
endfor
%
% plotting Rosario
%
k=3;
for i=1:12
  if (and(i>=1,i<3))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i==3)
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','k')
    b(n)=5.5
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  hold on
endfor
%
% plotting CABA
%
k=4;
for i=1:12
  if (or(i==12,i==1,i==2))
    plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
    b(n)=6
    M(n,1:4)=[1,Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)];
    n=n+1
  endif
  if (i<12)
    hold on
  endif
endfor
%
% plotting query spots
%
% Asuncion
%
k=5;
for i=2:4
  plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Corrientes
%
k=6;
for i=2:4
  plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Santa Maria
%
k=7;
for i=2:5
  plot3(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
grid on
grid minor on
xlabel("Mean daily incident solar radiation (kWh/m^{2})",'fontsize',15);
ylabel("Fraction of the day mainly cloudy (%)",'fontsize',15);
zlabel("Mean air temperature (°C)",'fontsize',15);
axis ('square')
axis([4,max_measure(1),0,max_measure(2),15,max_measure(3)])
%
%-------------------------------------------------------------------------------
% Regressions
%-------------------------------------------------------------------------------
%
n=n-1; % number of measures
%
b = transpose(b)
x = cell() % it contains the coefficients of the models
model = cell() % it contains the description of the models
matrix = cell() % it contains the matrix of the regression
k = 0;
%
for i=1:n
  A(i,1:3)=[1,M(i,2),M(i,4)]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b2*t"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:3)=[1,M(i,3),M(i,4)]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Cl + b2*t"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:4)=[1,M(i,2),M(i,3),M(i,4)]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b1*Cl + b2*t"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:3)=[1,M(i,2),(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b2*T^{4}"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:4)=[1,M(i,2),M(i,4),(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*Rad + b2*t + b3*T^{4}"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:2)=[1,(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*T^{4}"
matrix{k} = A;
clear A
%
for i=1:n
  A(i,1:3)=[1,M(i,4),(273.15+M(i,4))^4]
endfor
k = k+1;
[x{k}, std, mse, S] = lscov (A, b)
[pval(k), R2(k), TS(k)] = F_test (A, b, x{k})
model{k} = "socre = b0 + b1*t + b2*T^{4}"
matrix{k} = A;
clear A
%
%-------------------------------------------------------------------------------
% Selection of the best model
%-------------------------------------------------------------------------------
%
for i=1:length(pval)
  if (pval(i)==min(pval))
    best=i;
  endif
endfor
%
%-------------------------------------------------------------------------------
% Region of the plane Rad-Temp with high score according to the regression
% model
%-------------------------------------------------------------------------------
%
R(1)= 4;
R(2)= max_measure(1);
Temp_R(1) = ( 5.5 - x{1}(1) - x{1}(2)*R(1) )/x{1}(3);
Temp_R(2) = ( 5.5 - x{1}(1) - x{1}(2)*R(2) )/x{1}(3);
%
%-------------------------------------------------------------------------------
% Region of the plane Cloudiness-Temp with high score according to the regression
% model
%-------------------------------------------------------------------------------
%
Cl(1)= 0;
Cl(2)= max_measure(2);
Temp_Cl(1) = ( 5.5 - x{2}(1) - x{2}(2)*Cl(1) )/x{2}(3);
Temp_Cl(2) = ( 5.5 - x{2}(1) - x{2}(2)*Cl(2) )/x{2}(3);
%
%-------------------------------------------------------------------------------
figure 2 % mean temp and irradiation
%-------------------------------------------------------------------------------
%
% plotting Rome
%
k=1;
for i=1:12
  if (and(i>=6,i<9))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (or(i<6,i>9))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
  if (i==9)
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','g')
  endif
  hold on
endfor
%
% plotting Arona
%
k=2;
for i=1:12
  if (i==5)
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (and(i>=1,i<5))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
    hold on
endfor
%
% plotting Rosario
%
k=3;
for i=1:12
  if (and(i>=1,i<3))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i==3)
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','k')
  endif
  hold on
endfor
%
% plotting CABA
%
k=4;
for i=1:12
  if (or(i==12,i==1,i==2))
    plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i<12)
    hold on
  endif
endfor
%
% plotting query spots
%
% Asuncion
%
k=5;
for i=2:4
  plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Corrientes
%
k=6;
for i=2:4
  plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Santa Maria
%
k=7;
for i=3:5
  plot(Spot(1,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(1,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
plot([R(1),R(2)],[Temp_R(1),Temp_R(2)],"--k","linewidth",1)
%
grid on
grid minor on
xlabel("Mean daily incident solar radiation (kWh/m^{2})",'fontsize',15);
ylabel("Mean air temperature (°C)",'fontsize',15);
axis([R(1),R(2),15,max_measure(3)])
%
%-------------------------------------------------------------------------------
figure 3 % mean temp and cloudiness
%-------------------------------------------------------------------------------
%
% plotting Rome
%
k=1;
for i=1:12
  if (and(i>=6,i<9))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (or(i<6,i>9))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
  if (i==9)
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','g')
  endif
  hold on
endfor
%
% plotting Arona
%
k=2;
for i=1:12
  if (i==5)
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (and(i>=1,i<5))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','r','markeredgecolor','k')
  endif
    hold on
endfor
%
% plotting Rosario
%
k=3;
for i=1:12
  if (and(i>=1,i<3))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i==3)
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','y','markeredgecolor','k')
  endif
  hold on
endfor
%
% plotting CABA
%
k=4;
for i=1:12
  if (or(i==12,i==1,i==2))
    plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','g','markeredgecolor','k')
  endif
  if (i<12)
    hold on
  endif
endfor
%
% plotting query spots
%
% Buenos Aires
%
i=2;
k=4;
plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
text(Spot(2,i,k),Spot(3,i,k)-0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
%
% Asuncion
%
k=5;
for i=2:4
  plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Corrientes
%
k=6;
for i=2:4
  plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(2,i,k),Spot(3,i,k)-0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
% Santa Maria
%
k=7;
for i=3:5
  plot(Spot(2,i,k),Spot(3,i,k),'o','markersize',6,'markerfacecolor','k','markeredgecolor','k')
  text(Spot(2,i,k),Spot(3,i,k)+0.5, strcat(char(names{k}),", ",months(i,:)),'fontsize',15)
endfor
%
plot([Cl(1),Cl(2)],[Temp_Cl(1),Temp_Cl(2)],"--k","linewidth",1)
%
grid on
grid minor on
xlabel("Fraction of the day mainly cloudy (%)",'fontsize',15);
ylabel("Mean air temperature (°C)",'fontsize',15);
axis([Cl(1),Cl(2),15,max_measure(3)])
%
%-------------------------------------------------------------------------------
% Plotting the scoring for each city according to the best model
%-------------------------------------------------------------------------------
%
switch best
  case 1
    %
    % Scoring for the query spots according to model h
    %
    h=1;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*Spot(3,i,k);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 2
    %
    % Scoring for the query spots according to model h 
    %
    h=2;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(2,i,k)+x{h}(3)*Spot(3,i,k);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 3
    %
    % Scoring for the query spots according to model h
    %
    h=3;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*Spot(2,i,k)+x{h}(4)*Spot(3,i,k);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 4
    %
    % Scoring for the query spots according to model h
    %
    h=4;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*(Spot(3,i,k)^4);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 5
    %
    % Scoring for the query spots according to model h
    %
    h=5;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(1,i,k)+x{h}(3)*Spot(3,i,k)+x{h}(4)*(Spot(3,i,k)^4);
      endfor
    endfor
    %
    figure(5) % Plotting of the Scoring for the query spots
    %
    for k=1:length(names)
      plot([1:1:12],score(:,k),char(types{k}),"linewidth",1.5)
      hold on
    endfor
    plot([1,12],[5,5],"--g","linewidth",1.5)
    title(model{h},'fontsize',15)
    legend(char(names{1:length(names)}),"location","southwest",'fontsize',15)
    xlabel("Month",'fontsize',15);
    ylabel("Score",'fontsize',15);
    grid on
    grid minor on
  case 6
    %
    % Scoring for the query spots according to model h
    %
    h=6;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*((273.15+Spot(3,i,k))^4);
      endfor
    endfor
    %
    Plot_score (score, h, model, names, types, spline)
  case 7
    %
    % Scoring for the query spots according to model h
    %
    h=7;
    for i=1:12
      for k=1:length(names)
        score(i,k) = x{h}(1)+x{h}(2)*Spot(3,i,k)+x{h}(3)*((273.15+Spot(3,i,k))^4);
      endfor
    endfor
    %
    Plot_score (score, h, model, names, types, spline)
endswitch
%
%-------------------------------------------------------------------------------
% We save the data for the regressions
%-------------------------------------------------------------------------------
%
save("M.csv","M")
save("Y.csv","b")
# file name: spot_finder
#
# Asunciòn, 9 marzo 2023
#
#-------------------------------------------------------------------------------
# This script performs the linear regressions performed also by the Octave script
# that goes under the same name
#-------------------------------------------------------------------------------
#
library(ppcor) # we need this for the partial correlation analysis
#
#-------------------------------------------------------------------------------
# Data 
#-------------------------------------------------------------------------------
#
Y<-read.csv(file = "Y.csv", header = F, sep =" ", comment.char = "#") # the response variable
Y<-Y[,2]
M<-read.csv(file = "M.csv", header = F, sep =" ", comment.char = "#")
M<-M[,2:5]
colnames(M)<-c("unity","Rad","Cl","meanT")
AT<-273.15+M$meanT # absolute temperature
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x3*t) 
#-------------------------------------------------------------------------------
#
R_t_re<-lm(Y~M$Rad+M$meanT)
summary(R_t_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*Cl + x3*t) 
#-------------------------------------------------------------------------------
#
C_t_re<-lm(Y~M$Cl+M$meanT)
summary(C_t_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x3*Cl + x4*t) 
#-------------------------------------------------------------------------------
#
R_C_t_re<-lm(Y~M$Rad+M$Cl+M$meanT)
summary(R_C_t_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x4*T^4) 
#-------------------------------------------------------------------------------
#

R_T4_re<-lm(Y~M$Rad+I(AT^4))
summary(R_T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*R + x3*t + x4*T^4) 
#-------------------------------------------------------------------------------
#
R_t_T4_re<-lm(Y~M$Rad+M$meanT+I(AT^4))
summary(R_t_T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*T^4) 
#-------------------------------------------------------------------------------
#
T4_re<-lm(Y~I(AT^4))
summary(T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*t + x3T^4) 
#-------------------------------------------------------------------------------
#
t_T4_re<-lm(Y~M$meanT+I(AT^4))
summary(t_T4_re)
#
#-------------------------------------------------------------------------------
# Spearman coefficients and corresponding p values
#-------------------------------------------------------------------------------
#
Spearman_Rad<-cor.test(Y,M$Rad,alternative="two.sided",method="spearman",conf.level=0.95)
Spearman_Rad
Spearman_Cl<-cor.test(Y,M$Cl,alternative="two.sided",method="spearman",conf.level=0.95)
Spearman_Cl
Spearman_meanT<-cor.test(Y,M$meanT,alternative="two.sided",method="spearman",conf.level=0.95)
Spearman_meanT
#
#-------------------------------------------------------------------------------
# Pearson coefficients, corresponding p values, and partial correlations
#-------------------------------------------------------------------------------
#
Ro_Y_R<-cor.test(Y,M$Rad,alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_R
Ro_Y_C<-cor.test(Y,M$Cl,alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_C
Ro_Y_t<-cor.test(Y,M$meanT,alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_t
Ro_Y_T4<-cor.test(Y,I(AT^4),alternative="two.sided",method="pearson",conf.level=0.95)
Ro_Y_T4
#
Ro_Y_R_t<-pcor.test(Y,M$Rad,M$meanT,method="pearson")
Ro_Y_R_t
Ro_Y_R_T4<-pcor.test(Y,M$Rad,I(AT^4),method="pearson")
Ro_Y_R_T4
Ro_Y_C_t<-pcor.test(Y,M$Cl,M$meanT,method="pearson")
Ro_Y_C_t
Ro_Y_C_T4<-pcor.test(Y,M$Cl,I(AT^4),method="pearson")
Ro_Y_C_T4
Ro_Y_t_R<-pcor.test(Y,M$meanT,M$Rad,method="pearson")
Ro_Y_t_R
Ro_Y_T4_R<-pcor.test(Y,I(AT^4),M$Rad,method="pearson")
Ro_Y_T4_R
Ro_Y_T4_T<-pcor.test(Y,I(AT^4),M$meanT,method="pearson")
Ro_Y_T4_T
#
#-------------------------------------------------------------------------------
# Data of the first environmental study
#-------------------------------------------------------------------------------
#
mydata<-read.csv(file = "correlation.csv", header = T, sep =";")
#
attach(mydata)
n<-length(Station)
Y<-c()
for (i in 1:n) Y[i]<-mean(c(Score1[i], Score2[i], Score3[i]), na.rm = T )
meanT<-Tempmean
meanP<-c()
for (i in 1:n) meanP[i]<-mean(c(Pressuremax[i],Pressuremin[i]), na.rm = T)
meanRH<-RHmean
#
#-------------------------------------------------------------------------------
# mean values
#-------------------------------------------------------------------------------
#
d<-3 # mean on d days
for (i in 1:(n-d)) {
  meanT[i]<-mean(meanT[i:(i+d)], na.rm = T)
  meanP[i]<-mean(meanP[i:(i+d)], na.rm = T)
  meanRH[i]<-mean(meanRH[i:(i+d)], na.rm = T)
  Y[i]<-mean(Y[i:(i+d)], na.rm = T)
}
AT<-273.15+meanT
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*T^4) 
#-------------------------------------------------------------------------------
#
T4_re<-lm(Y~I(AT^4))
summary(T4_re)
#
#-------------------------------------------------------------------------------
# Regression (model x1 + x2*t + x3T^4) 
#-------------------------------------------------------------------------------
#
t_T4_re<-lm(Y~meanT+I(AT^4))
summary(t_T4_re)


La maledizione di Didone

La maledizione di Didone

Aeneis, Liber IV, v 607-621

Sole, tu che illumini i giorni umani,
Giunone, che sai del mio dolore,
Ecate, che tormenti i sonni urbani.

E voi Dire e dèi d'Elissa che muore,
se sventura benevolenza vale,
ascoltatemi. Poiché l'impostore

le ancore getterà al litorale
e questo Giove comanda che accada,
almeno che un nemico eccezionale

incontri, solitario esule vada,
implori aiuto, e veda le morti
amare dei suoi e la vita non goda  

e il trono e il regno a pace iniqua porti.
Ma cada anzitempo e senza sepolcro.
Ciò chiedo con il sangue, per le sue sorti.

Terzine con rime ABA, BCB, … Di seguito il conteggio delle sillabe, tenendo conto delle sinalefe.

Soletucheilluminiigiorniumani
Giunonechesaidelmiodolore
Ecatechetormentiisonniurbani
evoiDireedéid’Elissachemuore
sesventurabenevolenzavale
ascoltatemipoichél’impostore
leancoregetteallitorale
equestoGiovecomandacheaccada
almenocheunnemicoeccezzionale
incontrisolitarioesulevada
imploriaiutoevedalemorti
amaredeisuoielavitanongoda
eiltronoeilregnoapaceiniquaporti
Macadaanzitempoesenzasepolcro.
Ciòchiedocolsangueperlesuesorti
L'intero quarto libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti. 

Sol, qui terrarum flammis opera omnia lustras;
tuque harum interpres curarum et conscia, Iuno,
nocturnisque Hecate triviis ululata per urbes,
et Dirae ultrices, et di morientis Elisae,
accipite haec: meritumque malis advertite numen, 
et nostras audite preces. Si tangere portus
infandum caput, ac terris adnare necessest:
et si fata Iovis poscunt; hic terminus haeret:
at bello audacis populi vexatus, et armis,
finibus extorris, complexu avulsus Iuli,
auxilium imploret, videatque indigna suorum
funera: nec, cum se sub leges pacis iniquae
tradiderit, regno aut optata luce fruatur:
sed cadat ante diem mediaque inhumatus arena.
Haec precor, hanc vocem extremam cum sanguine fundo.

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Sol, qui lustras flammis opera omnia terrarum;
Sole, che illumini con il fuoco tutte le attività della Terra;
et tu, Iuno, interpres et conscia harum curarum,
e tu, Giunone, intermediaria e complice di questi affanni
et Hecate ululata nocturnis triviis per urbes,
e Ecate, invocata con ululati nei trivi di notte, per le città,
et Dirae ultrices, et di morientis Elisae,
e Dirae vendici, e dèi di Elissa che muore
accipite haec: et advertite malis meritum numen, et nostras audite preces.
accettate queste [parole] e rivolgete alle sventure la meritata benevolenza, e ascoltate le mie preghiere.
Si necessest infandum caput tangere portus ac terris adnare et si fata Iovis poscunt
Se è inevitabile che lo scellerato debba toccare il porto e raggiungere la terra e questo stabilisce il volere di Giove,
hic terminus haeret: at vexatus bello et armis audacis populi,
che così sia: ma almeno sia vessato dalla opposizione armata di un popolo audace,
finibus extorris, avulsus complexu Iuli, auxilium imploret,
sia bandito dal territorio, lontano dall’abbraccio di Iulio, implori aiuto,
videatque indigna suorum funera: nec, cum se tradiderit sub leges iniquae pacis, regno aut optata luce fruatur:
assista alla morte indegna dei suoi, né – sottopostosi a un patto iniquo di pace – goda il regno e la dolce vita:
sed cadat ante diem et inhumatus media arena.
ma cada anzi tempo e resti senza sepoltura sulla spiaggia.
Haec precor, hanc vocem extremam cum sanguine fundo.
Di questo vi supplico; queste ultime parole pronuncio col sangue.

La foto di copertina è un fotogramma dello sceneggiato “Eneide”, diretto da Franco Rossi (1971). Rappresenta Didone, interpretata da Olga Karlatos.

La cognizione del dolore

La cognizione del dolore

1. Una resurrezione

Cosa pensò Michelangelo, in quel giorno di gennaio del 1506, davanti al gruppo del Laocoonte, appena dissotterrato da un campo, sul Colle Oppio? Michelangelo aveva quasi 31 anni: siamo dopo il Bacco, la Pietà e il David; prima della Cappella Sistina, e delle statue originariamente intese per la tomba di Giulio Secondo, e di quelle destinate alle tombe medicee. Per Michelangelo il Laocoonte della seconda metà del primo secolo a.C. dovette rappresentare una visione del proprio futuro, più che un cimelio di un lontanissimo passato.

Il rinvenimento del superbo capolavoro di Hagesander et Polydorus et Athenodorus rhodii, originariamente collocato in Titi imperatoris domo, secondo Plinio il Vecchio (Nat. Hist. XXXVI, 37, Ref), viene ricostruito da Irving Stone, nel suo The Agony and the Ecstasy:

Francesco Sangallo broke into the room, crying, “Father! They’ve unearthed a big marble statue in the old palace of Emperor Titus. His Holiness wants you to go at once and supervise excavating it.” A crowd had already gathered in the vineyard behind Santa Maria Maggiore. In a hollow, the bottom half still submerged, gleamed a magnificent bearded head and a torso of tremendous power. Through one arm, and turning around the opposite shoulder, was a serpent; on either side emerged the heads, arms and shoulders of two youths, encircled by the same serpent. Michelangelo’s mind flashed back to his first night in Lorenzo’s studiolo.
“It is the Laocoön,” Sangallo cried.
“Of which Pliny wrote!” added Michelangelo.

Irving Stone, The Agony and the Ecstasy, Book VII

La fonte qui è una memoria dell’infanzia del Francesco da Sangallo menzionato, figlio di Giuliano, architetto quest’ultimo che a Roma faceva parte, insieme a Michelangelo, di un circolo di artisti fiorentini attratti dalle commissioni papali. E a proprosito della biografia michelangiolesca di Irving Stone: l’autore non è uno storico dell’arte, non è un artista figurativo, non conosce l’italiano e poté usare solo le traduzioni delle fonti (quando disponibili); e non si può dire che sia un Tolstoj. Eppure il suo romanzo del 1961 (all’epoca molto popolare e tradotto anche in un bel film) è un piacevole catalogo delle opere di Michelangelo, contestualizzate, e di molte delle notizie biografiche disponibili all’epoca della stesura.

Non sappiamo cosa deve aver pensato Michelangelo, dicevo. Se davvero il suo San Matteo aveva già l’impostazione definitiva quando lo scultore lo lasciò a Firenze per partire alla volta di Roma nel 1505, egli dovette trovarsi davanti ad una versione compiuta ed estremamente evoluta della sua visione; se invece il San Matteo fu ritoccato in seguito, allora Agesandro, Polidoro e Atenodoro erano con lui, nel suo studio, mentre lavorava sul santo. Quale che sia la cronologia del San Matteo, in ogni caso l’impatto dei tre scultori di Rodi, morti e decoposti da 15 secoli, deve essere stato significativo su Michelangelo, che di certo ha presente il busto del Laocoonte mentre tenta di liberare dal “soverchio” del marmo lo schiavo morente e lo schiavo ribelle (1513).

2. Torsione nell’arte e nella natura

Ma saremmo ingiusti se concludessimo che la successione degli avvitamenti inseguiti da Michelangelo dopo il gennaio del 1506 sia completamente condizionata dal Laocoonte: basta guardare la battaglia dei centauri che il Buonarroti scolpisce da adolescente, dove si trova un inventario di tutte le forme che svilupperà nella sua vita, per accorgersi che semplicemente il fiorentino era arrivato alla medesima conclusione dei colleghi di Rodi, indipendentemente; in un’altra vita, in un altro mondo. E a proprosito, una riflessione veloce sulla torsione che ricorre nell’arte. La sintesi della torsione è l’elica, curva che la Natura usa di frequente: si pensi alla elica alpha delle proteine, alla doppia elica del DNA, alla parete cellulare delle spirochete, alla struttura del collagene, ai gusci dei Gastropoda; l’elica e la sua proiezione sul piano ortogonale all’asse, la spirale, ricorre dicevo nell’arte: si trova in Michelangelo, in Giambologna (vedi il ratto della Sabina), in Van Gogh, nelle colonne tortili del Barocco, in alcune statue ellenistiche, nelle scale (vedi la scala di Pierluigi Nervi per lo stadio di Firenze), persino nei campanili (vedi Sant’Ivo alla Sapienza), solo per fare qualche esempio; e conferisce una idea di moto a oggetti che sono fermi. La cosa interessante è che il campo delle velocità di un qualunque corpo rigido congelato in un fotogramma del suo moto è proprio un campo elicoidale. Infatti, la velocità del generico punto P del solido, in un dato istante t, è descritta dalla equazione vettoriale

Eq. 1) \overrightarrow{v_P}(t)\,=\,\overrightarrow{v_O}(t)\,+\,\overrightarrow{\omega}(t)\times\overrightarrow{OP}

dove O è un altro punto del corpo (o dello spazio solidale ad esso) e dove \overrightarrow{\omega} è la velocità angolare (vedi qui, cap IV). Ora, se si prende la curva per P la cui tangenete è \overrightarrow{v_P}(t) e la si prolunga in modo che sia tangente in ogni suo punto al valore del campo delle velocità in quello stesso punto, si ottiene una elica, comunque si scelga P (Figura 1). L’elica cioè descrive proprio la matrice matematica del moto dei corpi nello spazio, oltre ad essere, come visto, una costante nelle forme naturali, microscopiche, nanoscopiche, e macroscopiche. E sebbene queste nozioni di cinematica siano posteriori ai Philosophiae Naturalis Principia Mathematica (1687), gli artisti hanno sempre usato l’elica esattamente per suggerire una idea di moto, senza contare il fatto che l’elica sembra anche inscrivere in sé ulteriori connotazioni emotive e significati. L’elica, che non ha piani di simmetria (sebbene abbia punti di simmetria), è stata usata per animare le forme simmetrche, a un certo punto della storia dell’arte, essendo la simmetria forse il criterio di bellezza originario, quello a cui allude il poeta-pittore William Blake: “What immortal hand or eye could frame thy fearful simmetry?” (The Tyger, 1794).

Figura 1. Due curve tangenti, punto per punto, al medesimo campo vettoriale elicoidale. Il codice che genera questa figura è in appendice (risolve numericamente un sistema di tre equazioni differenziali). Sono indicati anche i versori del campo elicoidale per alcuni dei punti delle curve.

Io stesso tendo ad usare la torsione nelle mie composizioni: in Figura 2, il personaggio di spalle ha la testa che punta verso destra, mentre i suoi piedi si intuisce puntino a sinistra; dunque attraverso la sua lunghezza si realizza una rotazione del piano coronale (o frontale) di quasi 90°.

Figura 2. “You can’t win”, matita su carta, di Paolo Maccallini. Il disegno è ancora incompleto.

3. Creatori di mostri

Il Laocoonte dunque nasce una seconda volta nel 1506. Ma cosa si può dire della sua vera nascita? Tralasciando il dibattito sulla presunta presenza di un originale in bronzo più antico di un secolo, siamo davanti all’intrigante questione del rapporto tra la statua e i versi 201-224 del secondo libro della Eneide, che seguono la medesima narrazione. Virgilio scrisse l’Eneide tra il 29 e il 19 a.C.; il gruppo marmoreo fu prodotto tra il 40 e il 20 dello stesso secolo. Chi ha ispirato chi? Immagino che questa sia una domanda formulata più volte da menti ben più preparate della mia in questo genere di esercizi; io osservo solo che mentre Virgilio preferisce dei mostri (li chiama angues, serpens, dracones) che non hanno una corrispondenza con la zoologia nota (dimensioni a parte, sono serpenti con creste vermiglie: iubaeque sanguineae exsuperant undas), gli autori di Rodi decidono di seguire pedissequamente la natura, usando due pitoni, o qualcosa di molto simile a questo serpente africano, probabilmente non sconosciuto alle culture mediterranee. Riflettendo sulla scelta dei tre scultori, mi sono venute in mente le parole del costruttore di mostri per eccellenza, l’inventore della meccatronica applicata al cinema, Carlo Rambaldi, il quale in un libro del 1987 dice:

Se cerchi di andare al di là della natura e realizzare una cosa assolutamente fantastica, sei libero di fare quello che vuoi; ma se devi imitare la natura – e l’abbiamo sperimentato più volte – conviene guardare la natura.

Leonardo Pellizzari (a cura di), Carlo Rambaldi e gli Effetti Speciali, 1987

Si può dire certo che le creste non sarebbe stato possibile renderle in marmo, ed è vero probabilmente, tuttavia sono convinto che i tre di Rodi abbiano seguito il percorso mentale di Rambaldi; traiettoria che anche io, nei miei tentativi di disegno e nei miei sogni ingegneristici, ho preconizzato. Altrimenti detto: la Natura ha sempre più fantasia degli esseri umani. E la investigazione scientifica non ha fatto che confermarmi questa intuizione.

Segue la mia traduzione, in endecasillabi, dei versi di Virgilio menzionati sopra, e in appendice trovate il computo delle sillabe, i versi originali, la parafrasi in latino e la traduzione letterale.

Assegnato al culto del dio Nettuno
Laocoonte un degno toro offriva.
Ma da Tenedo adesso le calme acque
sovrastano immensi due serpenti
che speculari puntano la costa,
i colli eretti tra i flutti, vermiglie
le creste sopra le onde, immensa mole
del corpo si snoda, e sfiora il mare.
Scroscio di schiuma, e sono sulla riva,
gli occhi iniettati di sangue di fuoco,
lingue vibranti e labbra sibilanti.
Fuggiamo, a Laocoonte aspirano,
ma prima i piccoli corpi dei figli
ambedue i serpenti avvolti stringon
e ingoiano i morsi dei miseri arti.
Poi assalgono il padre accorso in aiuto
armato che nelle spire è legato;
e già su di lui torreggiano, stretto
due volte il busto, per due il collo avvinto. 
Mentre tenta di liberare i nodi,
le vesti pregne di bava letale,
grida disumane lancia alle stelle,
qual mugge il toro che l'altare fugge
scuotendo il collo, la malferma scure.

4. L’antidoto

Il Laocoonte, di marmo o di versi, è dunque la rappresentazione della sofferenza senza luce: una famiglia è spazzata via con una agonia inimmaginabile, quella del cervo mangiato vivo dal predatore, con l’aggravante della consapevolezza della morte. E poi c’è un dolore ancora più grande, inconcepito, innominabile forse: quello della moglie e madre.

Laocoonte, che qualche verso prima tentava di avvisare i troiani sulla pericolosità del cavallo di legno (“timeo Danaos et dona ferentes”), è la voce della ragione davanti al destino oscuro dell’uomo, quello di finire nel gorgo e scomparire; i troiani sono la voce della speranza, che rischia di cadere in trappola (lo vediamo nel fiorire della medicina alternativa per le malattie senza cura e nelle promesse di resurrezione dei vari culti). E’ l’islandese di Leopardi, la voce di Tolstoj in “Confessione”. E’ quello che resta, al netto delle religioni orientali che vennero dopo il mondo pagano, come antidoto. Non è un caso che Stefano Benni posizioni una copia di questa statua nella dimora del suo Achille pié veloce. Eppure nella statua stessa, nel monumento alla cognizione del dolore, c’è un antidoto: la creazione superba, la maestria, il talento strabordante, lo studio minuto della Natura. Il Laocoonte è esso stesso l’antidoto al veleno, sia nel marmo che nei versi. Ed è per questo che menziono nel titolo e nel testo il volume di Gadda: la sua Cognizione del Dolore, con la morte del fratello, la vecchiezza della madre vedova poi uccisa, la follia lucida del figlio che forse assassina la madre (forse no, c’è un indizio nel romanzo), è completamente priva di assoluzione, di resurrezione; se non nel virtuosismo linguistico e nell’analisi della natura umana. Sono opere queste che mostrano l’abisso e allo stesso tempo vi costruiscono sopra un ponte.

Figura 3. Baccio Bandinelli, Laocoonte, 1520-1525, Galleria degli Uffizi. Foto di Paolo Maccallini.

La foto che ho usato in Figura 3 non è del Laocoonte di Agesandro, Polidoro e Atenodoro, lo so. Non si tratta di un errore. La statua degli scultori di Rodi la trovate con la ricerca per immagini su Google, amesso che non sia scolpita nella vostra mente. Questo Laocoonte è la copia di Baccio Bandinelli, un artista che fu costretto dalla committenza e dalle circostanze temporali ad affrontare un gigante sul suo stesso terreno di battaglia: dovette competere con Michelangelo nella statuaria monumentale a tutto tondo, e perse tragicamente. La sua copia del Laocoonte è forse la sua statua più riuscita, se si escludono i bassorilievi per i quali aveva probabilmente più talento. Io ho conosciuto Bandinelli grazie a questa statua, che mi trovai un giorno al fondo della prospettiva di un corridoio degli Uffizi, che arrotolavo come un nastro sotto la mia sedia a rotelle, in una foresta di gambe in passeggio aleatorio.

5. Appendice

Di seguito riporto il conteggio delle sillabe per la mia traduzione, tenendo conto delle sinalefe.

assegnatoalcultodeldioNettuno
Laocoontedegnotorooffriva
madaTenedoadessolecalmeacque
sovrastanoimmensidueserpenti
chespecularipuntanolacosta
icollierettitraifluttivermiglie
lecrestesopraleondeimmensamole
delcorposisnodaesfiorailmare
scrosciodischiumaesonosullariva
gliocchiiniettatidisangueedifuoco
linguevibrantielabbrasibilanti
fuggiamoalaocoonteaspirano
maprimaipiccolicorpideifigli
ambedueiserpentiavvoltistringon
eingoianoimorsideimiseriarti
poiassalgonoilpadreaccorsoinaiuto
armatochenellespireèlegato
egiàsudiluitorreggianostretto
duevolteilbustoperdueilcolloavvinto
mentretentadiliberareinodi
levestipregnedibavaletale
gridadisumanelanciaallestelle
qualmuggeiltorochelaltarefugge
scuotendoilcollolamalfermascure

L’intero secondo libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti.

Laocoon, ductus Neptuno forte sacerdos,
solemnes taurum ingentem mactabat ad aras. 
Ecce autem gemini a Tenedo tranquilla per alta
(horresco referens) immensis orbibus angues
incumbunt pelago, pariterque ad litora tendunt:
pectora quorum inter fluctus arrecta, iubaeque
sanguineae exsuperant undas: pars cetera pontum
pone legit, sinvatque immensa volumine terga.
Fit sonitus spumante salo: iamque arva tenebant,
ardentesque oculos suffecti sanguine, et igni,
sibila lambebant linguis vibrantibus ora.
Diffugimus visu exsangues: illi agmine certo
Laocoonta petunt, et primum parva duorum
corpora natorum serpens amplexus uterque
implicat, et miseros morsu depascitur artus.
Post ipsum auxilio subeuntem ac tela ferentem
corripiunt spirisque ligant ingentibus; et iam
bis medium amplexi, bis collo squamea circum
terga dati, superant capite et cervicibus altis.
Ille simul manibus tendit divellere nodos
perfusus sanie vittas atroque veneno;
clamores simul horrendos ad sidera tollit,
quales mugitus, fugit cum saucius aras
taurus et incertam excussit cervice securim.
At gemini lapsu delubra ad summa dracones
effugiunt, saevaeque petunt Tritonidis arcem,
sub pedibusque deae, clypeique sub orbe teguntur.

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Laocoon, ductus sacerdos Neptuno forte, mactabat ingentem taurum ad aras solemnes.
Laocoonte, nominato sacerdote di Nettuno per sorteggio, uccideva un grande toro presso i solenni altari.
Ecce autem a Tenedo per alta tranquilla [aequora] angues gemini (horresco referens) incumbunt pelago immensis orbibus, pariterque tendunt ad litora:
Ma ecco che da Tenedo, attraverso le acque tranquille, due serpenti gemelli (inorridisco nel raccontarlo) sovrastano il mare con le spire immense, e puntano la riva all’unisono:
pectora quorum arrecta [sunt] inter fluctus, iubaeque sanguineae exsuperant undas: pars cetera legit pontum, pone, sinvatque volumine immensa terga [= terga immenso volumine, ipallage].
i petti dei quali sono eretti sui flutti, e le creste vermiglie si innalzano oltre le onde: il resto del corpo sfiora il mare, dietro, e snoda il dorso in immense spire.
Sonitus fit salo spumante: iamque tenebat arva et, oculos ardentes [acc. di rel.] suffecti sanguine et igni, lambebant sibila ora linguis vibrantibus.
Un gorgoglio è generato dalla mare spumeggiante: già avevano raggiunto la costa e, con occhi ardenti iniettati di sangue e fuoco, lambivano le bocche sibilanto con lingue vibranti.
Diffugimus exangues visu: illi petunt Laocoonta, agmine certo, et primum uterque serpens amplexus implicat parva corpora duorum natorum, et depascitur miseros artus morsu.
Scappiamo con visi esangui: essi puntano Laocoonte, con andatura decisa, e prima i due serpenti stringono, avvolti, i piccoli corpi dei due figli, e divorano i miseri arti a morsi.
Post corripiunt ipsum [Laocoonta], auxilio subeuntem ac tela ferentem, et ligant spiris ingentibus;
Quindi assalgono lo stesso Laocoonte, che accorre in soccorso e porta delle armi, e lo avvincono con le ingenti spire;
et iam amplexi bis medium [acc. di rel.], circumdati [timesi] squamea terga [acc. di rel.] bis collo, superant altis capite et cervicibus.
e stretto due volte il busto [di Laocoonte], due volte avvolte intorno al collo le terga squamose, già torreggiano con il collo e il capo.
Ille simul tendit divellere nodos manibus, vittas perfusus [acc. alla greca] sanie et atro veneno; simul tollit horrendos clamores ad sidera:
Lui, con le bende imbevute di bava e veleno nero, tenta di sciogliere i nodi con le mani mentre leva orrende grida al cielo,
quales mugitus taurus [tollit], cum fugitsaucius aras, et excussit incertam securim cervice.
come i muggiti del toro che fugge ferito dall’altare mentre si squote dal collo la scure malferma.
At gemini dracones effugiunt lapsu ad summa delubra, et petunt arcem saevae Tritonidis, et teguntur sub pedibus deae, et sub orbe clypei.
E i draghi gemelli fuggono strisciando verso gli alti santuari, e si dirigono all’altare della ostile Tritonia [Atena], e si nascondono sotto i piedi della dea, sotto il cerchio dello scudo.

Di seguito il codice in Octave che genera Figura 1, risolvendo numericamente (metodo di Runge-Kutta) il sistema di tre equazioni differenziali ordinarie seguente:

Eq. 2) \begin{cases}\frac{dx(s)}{ds}\,=\,\tau_{x}(s)\\\frac{dy(s)}{ds}\,=\,\tau_{y}(s)\\\frac{dz(s)}{ds}\,=\,\tau_{z}(s)\end{cases}

dove \overrightarrow{\tau} è il versore relativo al campo vettoriale in Eq. 1. Il codice funziona qualunque sia il campo vettoriale inserito nella funzione interna allo script (vectorial_field). Ho scritto questo codice nel 2021, come dimostrazione del metodo di ricostruzione delle fibre di materia bianca nella risonanza magnetica cerebrale con trattografia (Maccallini P. 2021).

% file name = tractography
% date of creation = 05/02/2021
% it plots the trajectory of a fibre, given a vectorial field of diffusion
% eigenvector epsilon_1
clear all
close all
% vectorial field
v = [0,0,3];
w = [0,0,3];
ic = [1.5,1.5,0];
delta_s = 0.5;
function v_f = vectorial_field (x,y,z,v,w)
  v_f = v + cross(w,[x,y,z]);
  v_f = v_f/sqrt(v_f(1)^2+v_f(2)^2+v_f(3)^2);
endfunction
% we set the initial conditions for the first fiber
lambda(1:4,1:3)=0.;
x(1) = ic(1);
y(1) = ic(2);
z(1) = ic(3);
% integration for the first fiber
vector = vectorial_field (x(1),y(1),z(1),v,w);
lambda(1,1) = vector(1);
lambda(1,2) = vector(2);
lambda(1,3) = vector(3);
n = 40;
for i=1:n-1
  for k=2:4
    vector = vectorial_field (x(i)+lambda(k,1)*delta_s/2,y(i)+lambda(k,2)*delta_s/2,z(i)+lambda(k,3)*delta_s/2,v,w);
    lambda(k,1) = vector(1);
    lambda(k,2) = vector(2);
    lambda(k,3) = vector(3);
  endfor
  x(i+1) = x(i)+(lambda(1,1)+2*lambda(2,1)+2*lambda(3,1)+lambda(4,1))*delta_s/6;
  y(i+1) = y(i)+(lambda(1,2)+2*lambda(2,2)+2*lambda(3,2)+lambda(4,2))*delta_s/6;
  z(i+1) = z(i)+(lambda(1,3)+2*lambda(2,3)+2*lambda(3,3)+lambda(4,3))*delta_s/6;
  vector = vectorial_field (x(i+1),y(i+1),z(i+1),v,w);
  quiver3 ( x(i+1),y(i+1),z(i+1),vector(1),vector(2),vector(3),'-k' )
  hold on
endfor
plot3 (x(1:n),y(1:n),z(1:n),'-r','LineWidth',4)
pbaspect ([1, 1, 1])
hold on
% we set the initial conditions for the second fiber
ic = [2.8,2.8,0];
x(1) = ic(1);
y(1) = ic(2);
z(1) = ic(3);
% integration for the second fiber
vector = vectorial_field (x(1),y(1),z(1),v,w);
lambda(1,1) = vector(1);
lambda(1,2) = vector(2);
lambda(1,3) = vector(3);
for i=1:n-1
  for k=2:4
    vector = vectorial_field (x(i)+lambda(k,1)*delta_s/2,y(i)+lambda(k,2)*delta_s/2,z(i)+lambda(k,3)*delta_s/2,v,w);
    lambda(k,1) = vector(1);
    lambda(k,2) = vector(2);
    lambda(k,3) = vector(3);
  endfor
  x(i+1) = x(i)+(lambda(1,1)+2*lambda(2,1)+2*lambda(3,1)+lambda(4,1))*delta_s/6;
  y(i+1) = y(i)+(lambda(1,2)+2*lambda(2,2)+2*lambda(3,2)+lambda(4,2))*delta_s/6;
  z(i+1) = z(i)+(lambda(1,3)+2*lambda(2,3)+2*lambda(3,3)+lambda(4,3))*delta_s/6;
  vector = vectorial_field (x(i+1),y(i+1),z(i+1),v,w);
  quiver3 ( x(i+1),y(i+1),z(i+1),vector(1),vector(2),vector(3),'-k' )
  hold on
endfor
plot3 (x(1:n),y(1:n),z(1:n),'-b','LineWidth',4)
pbaspect ([1, 1, 1])
grid on

Summer simulation, a correlation study

Summer simulation, a correlation study

Abstract

I report here on a successful attempt at reproducing the improvement in my ME/CFS symptoms that I usually experience during summer by means of artificially manipulating the temperature of the air, humidity, and the infrared radiation inside a room I spent five months in, during the period from December to April 2022. I show that the improvement is not correlated with the physical parameters of the air (temperature, relative and absolute humidity, atmospheric pressure, air density, dry air density, saturation vapor pressure, and partial vapor pressure). I hypothesize that it is driven instead by either the mid-wave infrared radiation emitted by a lamp used in the experiment or by the longwave infrared radiation emitted by the walls of the room in which I spent the months of the experiment.

1) Introduction

My ME/CFS improves during summer, in the period of the year that goes from May/June to the end of September (when I am in Rome, Italy). I don’t know why. In a previous study (Maccallini P. 2022), I analyzed the correlation between my symptoms and several environmental parameters, during three periods covering a total of 190 days: in one, I improved while the season was going toward summer, in another one we were in full-blown summer, and in the third one my functioning declined while summer was fading away. The statistical analysis showed a positive correlation between my functionality score and the temperature of the air and a negative correlation between my functionality score and air density and dry air density (remember that the higher the functionality score, the better I feel). No correlation was found between my functionality score and: relative humidity, absolute humidity, atmospheric pressure, and the concentration of particulate with a diameter below or equal to 2.5\,\mu m. While the absence of correlation can be used to rule out causation, the presence of correlation does not mean automatically causation. Moreover, since air density and dry air density are strongly inversely correlated with air temperature, the correlations with air density might be driven by the correlation with air temperature (and vice-versa). In order to further investigate the nature of these correlations, I planned a second study, this time performed inside a chamber where I could manipulate the temperature of the air, the content of water in the air, and the amount of infrared radiation I was hit by. I called this chamber “Summer Simulator” because I used several devices to obtain, during the months from December to May, the conditions that we usually have in Rome during summer. I lived inside the simulator while I collected a functionality score, three times per day, and while I measured (every 10 minutes) the temperature of the air, relative humidity, and atmospheric pressure. The data for the months from January to April were used to study how my symptoms correlated with the environmental parameters I could directly measure and those that I could mathematically derive.

2) Methods

2.1) Data collection

I used a Bresser WiFi 4-in-1 Weather Station (see figure 1) to measure the temperature of the air, pressure, and relative humidity inside the room I spent almost all my time during the experiment. Measures were registered every 10 minutes and sent to the console which uploaded them to my Weathercloud account, via WiFi. The barometer was calibrated by using the closest weather station of the meteorological network of Rome (R). I registered a functionality score three times a day (value from 3 to 7, the higher the better) to use for the search for correlations with environmental data. The data that were employed were those of January, February, March, and April 2022. I also used the daily functionality score collected in 2017, during the same months, for testing the effect of the Summer Simulator on my symptoms.

Figure 1. Bresser 4-in-1 sensor: I used it to measure the temperature of the air, atmospheric pressure, and relative humidity inside the simulator. In the second image, you see the interface of the weather station (left) and a CO2 sensor I used to ensure that the air exchange in the room was adequate.

2.2) Summer Simulator

Simulation of summer was attempted with the following settings. I lived for 5 months in a room of 9\,m^2 . The temperature was controlled by a heat pump (Electrolux EXP26U558HW) that collects air from inside the room, divides it into two fluxes, transfers heat from one to the other (by cycles of compression-evaporation of refrigerant R290), and releases the warmer flux inside and the other one outside the window. The humidity was controlled by two/three ultrasonic mist humidifiers that release mist which is then turned into vapor in a fraction that depends on the temperature of the air (Figure 2).

Figure 2. Ultrasonic mist humidifiers.

To simulate thermal radiation, I used an infrared heater (Turbo TN35E, figure 3) coupled with a chamber with walls covered by mylar, a material that reflects most of the thermal radiation; the chamber was built around the bed, and it had only one side open, to allow for air circulation (figure 4).

Figure 3. Infrared heater, Turbo TN35E.

Figure 4. The infrared chamber with walls made up of mylar, a material that reflects thermal radiation. On the right, you can see the heat pump (white) and the pipeline of the exhausted air, behind the curtain, that leads outside, through a hole in the window.

The infrared heater was, on average, at a distance of 0.8 m from the left side of the bed. It emits most of its power in the mid-wave infrared range (1-4 \mu m).

2.3) Mathematical model for the infrared radiation

I built a mathematical model for the radiation from the lamp (Maccallini P. 2022) which predicts that the power per unit of area of a plane parallel to yz (see figure 4) centered in P\equiv(x_P,\,y_P,\,z_P) is given by

1) W_\bot(x_P, y_P,z_P)\,=\,I_\xi\lg{\frac{\sqrt{(\frac{L}{2}-y_P)^2+x_P^2 +z_P^2 }+\frac{L}{2}-y_P}{\sqrt{(\frac{L}{2}-y_P)^2+x_P^2 +z_P^2 }-(\frac{L}{2}+y_P)}}

where L = 0.53 m is the length of the emitting surface of the lamp on the y axis and where

2) I_\xi\,=\,\frac{e\Pi(1-4b^2)\sqrt{1-4c^2}}{8\pi hLbc[F(\arctan\sqrt{\frac{1-4c^2}{4c^2}},\sqrt{\frac{1-4b^2}{1-4c^2}})-E(\arctan\sqrt{\frac{1-4c^2}{4c^2}},\sqrt{\frac{1-4b^2}{1-4c^2}})]}

In this formula, e is the efficiency of the conversion of electrical power into mid-wave infrared emission (it is 93% according to the manufacturer) while \Pi is the power absorbed by the device (about 800 W, according to the measurements performed by a power meter) and where F and E are the elliptic functions of the first and second kind, respectively (Maccallini P 2013). Parameters b and c (the semi-axes of the ellipsoid in figure 5, in the directions y and z, respectively) depend on how the flux of radiant power is concentrated by the reflector of the lamp. In my model, they are undetermined and must be derived by a minimum of two independent measures of power per unit area. But in the absence of these measures, we can use the values for which we have the absolute minimum for the function I_\xi (b, c) which is reached for b = 0.49, c = 0.36 (assuming c < b < 0.5).

Figure 5. On the left, the systems of coordinates used for building the mathematical model of the infrared heater. On the right, the detail of the ellipsoid that describes the concentration of the radiant power that exits the heater as a result of the power released by the bulb and the power reflected by the reflector behind the bulb; this ellipsoid is represented as a sphere on the left side of this figure. All the details of the model can be found in (Maccallini P. 2022).

The solution of the model (equations 1 and 2) was determined analytically, the values for the elliptic functions were calculated by employing Wolfram Mathematica 5.2 as a function of b and c and saved in a csv file, then the output of the lamp was calculated by a custom script written in Octave (Maccallini P. 2022) that used the output from the Mathematica script. Note that Octave does not have a built-in function for the elliptic functions and a numerical integration by Simpson’s rule led to unsatisfactory results, as detailed in the already mentioned reference. The prediction for a plane parallel to yz at a distance x_P\,=\,0.8\,m from O, is reported in figure 6, where it can be seen that the maximum of W_\bot is reached for P\equiv(0.8,\,0,\,0) and its value is about 376 \frac{W}{m^2}.

Figure 6. The power per unit of area orthogonal to the plane zy (W_\bot), as a function of x_P, y_P, z_P, for x_P\,=\,0.8\,m.

2.4) Derived environmental parameters

The weather station only measured air temperature, atmospheric pressure, and relative humidity, every 10 minutes. The measures were then uploaded via WiFi to a server and downloaded to my computer from my Weathercloud account. To calculate the daily means of these parameters I designed an algorithm that takes into account missing data, as follows: it calculates an hourly mean measure when at least one measure is available for that hour; it fills isolate missing hourly means with the mean between the measure of the hour before and the one of the following hour; it then calculates the daily mean if the hourly means of at least 21 hours are present for each day, otherwise the daily mean is considered as a missing value. From the hourly means of temperature, relative humidity, and pressure, I calculated the hourly means for saturation vapor pressure (SVP), partial vapor pressure (PVP), absolute humidity (AH), dry air density (DAD), and air density (AD), by means of the following formulae:

3) SVP\;=\;6.112e^{\frac{17.62t}{243.12+t}}

4) PVP\,=\,RH\frac{SVP}{100}

5) AH\,=\,100\mu_w\frac{PVP}{R(273.15\,+\,t)}

6) DAD\,=\,100\mu_{dry}\frac{p\,-\,PVP}{R(273.15\,+\,t)}

7) AD\,=\,AH\,+\,DAD

where t, p, RH are air temperature, barometric pressure, and relative humidity, respectively, while \mu_w\,=\,18.015\frac{g}{mol} is the molecular weight of water, \mu_{dry}\,=\,28.97\frac{g}{mol} is the molecular weight of dry air, R\,=\,8.31\frac{J}{K\cdot mol} is the constant of gasses, and where we express temperature in °C and pressure in hPa. These formulae are taken from chapter 4 of the Guide to Instruments and Methods of Observation by the World Meteorological Organization (R) and are derived and discussed in (Maccallini P. 2021). Once obtained the hourly means for the derived environmental measures, the corresponding daily means were computed by using the same method described for t, p, and RH. In figure 8, I reported, as an example, the plots for the environmental parameters (daily means) and the mean daily score for the month of March. All the other plots can be obtained by running the R script reported at the end of this article, in the same folder containing the raw data (that are available, just before the script, for download).

2.5) Statistical analysis

To assess the effect of the summer simulation on my symptoms, I compared the functionality score collected in 2017 (from January to April) with the score collected during the same months of 2022, while living inside the Summer Simulator. The null hypothesis was tested by running the Wilcox test. The correlations between the daily mean score and the environmental parameters were assessed by Spearman’s correlation coefficient and the significance of each correlation was also tested. All the calculations were performed by a custom R script written by myself, available, along with the row data, at the bottom of this page.

3) Results

The comparison between the mean daily scores for the months of January, February, March, and April 2017 and the same parameter for the same months of the year 2022 show that the Summer Simulator has raised the mean daily score in a statistically significant fashion: p value = 1.897\cdot10^{-10}; see figure 7.

Figure 7. Comparison between the mean daily functionality score in 2017 (from January to April), on the right, and the same score in 2022 (same months), while living inside the Summer Simulator, on the left. The difference is statistically significant, reaching a p value of 1.897\cdot10^{-10}. In 2017 I was following a therapy that I judged mildly effective, which allowed me to take the functionality score three times a day during the cold months, which is something that I usually stop doing when I get worse in Autumn, also because the score would always be the lowest one. The diagram is a box and whisker plot, with the indication of the 1st quantile, the median (2nd quantile), and the 3rd quantile.

Figure 8. Daily mean values for each one of the environmental parameters considered in this study and for the functionality score, for the month of March.

The correlations between the mean daily score and the mean daily values of the environmental parameters, and the corresponding p values, are collected in Table 1. After correction for multiple comparisons (Benjamini-Hochberg method), none of the correlations reaches statistical significance.

Parameter
(daily mean)
\rhopp’
Temperature-0.21960.020590.1421
Relative humidity-0.18600.050680.1928
Pressure0.057640.54970.5497
Saturation vapor pressure-0.22140.019550.1421
Partial vapor pressure-0.20810.028420.1421
Absolute humidity-0.20980.027110.1421
Dry air density0.16860.078330.1928
Air density0.15930.096410.1928

Table 1. Correlations between the mean daily functionality score and several environmental parameters (Spearman’s rank correlation coefficient) and the corresponding p values before and after correction for multiple comparisons (Benjamini-Hochberg method).

I run a similar analysis with another method, too: I compared the daily mean temperatures for days with a mean functionality score above 5 and the daily mean temperature for the days with a score below 5, by running the Wilcox test; I repeated this same analysis for all the other environmental parameters (see Table 2 and figure 8).

Figure 8. For each environmental parameter, you find here the comparison between the mean daily value corresponding to days with a mean functionality score above 5, equal to 5, and below 5. Box and whisker plots, with also the indication of the means, as red dots. The p values for the comparisons between days with a mean functionality score below 5 and above 5 are collected in table 2.

Parameterpp
Temperature0.026940.1813
Relative humidity0.1330.2112
Pressure0.21120.2112
Saturation vapor pressure0.025350.1813
Partial vapor pressure0.063240.1897
Absolute humidity0.062130.1897
Dry air density0.030380.1813
Air density0.036250.1813

Table 2. For each environmental parameter, I compared the daily mean value corresponding to days with a functionality score above 5, with the same value for days with a functionality score below 5 (Wilcox test) and I corrected for multiple comparisons (Benjamini-Hochberg method).

4) Discussion

Simulation of summer by raising the air temperature, absolute humidity, and infrared radiation did show to improve my symptoms when I compared my daily functionality score with the score collected for the same period of the year, but in 2017, while I was following another therapy that I judged mildly effective (figure 7). Yet, no correlation reached statistical significance between my functionality score and the environmental parameters that could be measured or derived (temperature, relative and absolute humidity, atmospheric pressure, saturation vapor pressure, partial vapor pressure, dry air density, air density). If we accept that the summer simulation has really improved my condition (i.e. if we rule out a placebo effect), we must admit that the improvement was due to either some combination of the aforementioned parameters or something else. The only other parameter I could exert my control on was infrared radiation by an infrared heater that delivered a power of about 380\,\frac{W}{m^2} on the vertical plane by the left side of my bed, according to a mathematical model of the lamp (figure 6). This radiation was then partially reflected by the surfaces covered in mylar of my infrared chamber, so that it hit my body from other directions too, even though I have not built a model for the whole infrared chamber, yet.

One possible explanation, to my understanding, for the results of this study, is then that the improvement was driven by some effect of the radiation from the lamp, either directly on my body or indirectly to some other parameter of the environment which in turn affected my biology. Importantly, the absence of correlation with air temperature, air density, and dry air density reported by the present study suggests that the significant correlations found in the previous study (Maccallini P. 2022) between my functionality score and the three mentioned parameters were driven by something else that correlates with temperature (which negatively correlates with air density and dry air density). We know that there is an almost linear positive correlation between the temperature of the air and longwave infrared radiation from the Earth into space (Koll DDB and Cronin TW 2018), while the emission of the surface of the Earth within a short distance from it must follow the Stefan-Boltzman law so that it is proportional to T^4, where T is the temperature of the air at the level of the surface, expressed in Kelvin. But it should be noted that while 99% of the power emitted by the Earth as infrared radiation has a wavelength above 5\,\mu m, my infrared heater emits in the range 1-4\,\mu m. So, my artificial source of radiation does not simulate the radiation from the Earth, if we consider the wavelength (while it does from the point of view of the total power, as we will see in a following study, already concluded). But it could be considered that the radiation from the lamp did end up hitting the walls of my room, which in turn released their thermic energy as long wave infrared radiation. It is conceivable then that both in the Summer Simulator and in real summer, my improvements might be driven by far infrared radiation. Another possibility is that the improvement was due to the infrared radiation emitted by my body (long wave infrared radiation) and reflected back to me by the mylar coating of the infrared chamber.

I can’t rule out a placebo effect of the Summer Simulator, even though it showed greater effectiveness than another therapy I was following in 2017, which I considered mildly effective. The difficulty of assessing the effectiveness of a treatment by a subjective score can hardly be overestimated. The identification of objective measures that can be routinely used to score the level of symptoms is of paramount importance for correlation studies like the present one.

5) Conclusions

By simulating summer during the months from January to April of 2022, I experienced an improvement in my symptoms similar to the one I usually experience during summer (although of a lesser magnitude). The simulation was achieved by increasing air temperature and absolute humidity, by using an infrared heater, and by living inside a chamber covered with mylar, a material that reflects most of the thermal radiation, so to avoid dispersion of the radiation from the heater. The improvement does not correlate with any of the parameters of the air (temperature, absolute and relative humidity, saturation vapor pressure, partial vapor pressure, density of the air, density of dry air, atmospheric pressure). One possible explanation for my improvement while living inside the Summer Simulator is that it was due to either the direct radiation from the heater (which is mid-wave infrared radiation) or the radiation from the walls heated by the lamp and the air. The latter radiation is far infrared radiation, the same radiation emitted by the Earth, which linearly correlates with air temperature and which might drive the improvements I experience during summer and the correlation between my functionality score and air temperature reported in a previous study.

6) Funding

This study was supported by those who donated to this website.

7) Supplementary material

The environmental measures and the symptom scores used for this study are available for download:

Score_control_Summer_Simulator.csv

Score_Summer_Simulator.csv

Weathercloud_2022_1.csv

Weathercloud_2022_2.csv

Weathercloud_2022_3.csv

Weathercloud_2022_4.csv

The mathematical model of the infrared heater is available here for download. The script I wrote in R for the statistical analyses is the following one.

# file name: summer_simulator
#
# year: 2022
# month: 08
# day: 31
#
#-------------------------------------------------------------------------------
# We read the measures from Bresser Weather Station
#-------------------------------------------------------------------------------
#
# We set the names of the columns for the data.frames containing environmental data
#
cn<-c("Date","Tempin","Temp","Chill","Dewin","Dew","Heatin","Heat","Humin","Hum",
      "Wspdhi","Wspdavg","Wdiravg","Bar", "Rain", "Rainrate","Solarrad","Uvi")
#
# We read the environmental data
#
Jan_2022<-read.csv("Weathercloud Paolo WS 2022-01.csv", sep = ";", col.names = cn, header = T)
Feb_2022<-read.csv("Weathercloud Paolo WS 2022-02.csv", sep = ";", col.names = cn, header = T)
Mar_2022<-read.csv("Weathercloud Paolo WS 2022-03.csv", sep = ";", col.names = cn, header = T)
Apr_2022<-read.csv("Weathercloud Paolo WS 2022-04.csv", sep = ";", col.names = cn, header = T)
List_2022<-list(Jan_2022, Feb_2022, Mar_2022, Apr_2022)
#
# We set some parameters
#
mis<-3 # the highest number of missing hours accepted for a day
muw<-18.01528 # molecular weight of water (g/mol)
mud<-28.97 # molecular weight of dry air (g/mol)
R<-8.31 # universal constant of gasses (J/(K*mole))
month_name<-c("January", "February", "March", "April")
#
#-------------------------------------------------------------------------------
# We work on the score
#-------------------------------------------------------------------------------
#
# We set the names of the columns for the data.frame containing the score
#
cn<-c("Year","Month","Day","score_1","score_2","score_3")
#
# We read the scores
#
Score<-read.csv("Score_Summer_Simulator.csv", sep = ";", col.names = cn, header = T)
Score_control<-read.csv("Score_control_Summer_Simulator.csv", sep = ";", col.names = cn, header = T)
#
attach(Score)
#
ms<-c(rep(0,31*4))
#
# We calculate the daily mean score
#
for (d in 1:length(Year)) {
  if (is.na(score_1[d])==F&is.na(score_2[d])==F&is.na(score_3[d])==F) {
    ms[d]<-(score_1[d] + score_2[d] + score_3[d])/3  
  } else ms[d]<-NA
}
#
attach(Score_control)
#
ms_c<-c(rep(0,length(Year)))
#
# We calculate the daily mean score
#
for (d in 1:length(Year)) {
  if (is.na(score_1[d])==F&is.na(score_2[d])==F&is.na(score_3[d])==F) {
    ms_c[d]<-(score_1[d] + score_2[d] + score_3[d])/3  
  } else ms[d]<-NA
}
#
# We test the effect of the simulator 
#
wilcox.test(ms, ms_c)
boxplot(ms, ms_c, ylab = "score", names = c("summer simulator","other"))
#
#-------------------------------------------------------------------------------
# We calculate mean values for temp (°C), relative humidity (%), and atmospheric 
# pressure (hPa) 
#-------------------------------------------------------------------------------
#
# We initialize the arrays that will contain the daily means of the environmental 
# data
#
t<-c(rep(0,31*4))
rh<-c(rep(0,31*4))
p<-c(rep(0,31*4))
svp<-c(rep(0,31*4))
pvp<-c(rep(0,31*4))
ah<-c(rep(0,31*4))
dad<-c(rep(0,31*4))
ad<-c(rep(0,31*4))
#
#-------------------------------------------------------------------------------
# We work on each month
#-------------------------------------------------------------------------------
#
for (q in 1:4) {
  index<-q
  add<-31*(q-1)
  attach(List_2022[[q]])
  #
  # We extract the day of the month, the year, the hour from column Date
  #
  DateR<-read.table(text=Jan_2022[,1], sep ="/")
  DateR2<-read.table(text=DateR[,3], sep =" ")
  DateR3<-read.table(text=DateR2[,2], sep =":")
  #
  #-------------------------------------------------------------------------------
  #
  first_day<-DateR[1,1]
  last_day<-DateR[length(DateR[,1]),1]
  #
  # We calculate the hourly mean for temperature (°C)
  #
  Temp_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  num<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      for (j in 1:length(DateR[,1])) {
        if ( DateR[j,1]==d & DateR3[j,1]== h-1) {
          if (is.na(Temp[j])==F) {
            Temp_mean[d,h]<-(Temp_mean[d,h] + Temp[j])
            num[d,h]<-(num[d,h]+1)
          }
        }
      }
    }
  }
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (num[d,h]>0) Temp_mean[d,h]<-Temp_mean[d,h]/num[d,h] else Temp_mean[d,h]<-NA
    }
  }  
  #
  # We fill isolate missing values
  #
  for (d in first_day:last_day) {
    for (h in 2:23) {
      if (is.na(Temp_mean[d,(h-1)])==F&is.na(Temp_mean[d,h])==T&is.na(Temp_mean[d,(h-1)])==F) {
        Temp_mean[d,h]<-(Temp_mean[d,(h-1)]+Temp_mean[d,(h+1)])/2
      }
    }
  }  
  for (d in (first_day+1):(last_day-1)) {
    if (is.na(Temp_mean[(d-1),(24)])==F&is.na(Temp_mean[d,1])==T&is.na(Temp_mean[d,2])==F) {
      Temp_mean[d,1]<-(Temp_mean[(d-1),24]+Temp_mean[d,2])/2
    }
  }  
  #
  # We calculate the daily mean for temperature (°C)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(Temp_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) t[add+d]<-mean(Temp_mean[d,],na.rm = T) else t[add+d]<-NA
  }
  #
  # We calculate the hourly mean relative humidity (%)
  #
  RH_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  num<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      for (j in 1:length(DateR[,1])) {
        if ( DateR[j,1]==d & DateR3[j,1]== h-1) {
          if (is.na(Hum[j])==F) {
            RH_mean[d,h]<-(RH_mean[d,h] + Hum[j])
            num[d,h]<-(num[d,h]+1)
          }
        }
      }
    }
  }
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (num[d,h]>0) RH_mean[d,h]<-RH_mean[d,h]/num[d,h] else RH_mean[d,h]<-NA
    }
  }  
  #
  # We fill isolate missing values
  #
  for (d in first_day:last_day) {
    for (h in 2:23) {
      if (is.na(RH_mean[d,(h-1)])==F&is.na(RH_mean[d,h])==T&is.na(RH_mean[d,(h-1)])==F) {
        RH_mean[d,h]<-(RH_mean[d,(h-1)]+RH_mean[d,(h+1)])/2
      }
    }
  } 
  for (d in (first_day+1):(last_day-1)) {
    if (is.na(RH_mean[(d-1),(24)])==F&is.na(RH_mean[d,1])==T&is.na(RH_mean[d,2])==F) {
      RH_mean[d,1]<-(RH_mean[(d-1),24]+RH_mean[d,2])/2
    }
  } 
  #
  # We calculate the daily mean relative humidity (%)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(RH_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) rh[add+d]<-mean(RH_mean[d,],na.rm = T) else rh[add+d]<-NA
  }
  #
  # We calculate the hourly mean pressure (hPa)
  #
  P_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  num<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      for (j in 1:length(DateR[,1])) {
        if ( DateR[j,1]==d & DateR3[j,1]== h-1) {
          if (is.na(Hum[j])==F) {
            P_mean[d,h]<-(P_mean[d,h] + Bar[j])
            num[d,h]<-(num[d,h]+1)
          }
        }
      }
    }
  }
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (num[d,h]>0) P_mean[d,h]<-P_mean[d,h]/num[d,h] else P_mean[d,h]<-NA
    }
  }  
  #
  # We fill isolate missing values
  #
  for (d in first_day:last_day) {
    for (h in 2:23) {
      if (is.na(P_mean[d,(h-1)])==F&is.na(P_mean[d,h])==T&is.na(P_mean[d,(h-1)])==F) {
        P_mean[d,h]<-(P_mean[d,(h-1)]+P_mean[d,(h+1)])/2
      }
    }
  } 
  for (d in (first_day+1):(last_day-1)) {
    if (is.na(P_mean[(d-1),(24)])==F&is.na(P_mean[d,1])==T&is.na(P_mean[d,2])==F) {
      P_mean[d,1]<-(P_mean[(d-1),24]+P_mean[d,2])/2
    }
  } 
  #
  # We calculate the daily mean pressure (hPa)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(P_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) p[add+d]<-mean(P_mean[d,],na.rm = T) else p[add+d]<-NA
  }
  #
  # We calculate hourly mean saturation vapor pressure (hPa)
  #
  Svp_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (is.na(Temp_mean[d,h])==F) {
        Svp_mean[d,h]<-6.112*exp((17.62*Temp_mean[d,h])/(243.12 + Temp_mean[d,h]))
      } else Svp_mean[d,h]<-NA 
    }
  }
  #
  # We calculate daily mean saturation vapor pressure (hPa)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(Svp_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) svp[add+d]<-mean(Svp_mean[d,],na.rm = T) else svp[add+d]<-NA
  }
  #
  # We calculate hourly partial vapor pressure (hPa)
  #
  Pvp_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (is.na(Svp_mean[d,h])==F&is.na(RH_mean[d,h])==F) {
        Pvp_mean[d,h]<-RH_mean[d,h]*Svp_mean[d,h]/100
      } else Pvp_mean[d,h]<-NA 
    }
  }
  #
  # We calculate daily mean partial vapor pressure (hPa)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(Pvp_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) pvp[add+d]<-mean(Pvp_mean[d,],na.rm = T) else pvp[add+d]<-NA
  }
  #
  # We calculate hourly absolute humidity (g/m^3)
  #
  AH_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (is.na(Pvp_mean[d,h])==F&is.na(Temp_mean[d,h])==F) {
        AH_mean[d,h]<-100*Pvp_mean[d,h]*muw/( R*(273.15 + Temp_mean[d,h]) )
      } else AH_mean[d,h]<-NA 
    }
  }
  #
  # We calculate daily mean absolute humidity (g/m^3)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(AH_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) ah[add+d]<-mean(AH_mean[d,],na.rm = T) else ah[add+d]<-NA
  }
  #
  # We calculate hourly mean dry air density (g/m^3)
  #
  DAD_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (is.na(Pvp_mean[d,h])==F&is.na(Temp_mean[d,h])==F&is.na(P_mean[d,h])==F) {
        DAD_mean[d,h]<-100*(P_mean[d,h]-Pvp_mean[d,h])*mud/( R*(273.15 + Temp_mean[d,h]) )
      } else DAD_mean[d,h]<-NA 
    }
  }
  #
  # We calculate daily mean dry air density (g/m^3)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(DAD_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) dad[add+d]<-mean(DAD_mean[d,],na.rm = T) else dad[add+d]<-NA
  }
  #
  # We calculate hourly mean air density (g/m^3)
  #
  AD_mean<-matrix(data=c(rep(0,31*24)), nrow = 31, ncol = 24)
  #
  for (d in first_day:last_day) {
    for (h in 1:24) {
      if (is.na(DAD_mean[d,h])==F&is.na(AH_mean[d,h])==F&is.na(P_mean[d,h])==F) {
        AD_mean[d,h]<-AH_mean[d,h] + DAD_mean[d,h]
      } else AD_mean[d,h]<-NA 
    }
  }
  #
  # We calculate daily mean dry air density (g/m^3)
  #
  for (d in first_day:last_day) {
    count<-0
    for (h in 1:24) {
      if (is.na(AD_mean[d,h])==T) count<-count+1 
    }
    if (count<=mis) ad[add+d]<-mean(AD_mean[d,],na.rm = T) else ad[add+d]<-NA
  }
  #
  # We set as NA the days without measures, building arrays of 31 days
  #
  for (d in 1:31) if (d<first_day | d>last_day) {
    t[add+d]<-NA
    rh[add+d]<-NA
    p[add+d]<-NA
    svp[add+d]<-NA
    pvp[add+d]<-NA
    ah[add+d]<-NA
    dad[add+d]<-NA
    ad[add+d]<-NA
  }
  #
  # We plot mean temperature, relative humidity, pressure, saturation vapor pressure
  #
  plot (c((add+1):(add+31)),t[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "temperature (°C)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  plot (c((add+1):(add+31)),rh[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "relative humidity (%)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  plot (c((add+1):(add+31)),p[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "atmospheric pressure (hPa)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  plot (c((add+1):(add+31)),svp[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "saturation vapor pressure (hPa)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  plot (c((add+1):(add+31)),pvp[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "partial vapor pressure (hPa)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  plot (c((add+1):(add+31)),ah[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "absolute humidity (g/m^3)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  plot (c((add+1):(add+31)),dad[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "dry air density (g/m^3)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  plot (c((add+1):(add+31)),ad[(add+1):(add+31)], type = "b", main = 
          month_name[index], xlab = "day", ylab = "air density (g/m^3)", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
  #
}
#
#-------------------------------------------------------------------------------
# We build a data frame that contains all the data of this study
#-------------------------------------------------------------------------------
#
attach(Score)
mydata<-data.frame(year = Year, month = Month, day = Day,
                   temperature = t, relative_hum = rh, pres = p, sat_vap_p = svp,
                   par_vap_p = pvp, absolute_hum = ah, dry_air_d = dad, air_d = ad, 
                   score = ms)
attach(mydata)
#
#-------------------------------------------------------------------------------
# Spearman's correlation ranks
#-------------------------------------------------------------------------------
#
correlations<-list()
correlations[[1]]<-cor.test(score, temperature, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[2]]<-cor.test(score, relative_hum, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[3]]<-cor.test(score, pres, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[4]]<-cor.test(score, sat_vap_p, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[5]]<-cor.test(score, par_vap_p, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[6]]<-cor.test(score, absolute_hum, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[7]]<-cor.test(score, dry_air_d, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[8]]<-cor.test(score, air_d, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[9]]<-cor.test(temperature, air_d, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
correlations[[10]]<-cor.test(temperature, dry_air_d, alternative = "two.sided", method = "spearman",
         exact = T, conf.level = 0.95, continuity = T)
#
#-------------------------------------------------------------------------------
# We search for the optimal environmental parameters
#-------------------------------------------------------------------------------
#
low_score<-subset.data.frame(mydata, score<5)
mean_score<-subset.data.frame(mydata, score==5)
high_score<-subset.data.frame(mydata, score>5)
#
# Hypotheses testing
#
# temperature
wilcox.test(low_score[,4], high_score[,4])
# relative humidity
wilcox.test(low_score[,5], high_score[,5])
# atm. pressure
wilcox.test(low_score[,6], high_score[,6])
# saturation vapor pressure
wilcox.test(low_score[,7], high_score[,7])
# partial vapor pressure
wilcox.test(low_score[,8], high_score[,8])
# absolute humidity
wilcox.test(low_score[,9], high_score[,9])
# dry air density
wilcox.test(low_score[,10], high_score[,10])
# air density
wilcox.test(low_score[,11], high_score[,11])
#
# Plotting
#
labels = c("temperature (°C)", "relative humidity (%)", "atm. pressure (hPa)", 
           "saturation vapor pressure (hPa)", "partial vapor pressure (hPa)", 
           "absolute humidity (g/m^3)", "dry air density (g/m^3)", "air density (g/m^3)")
for (i in 4:11) {
  boxplot(low_score[,i], mean_score[,i], high_score[,i], ylab = labels[i-3], names = 
            c("score < 5", "score = 5", "score > 5") )
  points(1:3, c(mean(low_score[,i], na.rm = T), mean(mean_score[,i], na.rm = T), 
                mean(high_score[,i], na.rm = T)), col = "red", pch = 18)
  grid(col="darkgray")
}
#
#-------------------------------------------------------------------------------
# We plot the mean score for each month
#-------------------------------------------------------------------------------
#
for (i in 1:4) {
  score_month<-subset.data.frame(mydata, month == i)
  plot (c(1:31),score_month[,12], type = "b", main = 
          month_name[i], xlab = "day", ylab = "score", pch = 19, 
        lty = 2, col = "red")
  grid(col="darkgray")
}

My Office

My Office

Così’l maestro; e io “Alcun compenso”

dissi lui “trova, che ‘l tempo non passi

perduto”. Ed elli: “Vedi ch’a ciò penso.”

Dante, Inferno, XI, 13-15

I can’t sit at a desk, if not for short periods: sitting drastically reduces my cognitive performance. This corner is where I spend my days, during summer.

In general, having such a heterogenous display of books at hand (from biology to math, from anatomy for arts to computer science, etc.) is not good, if you have to focus on a project. But in my case, I find that when I am too sick to do mathematics, I may still have some energy left, to spend on drawing or reading.

So, if I want to minimize the time lost, I have to continuously switch activities, according to how I feel at that particular moment. And still, most of my life goes wasted, despite my best efforts.

I have calculated that the total amount of good days per year (the ones during which I can think) is of about two months, on average. Some years I had more days than that, several years I did not improve at all. This has been my life since I was 20-22.

I versi degli antichi

I versi degli antichi

Catullo ha scritto quasi 21 secoli fa ma è contemporaneo, sia per il linguaggio che per il contenuto. Solo la lingua è antica; ma sopravvissuta plus uno perenne saeclo, se si pensa che ancora all’inizio del Novecento il latino si usava per gli articoli scientifici (R) e Newton usò il latino per scrivere quella che è (e forse rimarrà per sempre) la singola opera scientifica più importante in assoluto, i Philosophiae Naturalis Principia Mathematica (1687). Non dico nulla di nuovo, lo so; ma può darsi che, se tornerete a Catullo dopo una vita, scoprirete davvero questa banalità per la prima volta, come è successo a me. Catullo ha detto già tanto, forse tutto, sull’amore, l’amicizia, e il dolore. E quello che manca non ha potuto dirlo solo perché quella notte che est perpetua una dormienda, per lui è arrivata troppo presto, negandogli le esperienze della maturità e della vecchiezza. Ma in fondo, si dice, i poeti (come i matematici) non possono sopravvivere alla giovinezza, se non a costo di cambiare mestiere.

I carmi di Catullo sono come i vecchi codici di integrazione numerica in FORTRAN: un paradigma che si ripete in ogni linguaggio, mai più universale però come la prima volta. Scritti una volta per tutte, destinati ad essere copiati per sempre: in Python, Matlab, Julia, Octave, R, e tutti i compilatori che verranno.

Qui propongo la traduzione di due carmi, tra i più famosi (come se ce ne fosse bisogno): il carme CI l’ho reso in endecasillabi, il carme VIII con versi composti, forzati dalle interrogative finali, che non sembrano ammettere una riduzione. Una traduzione è sempre opera del traduttore, non sarà mai fedele: la speranza di rendere i suoni, le allitterazioni, e il ritmo è talmente vana da essere folle. E poi la grafia, anche quella forse conta: le V con la loro simmetrica decisione, le P al vento, le morbide B. Tutto significa qualcosa e non tutto è traducibile. Catullo poi sembra davvero non avere bisogno di essere attualizzato: è un uomo come noi. Per cui questo è soprattutto un invito a rileggere l’originale.   

Con la speranza, nel tempo, di aggiungere altre traduzioni, anche di altri autori.     

(Foto: affresco della Villa dei Misteri, Pompei, prima del 23 d.C.)

Catulli veronensis carmina, CI (3 agosto 2022)

Per distese di acque, di gente in gente
giungo qui al tuo mesto funerale
per onorarti con l'ultimo dono
e parlare alla tua cenere muta,
fratello che la sorte mi ha già tolto,
strappato, ahimè, così crudelmente. 
Accetta doni funebri almeno,
secondo la tradizione dei padri,
bagnati del pianto mio fraterno.
Ti saluto, ora e per sempre addio.   

Per il testo originale e la lettura metrica si veda qui.
Catulli veronensis carmina, VIII (luglio 2022)

Povero Catullo, dalla follia desisti,
e ora accetta che ciò che è perduto è perso.
Giorni luminosi brillarono un tempo,
quando ti affannavi dietro i capricci
dell'amata come amata nessuna mai,
si consumavano gli infiniti giochi
d'amore che bramavi e lei non negava.
Davvero brillarono giorni luminosi.
Ma lei ora non vuole più e tu fa' altrettanto,
non rincorrerla, affràncati dalla miseria,
ma sopporta con animo ostinato, resisti.
Addio, ragazza, ti resisterà Catullo,
non ti cercherà più, non ti vorrà se non vuoi:
ma soffrirai quando non sarai più voluta.
Maledetta! Dove ti porta ora la vita?
Chi verrà ora a trovarti? Per chi sarai bella?
Chi amerai ora? Di chi sarai per il mondo?
Chi bacerai? A chi morderai le labbra?
Ma tu Catullo ostinatamente persisti.  

Il verso 5 (amata nobis quam amabitur nulla) lo si ritrova quasi identico nel carme XXXVII, verso 12 (amata tantum quam amabitur nulla). Eppure tanto il carme VIII scorre su una nota di delicata sensibilità, quanto il 37 esprime una violenta, sconcertante, volgarità (si veda qui per una traduzione del XXXVII).

Per il testo originale e la lettura metrica si veda qui.
Catulli veronensis carmina, I (agosto 2022)

A chi dedico il nuovo libello,
gioiello emendato d'ogni difetto?
A te che eri solito, Cornelio,
lodare queste mie cose da nulla,
da quando solo sulla Penisola
di tutto il Tempo ti cimentavi
in tre volumi ponderosi e dotti,
per Giove, a raccontare ricordi.
Accetta pertanto questo libello,
per ciò che vale e che sopravvivere,
Signora fanciulla, possa per sempre.

Per il testo originale e la lettura metrica si veda qui.
Aeneis, Liber II, v 201-224 (Agosto 2022)

Assegnato al culto del dio Nettuno
Laocoonte un degno toro offriva.
Ma da Tenedo adesso le calme acque
sovrastano immensi due serpenti
che speculari puntano la costa,
i colli eretti tra i flutti, vermiglie
le creste sopra le onde, immensa mole
del corpo si snoda, e sfiora il mare.
Scroscio di schiuma, e sono sulla riva,
gli occhi iniettati di sangue di fuoco,
lingue vibranti e labbra sibilanti.
Fuggiamo, a Laocoonte aspirano,
ma prima i piccoli corpi dei figli
ambedue i serpenti avvolti stringon
e ingoiano i morsi dei miseri arti.
Poi assalgono il padre accorso in aiuto
armato che nelle spire è legato;
e già su di lui torreggiano, stretto
due volte il busto, per due il collo avvinto. 
Mentre tenta di liberare i nodi,
le vesti pregne di bava letale,
grida disumane lancia alle stelle,
qual mugge il toro che l'altare fugge
scuotendo il collo, la malferma scure.

Reso in edencasillabi. Di seguito riporto il conteggio delle sillabe, tenendo conto delle sinalefe.

assegnatoalcultodeldioNettuno
Laocoontedegnotorooffriva
madaTenedoadessolecalmeacque
sovrastanoimmensidueserpenti
chespecularipuntanolacosta
icollierettitraifluttivermiglie
lecrestesopraleondeimmensamole
delcorposisnodaesfiorailmare
scrosciodischiumaesonosullariva
gliocchiiniettatidisangueedifuoco
linguevibrantielabbrasibilanti
fuggiamoalaocoonteaspirano
maprimaipiccolicorpideifigli
ambedueiserpentiavvoltistringon
eingoianoiorsideimiseriarti
poiassalgonoilpadreaccorsoinaiuto
armatochenellespireèlegato
egiàsudiluitorreggianostretto
duevolteilbustoperdueilcolloavvinto
mentretentadiliberareinodi
levestipregnedibavaletale
gridadisumanelanciaallestelle
qualmuggeiltorochelaltarefugge
scuotendoilcollolaalfermascure

L’intero secondo libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti.

Laocoon, ductus Neptuno forte sacerdos,
solemnes taurum ingentem mactabat ad aras. 
Ecce autem gemini a Tenedo tranquilla per alta
(horresco referens) immensis orbibus angues
incumbunt pelago, pariterque ad litora tendunt:
pectora quorum inter fluctus arrecta, iubaeque
sanguineae exsuperant undas: pars cetera pontum
pone legit, sinvatque immensa volumine terga.
Fit sonitus spumante salo: iamque arva tenebant,
ardentesque oculos suffecti sanguine, et igni,
sibila lambebant linguis vibrantibus ora.
Diffugimus visu exsangues: illi agmine certo
Laocoonta petunt, et primum parva duorum
corpora natorum serpens amplexus uterque
implicat, et miseros morsu depascitur artus.
Post ipsum auxilio subeuntem ac tela ferentem
corripiunt spirisque ligant ingentibus; et iam
bis medium amplexi, bis collo squamea circum
terga dati, superant capite et cervicibus altis.
Ille simul manibus tendit divellere nodos
perfusus sanie vittas atroque veneno;
clamores simul horrendos ad sidera tollit,
quales mugitus, fugit cum saucius aras
taurus et incertam excussit cervice securim.
At gemini lapsu delubra ad summa dracones
effugiunt, saevaeque petunt Tritonidis arcem,
sub pedibusque deae, clypeique sub orbe teguntur.

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Laocoon, ductus sacerdos Neptuno forte, mactabat ingentem taurum ad aras solemnes.
Laocoonte, nominato sacerdote di Nettuno per sorteggio, uccideva un grande toro presso i solenni altari.
Ecce autem a Tenedo per alta tranquilla [aequora] angues gemini (horresco referens) incumbunt pelago immensis orbibus, pariterque tendunt ad litora:
Ma ecco che da Tenedo, attraverso le acque tranquille, due serpenti gemelli (inorridisco nel raccontarlo) sovrastano il mare con le spire immense, e puntano la riva all’unisono:
pectora quorum arrecta [sunt] inter fluctus, iubaeque sanguineae exsuperant undas: pars cetera legit pontum, pone, sinvatque volumine immensa terga [= terga immenso volumine, ipallage].
i petti dei quali sono eretti sui flutti, e le creste vermiglie si innalzano oltre le onde: il resto del corpo sfiora il mare, dietro, e snoda il dorso in immense spire.
Sonitus fit salo spumante: iamque tenebat arva et, oculos ardentes [acc. di rel.] suffecti sanguine et igni, lambebant sibila ora linguis vibrantibus.
Un gorgoglio è generato dalla mare spumeggiante: già avevano raggiunto la costa e, con occhi ardenti iniettati di sangue e fuoco, lambivano le bocche sibilanto con lingue vibranti.
Diffugimus exangues visu: illi petunt Laocoonta, agmine certo, et primum uterque serpens amplexus implicat parva corpora duorum natorum, et depascitur miseros artus morsu.
Scappiamo con visi esangui: essi puntano Laocoonte, con andatura decisa, e prima i due serpenti stringono, avvolti, i piccoli corpi dei due figli, e divorano i miseri arti a morsi.
Post corripiunt ipsum [Laocoonta], auxilio subeuntem ac tela ferentem, et ligant spiris ingentibus;
Quindi assalgono lo stesso Laocoonte, che accorre in soccorso e porta delle armi, e lo avvincono con le ingenti spire;
et iam amplexi bis medium [acc. di rel.], circumdati [timesi] squamea terga [acc. di rel.] bis collo, superant altis capite et cervicibus.
e stretto due volte il busto [di Laocoonte], due volte avvolte intorno al collo le terga squamose, già torreggiano con il collo e il capo.
Ille simul tendit divellere nodos manibus, vittas perfusus [acc. alla greca] sanie et atro veneno; simul tollit horrendos clamores ad sidera:
Lui, con le bende imbevute di bava e veleno nero, tenta di sciogliere i nodi con le mani mentre leva orrende grida al cielo,
quales mugitus taurus [tollit], cum fugit saucius aras, et excussit incertam securim cervice.
come i muggiti del toro che fugge ferito dall’altare mentre si squote dal collo la scure malferma.
At gemini dracones effugiunt lapsu ad summa delubra, et petunt arcem saevae Tritonidis, et teguntur sub pedibus deae, et sub orbe clypei.
E i draghi gemelli fuggono strisciando verso gli alti santuari, e si dirigono all’altare della ostile Tritonia [Atena], e si nascondono sotto i piedi della dea, sotto il cerchio dello scudo.
Aeneis, Liber IV, v 607-621 (Gennaio 2023)

Sole, tu che illumini i giorni umani,
Giunone, che sai del mio dolore,
Ecate, che tormenti i sonni urbani.

E voi Dire e dèi d'Elissa che muore,
se sventura benevolenza vale,
ascoltatemi. Poiché l'impostore

le ancore getterà al litorale
e questo Giove comanda che accada,
almeno che un nemico eccezionale

incontri, solitario esule vada,
implori aiuto, e veda le morti
amare dei suoi e la vita non goda  

e il trono e il regno a pace iniqua porti.
Ma cada anzitempo e senza sepolcro.
Ciò chiedo col sangue per le sue sorti.

Terzine con rime ABA, BCB, …. Di seguito riporto il conteggio delle sillabe, tenendo conto delle sinalefe.

Soletucheilluminiigiorniumani
Giunonechesaidelmiodolore
Ecatechetormentiisonniurbani
evoiDiraeedéid’Elissachemuore
sesventurabenevolenzavale
ascoltatemipoichél’impostore
leancoregetteallitorale
equestoGiovecomandacheaccada
almenocheunnemicoeccezzionale
incontrisolitarioesulevada
imploriaiutoevedalemorti
amaredeisuoielavitanongoda
eiltronoeilregnoapaceiniquaporti
Macadaanzitempoesenzasepolcro.
Ciòchiedocolsangueperlesuesorti
L'intero quarto libro della Eneide in latino si trova qui. In particolare, i versi tradotti sono i seguenti.

Sol, qui terrarum flammis opera omnia lustras;
tuque harum interpres curarum et conscia, Iuno,
nocturnisque Hecate triviis ululata per urbes,
et Dirae ultrices, et di morientis Elisae,
accipite haec: meritumque malis advertite numen,
et nostras audite preces. Si tangere portus
infandum caput, ac terris adnare necessest:
et si fata Iovis poscunt; hic terminus haeret:
at bello audacis populi vexatus, et armis,
finibus extorris, complexu avulsus Iuli,
auxilium imploret, videatque indigna suorum
funera: nec, cum se sub leges pacis iniquae
tradiderit, regno aut optata luce fruatur:
sed cadat ante diem mediaque inhumatus arena.
Haec precor, hanc vocem extremam cum sanguine fundo. 

Di seguito le medesime parole, disposte nella costruzione italiana, con una traduzione parola per parola.

Sol, qui flammis opera omnia terrarum lustras;
Sole, che illumini con il fuoco tutte le attività della Terra;
et tu, Iuno, interpres et conscia harum curarum,
e tu, Giunone, intermediaria e complice di questi affanni
et Hecate ululata nocturnis triviis per urbes,
e Ecate, invocata con ululati nei trivi di notte, per le città,
et Dirae ultrices, et di morientis Elisae,
e Dirae vendici, e dèi di Elissa che muore
accipite haec: et advertite malis meritum numen, et nostras audite preces.
accettate queste [parole] e rivolgete alle sventure la meritata benevolenza, e ascoltate le mie preghiere.
Si necessest infandum caput tangere portus ac terris adnare et si fata Iovis poscunt
Se è inevitabile che lo scellerato debba toccare il porto e raggiungere la terra e questo stabilisce il volere di Giove,
hic terminus haeret: at vexatus bello et armis audacis populi,
che così sia: almeno sia vessato dalla opposizione armata di un popolo audace,
finibus extorris, avulsus complexu Iuli, auxilium imploret,
sia bandito dal territorio, lontano dall’abbraccio di Iulio, implori aiuto,
videatque indigna suorum funera: nec, cum se tradiderit sub leges iniquae pacis, regno aut optata luce fruatur:
assista alla morte indegna dei suoi, né – sottopostosi a un patto iniquo di pace – goda il regno e la dolce vita:
sed cadat ante diem et inhumatus media arena.
ma cada anzi tempo e resti senza sepoltura sulla spiaggia.
Haec precor, hanc vocem extremam cum sanguine fundo.
Di questo vi supplico; queste ultime parole pronuncio col sangue.
Catulli veronensis carmina, V (Buenos Aires, 11 febrero 2023)

Lasciati amare, Lesbia, e vivere
e i commenti dei vecchi, invidiosi
valgano le monete più misere.

Giorni seguono giorni luminosi
ma esaurito il nostro breve momento
per sempre dormiremo silenziosi.

Dammi mille baci, e poi altri cento,
dammene ancora mille e cento ancora,
poi mille e più, sulle labbra un accento.

E se su migliaia sorge l'aurora
ne confondiamo il numero perché
non è malevolo chi gioia ignora, 
chi non sa quanti baci, tra te e me.  

Per il testo originale e la lettura metrica si veda qui.