Author Archives: admin

Le variabili in Matlab

MATLAB

Una variabile è un insieme di dati modificabili situati in una porzione di memoria (una o più locazioni di memoria) destinata a contenere dei dati, suscettibili di modifica nel corso dell’esecuzione di un programma. Una variabile è caratterizzata da un nome (inteso solitamente come una sequenza di caratteri e cifre).

MATLAB non richiede alcuna dichiarazione del tipo e della dimensione di una variabile. Quando MATLAB incontra un nome variabile nuovo, crea automaticamente la variabile e stanzia l’ammontare adatto in deposito.

Se la variabile già esiste, MATLAB cambia i suoi contenuti e, se necessario, effettua un nuovo deposito.Per esempio definiamo la seguente variabile:

>> elenco = 30

elenco =

    30

crea una matrice 1-by-1 (monodimensionale) di nome elenco e immagazzina il valore 30 come suo singolo elemento. I nomi delle variabili consistono di una lettera, seguita da qualsiasi numero di lettere, cifre o simbolo di sottolineatura.

variabili

MATLAB usa solamente i primi 31 caratteri di un nome di una variabile. MATLAB è inoltre case sensitive; distingue quindi tra uppercase e lowercase. A ed a non sono la stessa variabile.

Per analizzare la matrice assegnata a ciascuna variabile, basta semplicemente digitare il nome della variabile.

Ricordiamo infine che quando nel workspace di Matlab viene creata una variabile a cui non siè dato un nome, essa viene depositata nella varibile ans. La variabile ans viene creata quindi ogni volta che si esegue un’azione che non include una variabile MATLAB in modo da deporre il risultato in tale variabile. Ad esempio:

>>  [0:2:8]

ans =

0     2     4     6     8

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le operazioni in Matlab

MATLAB

In MATLAB sono definite le seguenti operazioni aritmetiche:

1) addizione +
2) sottrazione –
3) moltiplicazione *
4) divisione /
5) elevamento a potenza ˆ

Quando l’espressione da valutare è troppo lunga per stare su di un’unica riga di comando,risulta possibile utilizzare un carattere di continuazione dato da . . . (tre punti). Ad esempio:

>> 1 + 1/4 + …
1/8

ans =

    1.3750

E’ possibile verificare che poichè in MATLAB non vi è alcuna distinzione tra variabili intere, reali o complesse, il risultato dell’operazione di elevamento a potenza nel caso di esponenti frazionari può non corrispondere a quello naturalmente atteso. Ad esempio, volendo calcolare la radice cubica di -5, si ottiene:

>>  (-9)^(1/5)

ans =

   1.2555 + 0.9122i

quindi un numero immagginario al posto di un numero reale. Il problema è dovuto al fatto che MATLAB, lavorando in notazione complessa, calcola come prima radice cubica di -9 una delle due con parte immaginaria non nulla.

Anche in MATLAB è possibile alterare le precedenze classiche delle operazioni aritmetiche mediante l’uso opportuno delle parentesi tonde. Ad esempio, se nel caso precedente si fosse scritto ( – 9)*1/5 si sarebbe ottenuto il valore -1.8000 ossia, giustamente, – 9/5.

>> (- 9)*1/5

ans =

   -1.8000

operazioni.matlab

Per quanto riguarda i vettori, le operazioni elementari si estendono (quando ben definite) in modo del tutto naturale, con l’eccezione delle operazioni di divisione e di elevamento a potenza. Ad esempio,

>> a = [1:4];
>> b = [1:3];
>> c = [3 2 6 -1] ;

>> a+c (somma di vettori riga)

ans =

     4     4     9     3

>> a-c (differenza di vettori riga)

ans =

    -2     0    -3     5

>> a+b
??? Error using ==> plus
Matrix dimensions must agree.
 
>> a*c
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Le ultime istruzioni ci indicano che, le operazioni fra vettori sono valide solo se le dimensioni sono consistenti. Infatti, dato un vettore riga s di dimensione n (ossia una matrice 1 * n) ed un vettore colonna d di dimensione m, si potrà eseguire il prodotto scalare s*d solo se m=n (ottenendo in tal caso uno scalare).

