ATTENZIONE: questo post potrebbe risultare tremendamente noioso e soporifero a chi non è interessato ad argomenti matematici e di calcolo numerico. E per chi è interessato, sappiate fin da subito che si tratta del classico “ho scoperto l’acqua calda”…

Se siete studenti di facoltà tipo “Ingegneria Aerospaziale” o qualsiasi altro tipo di “Ingegneria Qualcosa”, allora vi sarete imbattuti quasi sicuramente in quel mostruoso software chiamato Matlab.

Questo software è particolarmente abusato ad Ing. Aerospaz. al PoliMI: praticamente lo studente, nonostante manchi un basilare corso esplicativo, impara a convivere con Matlab e farci di tutto, dal programmare, al suonare l’Alleluia, zippare file, girare filmini e preparare ottimi caffè1. Da un software come Matlab ci si aspetta di tuto e di più. Eppure, come si sa, niente è perfetto!

Per farla breve: sbatto le corna in un classico problema “molla-smorzatore” con annesso aeroplano che atterra, e il codice di simulazione mi sbatte fuori

NaN + NaNi

ovvero “Not-a-Number + Not-a-Number*i” (=Non è un numero + Non è un numero*i, dove i è l’unità immaginaria). E giù a impazzire per cercare di capire perché mi venga restituito un numero tanto strambo! Allora risalgo tutto il codice fino a cercare dove si genera il primo valore immaginario e… eccolo lì: una semplice operazione di elevamento a potenza, con esponente pari a 1,2. In teoria, nulla di pericoloso.

La base di tale potenza è negativa ma l’elevamento a potenza 1,2 “matematicamente” non dovrebbe dare problemi. Infatti 1,2 è uguale a 6/5 e quindi l’operazione equivale ad elevare la base con esponente 6, che essendo pari elimina il problema del segno della base, per poi estrarne la radice 5, che essendo dispari se ne strafotte del segno della base. Quindi, matematicamente, l’operazione a1,2, se a è un numero reale, dovrebbe restituire un numero reale senza chiamare in causa i numeri immaginari. Mi spiego meglio…

… prendiamo una potenza semplice semplice, la radice cubica di -8, che come risultato DEVE dare -2:

(-8)^(1/3) = -2

c’è poco da fare. Scrivetelo in Matlab (mi raccomando, con il meno dentro la parentesi dell’8, altrimenti il software esegue l’elevamento a potenza di una base positiva e solo dopo mette il meno al risultato) e vedete cosa vi tira fuori. Un numero immaginario, ma con modulo uguale a 2. Non avete Matlab? Fatelo con la calcolatrice del Mac. Otterrete “Non è un numero”. Fatelo con Spotlight, scrivete pow(-8,1/3), non otterrete un bel nulla (mentre se scrivete pow(8,1/3) otterrete un bel 2 tondo tondo). Pensate che il problema sia solo del Mac? Fatelo con Linux o Windows, sia con Matlab che con la Calcolatrice, otterrete lo stesso identico errore. Fatelo con Google: otterrete il risultato corretto!

Volete esagerare? Provate con

(-8)^(2/3)=4

la radice cubica di -8 è -2 e il suo quadrato è 4. Ora copiate ed incollate in Google e date invio. Cosa ottenete? Un numero immaginario, il cui modulo è 4. La calcolatrice di Google funziona bene col calcolo precedente, in cui l’esponente è 1/3, ma sballa quando l’esponente è 2/3! Il risultato torna coerente quando si esegue

((-8)^2)^(1/3)

cioè suddividendo l’espressione in due passaggi distinti.

Pazzesco! Ma perché tutto ciò? Ciò che è ovvio è che un’operazione tanto banale per noi, risolvibile usando “semplici” regolette, viene comunque approssimata quando il calcolo è fatto da un computer non dotato di intelligenza ma che lavora con matematica “finita”… Certo che tutto ciò è inquietante… Sarei lieto di sentire una spiegazione tecnica da chi ne sa di più.

’nuff said

1: tutto ciò che ho scritto si può fare in Matlab. Solo, per il caffé, vi dovrete accontentare di quella ciofeca di Java…. ‘-.-

Technorati Tags :