Introduzione
in settori diversi, fornendo le funzionalità opportune.
L’elaborato si pone l’obiettivo di analizzare questo software,
focalizzando l’attenzione sulla comunicazione interprocesso con
programmi sviluppati da terze parti. Questo aspetto è
fondamentale per l’estensione delle funzionalità e del
miglioramento dell’efficienza in particolari routine di calcolo. Il
passo ulteriore è quello di incapsulare il nucleo computazionale,
per sfruttarlo come processo servente a cui demandare i calcoli.
In questo modo lo sviluppo del progetto è molto agevolato e il
lavoro si può concentrare su altre problematiche. Quest’ultima
modalità si analizza nel dettaglio, fornendo uno studio
approfondito in termini di prestazione su due piattaforme
diverse: quella Windows e quella Macintosh. Il modello su cui si
basa la comunicazione interprocesso è l’altro aspetto analizzato:
la comprensione dei messaggi scambiati è necessaria per avere il
maggior controllo possibile nelle diverse situazioni.
L’organizzazione dell’elaborato risulta suddivisa in due parti:
una introduttiva per comprendere gli elementi usati nello studio
e una con i risultati del lavoro svolto.
Il Capitolo 1 presenta il pacchetto software Mathematica e le sue
principali funzionalità come foglio di calcolo.
Il Capitolo 2 si focalizza su di una parte del sistema, MathLink,
l’ambiente che governa la comunicazione tra processi diversi.
Il Capitolo 3 presenta il compilatore per linguaggio C in
ambiente MacOs: MetroWerks CodeWarrior e le modalità per
creare programmi capaci di comunicare secondo le regole di
MathLink.
Il Capitolo 4 è speculare al precedente, presentando il
compilatore Microsoft Visual C++ per sistemi Windows.
Il Capitolo 5 raccoglie i risultati dei test e la valutazione delle
prestazioni per i diversi programmi sviluppati sui due sistemi
operativi.
Introduzione
Il Capitolo 6 analizza nel dettaglio i messaggi interprocesso
scambiati tra un nucleo di Mathematica ed un programma
personalizzato che si occupa di inviare e ricevere le richieste di
calcolo dell’utente.
Nel Capitolo 7 si presenta una breve analisi dei risultati ottenuti
e un commento sullo sviluppo futuro di Mathematica.
La trattazione si conclude con le Appendici. In Appendice A si
riporta il codice C dei file sorgenti per i programmi
nell’ambiente Windows.
In Appendice B ci sono le chiamate per Mathematica con i
risultati numerici dei test e l’implementazione delle funzioni
Mathematica visualizzate nel Capitolo 5.
In Appendice C c’è un’impostazione didattica degli argomenti
presenti nell’elaborato. I contenuti sono sviluppati in cinque
lezioni, pensate per studenti del secondo biennio delle Superiori
e del primo anno dell’Università.
Il CD-Rom allegato contiene tutto il materiale cartaceo del
lavoro svolto (formato Word e pdf); tutti i progetti software
(Mac e Windows); i file di log generati durante i test; tutti i
notebook di Mathematica mostrati nell’elaborato.
Mathematica
Capitolo 1
Mathematica
1.1 Premessa
In questo capitolo viene fornita una breve introduzione al
pacchetto applicativo Mathematica. Questo software si pone al
centro di tutta la trattazione; è importante, quindi, porre
l’attenzione sugli aspetti più interessanti dell’applicativo.
La premessa è una breve panoramica storica: la prima versione
del programma fu rilasciata nel 1988, con un immediato impatto
in molti campi del sapere tecnico. In questi settori l’uso del
computer si era già diffuso e fin dagli anni ’60 venivano forniti
specifici pacchetti software per la risoluzione di svariate
problematiche, di tipo numerico, algebrico o grafico. Il salto di
qualità compiuto da Mathematica sta nella possibilità di avere
uno strumento generale capace di manipolare le questioni
tecniche più disparate allo stesso modo. Questo è reso possibile
dall’uso di un nuovo tipo di linguaggio simbolico per il
Mathematica
computer, che, con un numero ridotto di potenti primitive, può
gestire una gran varietà di problemi. Attualmente, fine del 2002,
si è arrivati alla versione 4.2 e l’uso del programma si è esteso
ad oltre un milione di persone in tutto il mondo. I campi di
utilizzo spaziano dalla fisica, alla biologia, alle scienze sociali e
alla finanza; lo strumento ha contribuito ad importanti scoperte
ed è alla base di numerosi articoli tecnici. L’interesse per
Mathematica è testimoniato anche dalla presenza di corsi
finalizzati al suo approfondimento.
1.2 Notebook
Il concetto di notebook è uno dei pilastri di Mathematica. Il
notebook è la tipologia di documento utilizzata dal programma,
che può contenere formule, grafici, commenti. Il notebook è
tecnicamente un file di testo che viene elaborato da
Mathematica. Da notare che il suo formato è indipendente dalla
piattaforma (Windows, MacOs, Linux, UNIX) su cui opera.
Questa versatilità d’uso ha permesso che diventasse uno
standard nella pubblicazione di documenti tecnici. Il notebook
deve la sua portabilità al concetto di espressione. In
Mathematica tutto, dal numero alla formula chimica,
all’immagine, è un’espressione. Ciò fa sì che il notebook
contenga delle espressioni e non numeri o immagini. Al
momento dell’apertura, questo insieme di espressioni viene
interpretato dal programma e il risultato è poi visualizzato. Per
inciso, sullo stesso concetto si fonda l’HTML; Mathematica, si
comporta come un browser di notebook. In questo modo tutte le
impostazioni necessarie al sistema operativo sono effettuate dal
programma stesso, durante l’interpretazione delle espressioni.
Mathematica
1.3 Manuale
Il manuale di riferimento ([1]) costituisce una guida completa
alle funzionalità di Mathematica ed è suddiviso in tre parti. Nel
primo capitolo, il riferimento è alla prima parte, mentre nel
secondo si approfondisce la seconda parte. In questa sezione si
introduce Mathematica come sistema risolutore di problemi. Il
focus è posto sulle funzioni capaci di risolvere un ampio
ventaglio di casistiche in ambito computazionale. Si tratta
comunque della parte più esterna del programma.
Nella seconda parte infatti, si approfondiscono gli aspetti
generali della struttura in cui si muove l’applicativo: si
approfondisce l’analisi del linguaggio di interrogazione, in
particolare i metodi per realizzare molte tipologie di programmi.
Si danno anche le basi per comprendere la comunicazione
interprocesso.
Nella terza parte ci sono i riferimenti per gestire problemi
matematici avanzati. Ci sono richiami a pacchetti di funzioni
specifiche per i diversi settori. Questo modulo è molto
specialistico e, a differenza degli altri due, necessita di
conoscenze elevate in ambito matematico.
1.4 Applicativi
Si passa ora all’aspetto più tecnico dell’uso del programma
stesso. Dopo l’installazione del pacchetto software, si osserva la
presenza di almeno due programmi nella cartella creata da
Mathematica: il primo è il Front End, indicato con il nome
Mathematica (come file nel sistema), e il MathKernel, indicato
nel seguito Kernel. Il primo programma, che nel seguito si
indica come Front End, si occupa della gestione dell’input-
output dell’utente; il secondo è il nucleo del sistema, dove
vengono svolte materialmente le operazioni di calcolo. La
struttura è quindi modulare, aspetto decisivo per le
Mathematica
considerazioni che si sviluppano in seguito. Quando si cita
Mathematica, si intende, in senso lato, uno qualsiasi dei due
applicativi sopra descritti. Di solito, alla partenza, viene lanciato
il Mathematica Front End: come default, viene fornito un
notebook vuoto, sul quale è possibile scrivere comandi per il
Kernel. Nei sistemi Windows, appare anche la toolbar, con i
menu a tendina; in Macintosh si modifica quella già presente.
Premendo Shift-Enter (cioè il tasto Shift e contemporaneamente
il tasto Enter) viene elaborato il comando e l’output è
visualizzato nelle righe successive del notebook. Tutte le righe
di input sono precedute dall’etichetta “In” e il numero d’ordine
tra quadre. Le righe di output hanno il prefisso “Out” (fig.1).
Fig.1 Esempio di calcolo sul Front End
Al momento dell’esecuzione del comando di input, viene
lanciato il programma Kernel, che esegue l’operazione. Il Front
End si occupa dell’invio dell’operazione al Kernel e della
visualizzazione del risultato di ritorno. Gli strati fisici per la
comunicazione sono visualizzati in fig.2.
Fig. 2 Gli strati fisici per la comunicazione in Mathematica
In[1]:= 2.3 + 5.63
Out[1]= 7.93
Mathematica
Si può notare il canale di trasmissione tra i due applicativi, dove
passano i messaggi. Questo legame può crearsi sia sulla stessa
macchina (in locale) sia sulla rete. Lo strato MathLink permette
all’utente l’assoluta trasparenza rispetto al Sistema Operativo
delle macchine in comunicazione. Questo aspetto è approfondito
nel secondo capitolo. Esiste un’altra modalità di comunicazione
con il Kernel: è un editor testuale fornito dal Kernel stesso.
Questa finestra è presente quando il Kernel viene lanciato stand
alone (senza essere invocato da altri programmi) ed è disabilitata
appena il Kernel viene connesso ad un Front End. La differenza
fondamentale tra le due interfacce è che il Front End è un
programma visuale, quindi un componente a se stante, mentre
l’editor testuale è una finestra del Kernel. Dal punto di vista
dell’utente la scrittura della formula resta invariata, ma mancano
le estensioni fornite dal Front End, quali la Barra dei comandi ed
il Menù degli strumenti. Inoltre la finestra di testo non permette
la visualizzazione di oggetti non testuali, come le immagini, che
invece sono manipolabili con il Front End.
1.5 Sintassi
La sintassi di Mathematica, per le operazioni aritmetiche, è
simile a quella di calcolatrici e fogli elettronici; in particolare la
divisione è rappresentata dal simbolo ‘/’, la moltiplicazione da
‘*’ e l’elevamento a potenza da ‘^’. In fig. 3 sono elencate
alcune rappresentazioni per le più comuni operazioni
aritmetiche. Una caratteristica di Mathematica è il fatto che sia
key-sensitive e in particolare esiste la convenzione per cui le
funzioni standard dell’applicativo hanno la prima lettera
maiuscola. Le parentesi tonde sono usate solamente per formare
raggruppamenti di termini; nel caso di passaggio di argomenti a
funzioni, Mathematica prevede l’uso delle parentesi quadre.
Mathematica
Fig. 3 Operazioni aritmetiche in Mathematica
Nel Front End, l’uso delle funzioni e delle operazioni più
comuni viene agevolato dal menù che richiama le funzioni in
modo grafico (fig.4).
Fig. 4 Menù grafico
x + y Somma
x - y Sottrazione
x * y Prodotto
x / y Divisione
x ^ y Potenza
x ^ y Radice
Exp]x] Esponenziale
Log[x] Log naturale
Sin[x] Seno
Cos[x] Coseno
Tan[x] Tangente
n! Fattoriale
Mathematica
Mathematica manipola oggetti diversi: i più semplici sono i
numeri, ma sono supportate molte altre strutture. Una di queste è
la lista. La lista è un insieme di oggetti di Mathematica,
racchiusi da parentesi graffe. Per quanto premesso le liste più
semplici sono quelle costituite da numeri (fig.5).
Fig. 5 Esempio di lista numerica
Il programma tratta questi oggetti come un blocco unico, a cui è
possibile applicare tutti i comandi numerici. Nel caso delle
operazioni aritmetiche, la loro applicazione va a modificare gli
elementi costituenti la lista. In più, è possibile estrarre dalla lista
uno o più elementi (fig.6).
Fig. 6 Operazioni sulle liste
Le liste sono analoghe ai vettori dei diversi linguaggi di
programmazione. Rispetto ai vettori dei programmi C c’è da
ricordare una differenza fondamentale: le liste in Mathematica
hanno l’ordinale del primo elemento uguale a 1, mentre in C i
vettori hanno il primo elemento nella posizione 0. Il costrutto
First[list] Primo elemento della lista
Last[list] Ultimo elemento della lista
Part[list,n] n-esimo elemento della
o [list][[n]] lista
Take[list,n] Primi n elementi della lista
Mathematica
lista e le sue implicazioni pratiche per il linguaggio C è
analizzato negli esempi presentati nei capitoli seguenti.
1.6 Funzionalità
Si introducono ora le funzioni algebriche in Mathematica. Lo
specchietto riassuntivo in fig.7 mostra alcune delle funzioni
utilizzate in questo ambito.
Fig. 7 Funzioni algebriche principali
In particolare Mathematica permette di semplificare o espandere
espressioni, come mostrato negli esempi seguenti. Inoltre è
possibile assegnare valori alle variabili per calcolare
l’espressione per punti
Fig. 8 Assegnamento di una variabile
Le funzionalità utilizzate per espandere o fattorizzare
un’espressione sono presentati in fig. 9.Si nota la capacità di
Mathematica di supportare calcoli simbolici, in quanto x è una
variabile che non identifica alcun numero. Dopo l’assegnazione
ad x di un valore (per es. x=3) non è più possibile ripristinare x
Expand[expr] Scomposizione di expr (per * e ^)
ExpandAll[expr] Scomposizione di expr completa
Factor[expr] Fattorizzazione di expr
Simplify[expr] Semplificazione di expr
FullSimplify[expr] Semplificazione massima di expr
In[1]:= 1 + 2x /. x -> 3
Out[1]= 7
Mathematica
come variabile formale, perché tutte le istanze di x sono
sostituite con 3; l’operazione è così irreversibile.
Fig. 9 Manipolazione di espressioni
Si mostrano in fig. 10 altri costrutti per la semplificazione
dell’espressione algebrica:
Fig. 10 Semplificazione di espressioni
Queste funzioni possono essere molto costose in termini di
tempo, specie per espressioni algebriche complesse. Quindi
occorre dosare bene il loro uso ed eventualmente effettuare le
semplificazioni possibili da parte dell’utente. Si presentano ora
alcune funzioni più complesse per il calcolo di integrali, derivate
e risoluzione di espressioni algebriche (Fig. 11). Esistono anche
Mathematica
gli operatori per sommatoria e limite in ambito algebrico. Si
rimanda al manuale per una più dettagliata descrizione di queste
funzioni.
Fig. 11 Derivata ed Integrale
La sintassi degli operatori logici in Mathematica è quella
standard in C.
Fig. 12 Operatori logici
Ora si passa a dare uno sguardo alle equazioni. La costruzione di
equazioni si ottiene con ==. Ad esempio: X^2+2X-7==0
Il costrutto Solve permette di risolvere equazioni, fornendo
come risultato una lista di soluzioni (Fig. 13).
!p Not
p && q && And
p || q || Or
Xor[p,q] Or esclusivo (Aut)
Mathematica
Fig. 13 Soluzione equazioni
Per le equazioni algebriche, Mathematica fornisce soluzioni
esatte per tutte quelle con grado massimo minore di 5 (per il
teorema di Ruffini). Inoltre sono implementati algoritmi per la
soluzione di particolari sottoclassi risolubili con grado superiore
al 4°.
Fig. 14 Soluzione equazioni (6° grado)
Nel caso non sia possibile trovare soluzioni esatte, Solve
restituisce una lista con l’indicazione delle soluzioni. Da questa
lista è possibile trarre delle approssimazioni delle soluzioni.
Nel caso di equazioni non algebriche, la chiamata Find Root
permette di calcolare soluzioni approssimate in un intervallo di
valori.
Fig. 15 Soluzione numerica di equazioni
Mathematica
1.7 Librerie
Il panorama delle funzioni standard presenti in Mathematica è
decisamente vasto, ma in particolari situazioni può essere
necessario avere un ventaglio più ampio di possibilità. In questo
caso si possono caricare librerie di funzioni per soddisfare
questa esigenza. Il programma è così estensibile e può coprire le
esigenze di settori molto specializzati. Per questo esistono già o
possono essere creati dei packages (librerie). Sono file scritti nel
linguaggio di Mathematica che contengono una collezione di
definizioni funzionali, che insegnano al programma come
comportarsi con certe chiamate. Per il caricamento di una
libreria, la sintassi è
Fig. 16 Caricamento libreria.
Occorre porre attenzione al fatto che l’utente può definire
durante l’esecuzione di Mathematica una funzione. Nel
momento in cui si carica una libreria, l’utente potrebbe aver
definito funzioni con lo stesso nome di quelle della libreria. In
questo caso restano valide le definizioni dell’utente e non
vengono caricate le funzioni della libreria. Per impedire possibili
conflitti si può rimuovere la definizione della funzione con
Remove[“nome”] prima del caricamento.Il confine tra ciò che
può fare o non fare Mathematica diventa molto labile. Grazie
alle librerie è possibile estendere le funzionalità del programma
che così è capace di coprire gli ambiti più diversi. Nota
importante: l’applicativo si comporta allo stesso modo sia con le
funzioni native che con quelle caricate dall’esterno, in modo
trasparente per l’utente.
In[1]:= <<Calculus`VectorAnalysis`