>> s=[1:4];

>> d=[1;2;3;4];

>> s*d

ans=
             30

Quindi d*s fornirà una matrice m*n.

>> s=[1:4];

>> d=[1;2;3;4];

>> M=d*s

M =

     1     2     3     4
     2     4     6     8
     3     6     9    12
     4     8    12    16

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

MATLAB

Operatore due punti in Matlab

MATLAB

L’operatore : (due punti)
L’operatore due punti rappresenta uno dei più importanti operatori di MATLAB. Si trova in molte forme diverse. Ad esempio l’espressione seguente:

1:10

rappresenta un vettore riga che contiene i numeri interi da 1 a 10

1 2 3 4 5 6 7 8 9 10

Per ottenere una specifica sequenza invece, si deve indicare un incremento. Per esempio:

>> 100:-7:50

ans =

   100    93    86    79    72    65    58    51

cioè una sequenza di numeri da 100 a 50 con passo uguale a -7; mentre

>> 0:pi/4:pi

ans =

         0    0.7854    1.5708    2.3562    3.1416

operatore.matlab
Le espressioni sottoscritte che coinvolgono l’operatore due punti assegnano porzioni di una matrice. Ad esempio assegniamo la solita matrice:

A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]

ed estraiamone alcuni valori:

A(1:k,j)

rappresenta i primi k elementi della colonna jth di A. Allora estraiamo alcuni elementi:

>> A(1:4,4)

ans =

     4
     8
    12
    16

e calcoliamo la somma della quarta colonna.

>> sum(A(1:4,4))

ans =

    40

Il due punti assegna tutti gli elementi in una riga o colonna di una matrice e la keyword END  assegna l’ultima riga o colonna. Così

>> sum(A(:,end))

ans =

    40

calcola la somma degli elementi nell’ultima colonna di A.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Accesso agli elementi di una matrice in Matlab

MATLAB

Come accedere agli elementi di una matrice in Matlab

Vediamo in questa lezione come accedere agli elementi di una matrice in ambiente Matlab; per prima cosa quindi inseriamo nel workspace di Matlab una matrice di esempio:

>> A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]

A =

     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16

L’elemento in riga i e colonna j di A è denotato con il simbolo A(i,j). Ad esempio:

>> A(4,2)

ans =

    14

è il numero nella quarta riga e seconda colonna. Per la nostra matrice corrisponde a 14. Così risulta possibile calcolare la somma degli elementi nella quarta colonna di A digitando:

A(1,4) + A(2,4) + A(3,4) + A(4,4)

Questo produce:

>> A(1,4) + A(2,4) + A(3,4) + A(4,4)

ans =

    40

ma non è il modo più elegante di sommare una singola colonna. E’ anche possibile per accedere agli elementi di una matrice utilizzare un singolo pedice, A(k). Questo è il modo solito di accedere agli elementi di vettori riga e vettori colonna.

elementi.matlab

Ma si può anche applicare ad una matrice bidimensionale in questo caso la matrice è considerata come un vettore colonna, formato dalle colonne della matrice originale. Così, per la nostra matrice, A(8) è un altro modo di individuare il valore 14 immagazzinato nella posizione A(4,2), cioè quarta riga seconda colonna.

>> A(8)

ans =

    14

Se si tenta di accedere agli elementi di una matrice al di fuori di essa, si commette un  errore:

>> t = A(4,5)
??? Attempted to access A(4,5); index out of bounds because size(A)=[4,4].

(Messaggio di errore)

D’altra parte, se si immagazzina un nuovo valore in un elemento della matrice che eccede il suo ordine, c’`e un aumento dell’ordine per accomodare il nuovo venuto:

>> A(4,5) = 17

A =

1     2     3     4     0
5     6     7     8     0
9    10    11    12     0
13    14    15    16    17

I vettori vengono trattati in Matlab in modo del tutto analogo. È possibile visualizzare le singole voci di un vettore, dopo averlo definito nel modo seguente:

V=[2 1 3 4];

per visualizzare la prima voce è sufficiente digitare:

>> V (1)
ans =
2

Questo comando stampa il primo elemento nel vettore. Si noti inoltre che una nuova variabile chiamata ans è stata creata.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

La matrice di Durer in Matlab

MATLAB

La matrice di Durer è quello che in gergo si chiama un quadrato magico. Un quadrato magico è uno schieramento di numeri interi distinti in una tabella quadrata tale che la somma dei numeri presenti in ogni riga, in ogni colonna e in entrambe le diagonali dia sempre lo stesso numero; tale intero è denominato la costante di magia o costante magica o somma magica del quadrato.

Inseriamo la matrice di Durer:

A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]

Verifichiamo tutto quello appena detto sui quadrati magici, usando MATLAB. Il primo tentativo è il seguente:

sum(A)

MATLAB risponde con:

ans = 34 34 34 34

Quando non si specifica una variabile di output, MATLAB usa la variabile ans, per immagazzinare i risultati di un calcolo. Si è in questo modo calcolato un vettore fila che contiene certamente le somme delle colonne di A; ogni colonna ha la stessa somma, la somma magica, 34.

Cosa si può dire sulle somme delle righe? MATLAB ha una preferenza per lavorare con le colonne di una matrice, cosìı il modo più facile per ottenere le somme delle righe è quello di trasporre la matrice. Trasponiamo allora la matrice e facciamone la somma.

L’operazione di trasposizione si ottine aggiungendo un apostrofo alla matrice da trasporre, ad esempio:

A’

determina il risultato seguente:

ans = 16 5 9 4
3 10 6 15
2 11 7 14
13 8 12 1

e

sum(A ‘) ‘

produce un vettore colonna che contiene le somme delle righe:

ans = 34 34 34 34

durer

La somma degli elementi della digonale principale è ottenuta facilmente con l’aiuto della funzione diag che estrae solo gli elementi dellla diagonale.

diag(A)

produce:

ans = 16 10 7 1

e

sum(diag(A))

produce:

ans = 34

L’altra diagonale, l’antidiagonale così chiamata non è così importante e MATLAB non ha una funzione immediata per calcolarla. Ma una funzione originariamente creata per il suo uso in grafica, fliplr riporta una matrice da sinistra a destra.

sum(diag(fliplr(A)))
ans = 34

Si è così verificato che la matrice di Durer è davvero una magic square e, nel processo, si sono utilizzate operazioni sulle matrici di MATLAB.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Immettere matrici in Matlab

MATLAB

Si possono immettere matrici in MATLAB in molti modi diversi.

  • – introdurre un elenco esplicito di elementi.
  • – caricare matrici da files di dati esterni.
  • – generare matrici utilizzando la funzione built-in.
  • – creare matrici con le proprie funzioni in M-files.

Iniziamo a far vedere come registrare la matrice come un elenco dei suoi elementi. Si seguano a tal proposito solamente alcune convenzioni di base:

  • Separare gli elementi di una riga con spazi vuoti o virgole.
  • Usare un punto e virgola ”;” per indicare la fine di ciascuna fila.
  • Racchiudere l’elenco intero di elementi con parentesi quadrate , [ ].

matrici.matlabPer registrare la matrice di Durer,basterà semplicemente digitare:

A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]

MATLAB espone a video solo la matrice digitata,

A = 16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1

Questo procedimento associa precisamente i numeri a porzioni di memoria. Una volta fornita la matrice, essa è registrata automaticamente nel workspace di MATLAB. Ora si può indicarla semplicemente digitando al prompt di Matlab la lettera A.

>> A

A =

    16     3     2    13
     5    10    11     8
     9     6     7    12
     4    15    14     1

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il comando implicit none nel Fortran


FORTRANUn errore frequente che viene commesso dai programmatori è quello di utilizzare una variabile prima che questa venga dichiarata. In realtà tale rischio è tipico dei linguaggi di programmazione procedurali mentre quelli che sono stati realizzati per la programmazione ad oggetti ne sono esenti.

Il motivo di tutto questo è dovuto al fatto che il linguaggio di programmazione Fortran richiede che ogni variabile prima di essere utilizzata sia correttamente dichiarata, e non solo; prima di essere utilizzata dovrà anche essere inizializzata.

E’ questo il motivo per cui ogni programma Fortran, nella sezione dichiarativa presenta una dichiarazione dettagliata di tutte le variabili che in esso vengoo utilizzate.

Ed è proprio in tale momento che si può commettere l’errore di dimenticarsi della dichiarazione di una variabile che quindi verrà utilizzata all’interno del programma senza essere stata utilizzata e provocando quindi un errore.

Per obbligare il programmatore alla dichiarazione di tutte le variabili si utilizza appunto il comando inplicit none.

implicit.none
La sintassi dello statement implicit none è la seguente:

IMPLICIT NONE

Questo statement è utilizzato per evitare errori di utilizzo di variabili.Quando cioè viene utilizzato lo statement implicit none tutte le variabili devono essere dichiarate in una dichiarazione di tipo (dichiarazione specifica).

Ad esempio del tipo:

REAL :: {list of variables}

Nell’ipotesi una variabile venisse utilizzata senza essere stata dichiarata, un errore verrebbe rilevato in fase di compilazione. in questo modo riusciamo ad avere un controllo sulle variabili utilizzate nel programma.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Struttura di base di un programma Fortran


FORTRANUn programma in fortran 90 è caratterizzato dalla seguente struttura:

1) Sezione dichiarativa
E’ posizionata all’inizio e contiene istruzioni non eseguibili quali:

  •     nome del programma preceduto dal testo program;
  •     dichiarazione delle variabili.

2) Sezione esecutiva.
Rappresenta il corpo del programma e contiene le istruzioni eseguibili necessarie per effettuare le operazioni per le quali il programma stesso è stato ideato.

3) Sezione conclusiva.
Contiene le istruzioni che interrompono il programma quali:

  •     stop che interrompe il programma;
  •     end program che dice al compilatore che non c’`e pi`u nulla da compilare.

struttura.fortran

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Compilazione di un programma nel fortran


FORTRANLa procedura di compilazione di un programma fortran 90 avviene in maniera del tutto identica a quella utilizzata nelle precedenti versioni del fortran. Allora per compilare e collegare un codice sorgente fortran 90 con il nome main.f90, dobbiamo semplicemente digitare la seguente riga:

f90 main.f90

Questo creerà un archivio eseguibile chiamato a.out.

I programmi in fortran 90 che usano la forma libera di formato devono avere un’estensione f90. Come per il compilatore fortran 77, anche per il compilatore f90 possiamo specificare il nome del nostro file eseguibile utilizzando la seguente opzione:

f90 main.f90 -o main.out

fortran1

Abbiamo cioè utilizzato l’ opzione -o. Ciò creerà un archivio eseguibile chiamato main.out. Allo stesso modo, possiamo collegarci ad una libreria compilata di fortran 90 :

f90 main.f90 -L/usr/class/sccm001/lib -lmy\_lib90

Ciò collegherà il vostro programma main.f90 alla libreria compilata chiamata libmy\_lib90.a che risiede nell’indice /usr/class/sccm001/lib.

Supponiamo di aver scritto un programma per il calcolo dell’area di un triangolo che avremo chiamato triangolo.f90 a questo punto utilizzando il compilatore, vogliamo ottenere il file eseguibile; procediamo nel seguente modo:

1) Creiamo dapprima il file oggetto:

f90 -c triangolo.f90

Questo comando creerà un file triangolo.o.

2) Creiamo quindi il file eseguibile:

f90 -o triangolo.exe triangolo.o

Questo comando creerà il file triangolo.exe che rappresenta il file eseguibile cercato. A questo punto basterà digitare il nome del file senz estensione per lanciare il programma.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

La programmazione ad oggetti in Ruby

Guida alla programmazione con Ruby

Abbiamo già specificato che Ruby è totalmente Object Oriented, questo si traduce nel fatto che in ruby tutto è un oggetto. In tale aspetto riesce a surclassare il linguaggio ad oggetti per eccellenza e cioè Java in quanto in ruby non esiste nessuna distinzione tra tipi base e oggetti, allo stesso tempo la programmazione orientata agli oggetti in ruby non risulta ne invasiva ne fastidiosa, e ciò è dovuto alla sua maggior purezza.

Una caratteristica particolarmente gradita dai programmatori Ruby è stata la possibilità di utilizzare i cosiddetti blocchi che rappresentano una feature non comune nei linguaggi più diffusi e che permettono di rappresentare diversi problemi, anche molto diversi tra loro, con modalità chiare e significative.

Il Ruby risulta amato, allo stesso modo, dai programmatori professionisti che ne apprezzano le caratteristiche più avanzate, e dai principianti in quanto si presenta particolarmente adatto ad essere appreso come primo linguaggio.

Infatti grazie alla sua semplicità, è possibile comprendere le nozioni di base della programmazione, senza doversi preoccupare di innumerevoli convenzioni e aspetti non strettamente legati alla realizzazione degli algoritmi numerici.

RUBYOS

Inoltre possiamo dire che Ruby si presenta efficacemente espressivo in quanto fornisce molte strutture dati e tipi builtin, che rappresentano quelli offerti dal linguaggio; esempi sono:

  • hash,
  • array dinamici,
  • regexp,
  • numeri interi di dimensione arbitraria.

Le classi in ruby presentano un’interfaccia molto dettagliata, che determina una semplicità nell’utilizzo nelle operazioni comuni.

Una caratteristica che ha determinato il successo di Ruby nel panorama mondiale della programmazione è stata la sua estrema portabilità; esistono versioni di Ruby per piattaforma Linux (suo ambiente naturale visto che in tale contesto è stato sviluppato), per sistemi operativi Unix-like, Mac OS, e Windows in tutte le sue versioni.

RUBYOS

La versatilità di Ruby si manifesta nella sua interezza ,dal momento che esiste una versione di Ruby anche per l’obsoleto sistema operativo con interfaccia orientata ai caratteri MS-DOS.

Caratteristiche del linguaggio di programmazione Ruby

Guida alla programmazione con Ruby

Le caratteristiche peculiari di Ruby lo rendono un linguaggio di programmazione soprattutto semplice, il suo utilizzo si apprende in pochi giorni, senza presentare grosse difficoltà grazie ad una sintassi snella e davvero pratica; in aggiunta presentando a corredo un numero davvero corposo di librerie incluse nella distribuzione ed integrabili con quelle installabili tramite RubyGems si rende possibile, come già anticipato  realizzare i nostri programmi in brevissimo tempo.

Ruby si presenta particolarmente dinamico, un esempio è fornito dal fatto che le variabili possono essere tranquillamente utilizzate senza la necessità di dichiararne il tipo, sarà allora l’interprete in grado di identificarle; tutto questo però senza perdere in precisione in quanto le operazioni non consentite tra tipi diversi provocheranno un errore, cioè non potrà mai accadere, in modo più o meno nascosto, che un valore di un certo tipo venga utilizzato come se fosse di tipo diverso (strong typing).

Grazie a questo un operazione del tipo 1+”2″ (somma di un numero e di una stringa) determinerà un errore di runtime (errore in fase di esecuzione), diversamente da linguaggi come php o perl che invece non permettono un controllo analogo.

In ruby è possibile manipolare le classi ed i metodi a runtime, cioè possono essere aggiunti, cancellati o modificati in fase di esecuzione. In questo modo molte delle cose che negli altri linguaggi rappresentano delle strutture complesse possono in ruby costituire dei semplici metodi; è altresì possibile aggiungere classi e metodi personalizzati, creando dei Domain Specific Language (DSL).

DLS

Un Domain Specific Language è un minilinguaggio adatto ad un problema specifico, l’ideale sarebbe avere un linguaggio per ogni scopo, ma senza il problema di doverlo ogni volta imparare da zero. D’altronde il cuore della programmazione è costruire degli strumenti che permettano di risolvere un problema, ed un linguaggio è lo strumento per eccellenza.

Ruby è perfetto per la costruzione di semplici DSL da utilizzare all’interno della propria applicazione, grazie alla sua sintassi ed alle sue funzionalità di metaprogrammazione.