Tag Archives: giuseppe ciaburro

Le istruzioni try e catch in Matlab

MATLAB
Le istruzioni try e catch in Matlab  consentono di ignorare il comportamento di errore predefinito per un insieme di istruzioni di programma. Se qualsiasi dichiarazione in un blocco try genera un errore, il controllo del programma passa immediatamente al blocco catch, che contiene le istruzioni di gestione degli errori.

Attraverso l’oggetto exception della classe MException, che risulta opzionale per il blocco catch, è possibile identificare l’errore.

L’esempio seguente mostra un blocco try / catch all’interno di una funzione che moltiplica due matrici. Se un’istruzione nel segmento try del blocco fallisce, il controllo passa al segmento di cattura. In questo caso, le dichiarazioni di cattura controllano il messaggio di errore che è stato rilasciato (restituito dall’oggetto lasterr) e rispondeno in modo appropriato.

try
   X = A * B
catch
   errmsg = lasterr;
   if(strfind(errmsg, 'Inner matrix dimensions'))
      disp('** Dimensione errata per le matrici')
end

Entrambi i blocchi try e catch possono contenere ulteriori dichiarazioni nidificate try / catch.

try
   statement1                      % Esecuzione statement1
catch
   try
      statement2                   % Tentativo di recupero errore
   catch
      disp 'Operazione fallita'    % manipolazione errore
   end
end

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Istruzione continue in Matlab

MATLAB

L’istruzione continue in Matlab interrompe temporaneamente l’esecuzione di un ciclo di programma, saltando eventuali istruzioni rimanenti nel corpo del ciclo. L’istruzione continue non provoca l’uscita immediata dal ciclo, come fa invece l’istruzione break o return, ma  continua all’interno del ciclo finché la condizione imposta da un ciclo for o while risulta soddisfatta.

L’istruzione continue in Matlab, nel caso fosse presente in un ciclo annidato, si comporta nello stesso modo. L’esecuzione è arretsta per la parte rimanete di programam presente nel ciclo for o while in cui si era verificato l’istruzione continue, e rientra nel ciclo se la condizione imposta restituisce true.

Vediamo allora un esempio che fa suo dell’istruzione continue in Matlab:

for k=-10:1:10
     if (k^2-30<0)
         continue;
     end
     val=k^2-30;
     fprintf('\n k=%g  val=%g',k,val)
 end

Il ciclo proposto valuta l’espressione k ^ 2-30 per k che va da -10 a 10 con passo unitario; tale valutazione però è efefttuata nel solo caso in cui tale espressione fornisce un valore positivo in quanto se dovesse risutare negativo l’istruzione continue non permetet l’esecuzione della parte restante del codice.

Istruzione continue in Matlab

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Ciclo Repeat in Matlab

MATLAB

Il ciclo Repeat in Matlab è caratterizzato dalla struttura REPEAT – END_REPEAT che rappresenta un ciclo che valuta il suo corpo fino a quando una condizione è soddisfatta. In un ciclo di ripetizione, prima è valutato il segmento di programma inserito nella struttura, poi viene effttuato il controllo sulla condizione e si ripete il ciclo fino a quando tale condizione restituisce TRUE. In contrasto con il ciclo while, nel ciclo repeat le istruzioni in esso contenute sono sempre valutate almeno una volta.

La sintassi del Ciclo Repeat in Matlab è la seguente:

repeat
  corpo del programma
until condizione end_repeat

Il corpo del programma può essere costituito da qualsiasi numero di istruzioni che devono essere separati mediante due punti: o una virgola;. Solo l’ultimo risultato valutato all’interno del corpo (il valore di ritorno del loop) è stampato su schermo. È possibile, a tal proposito, utilizzare il comando print per stampare a video i risultati intermedi.

La condizione contenuta nell’espressione booleana deve restituire un valore del tipo VERO o FALSO. La parola chiave  END_REPEAT può essere sostituita dalla parola chiave END.

Vediamo un esempio:

i := 1:
repeat 
  print(i);
  i := i + 1;
until i = 3 end:

In questa applicazione del ciclo Repeat in Matlab eseguiamo un ciclo che viene ripetuto fino a quando la condizione i=3 risulta vera. Stampiamo ad ogni opassaggio il valore di i in modo da verificare il corretto funzionamento.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Istruzione break in Matlab

MATLAB

L’istruzione break in Matlab interrompe l’esecuzione di un ciclo for o while. In tal caso le dichiarazioni del ciclo presenti dopo l’istruzione break non vengono eseguite. Nei cicli nidificati, l‘istruzione break in Matlab esce solo dal ciclo in cui si verifica, cosicchè il controllo passa all’istruzione che segue la fine di tale ciclo.

Tale tipo di istruzione viene di solito inserita in un codice per assicurare l’uscita dal ciclo nell’eventualità accada una specifica condizione. Questo è dovuto principalmente al fatto che deve essere evitata l’ipotesi che il ciclo continui ad iterare all’infinito.

Vediamo allora un alògoritmo che implemeta l’istruzione break al fine di uscire dal ciclo nel caso si verifichi una particolare condizione:

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
  x = (a+b)/2;
  fx = x^3-2*x-5;
  if fx == 0
    break
  elseif sign(fx) == sign(fa)
    a = x; fa = fx;
  else
    b = x; fb = fx;
  end
end
x

Nel caso specifico è stato inserito un controllo per verificare quando la funzione risulta pari a zero in tal caso l’istruzione break determina l’uscita dal ciclo.

Istruzione  BREAK

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Ciclo While in Matlab

MATLAB

Il ciclo while in Matlab ripete un gruppo di istruzioni un numero indefinito di volte attraverso il controllo di una condizione logica. L’istruzione END posta alla fine del ciclo ne delinea le istruzioni.

Il ciclo while in Matlab si utilizza quando non si conosce in anticipo il numero di volte per il quale il ciclo dovrà essere ripetuto. Prima di ogni ripetizione, Matlab verifica la condizione, se risulta vera il ciclo sarà eseguito; allora vengono eseguite tutte le istruzioni presenti fino all’istruzione end, arrivati a questo punto è nuovamente verificatala condizione. Se risulta ancora vera il ciclo viene eseguito nuovamente…. Quando Matlab verifica che la condizione è diventata falsa il ciclo termina e vengono eseguite le istruzioni successive all’end. La variabile contenuta nella condizione prende il nome di variabile di ciclo.

Ciclo While in Matlab

Di seguito è riportato un programma completo, che illustra in modo semplice ed immediato l’utilizzo corretto delle strutture di controllo del flusso while e if. Il programma utilizza il metodo della bisezione per trovare uno zero di un polinomio.

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
  x = (a+b)/2;
  fx = x^3-2*x-5;
  if sign(fx) == sign(fa)
    a = x; fa = fx;
  else
    b = x; fb = fx;
  end
end
x

Il risultato è la radice del polinomio x3 – 2x – 5, vale a dire:

x = 2.09455148154233

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il tipo complex nel Fortran


FORTRANIl tipo complex nel Fortran è un tipo di dati destinato ad ospitare un valore appartenente ad un sottoinsieme dei numeri complessi. E’ composto da due parti: una parte reale ed una parte immaginaria.

La procedura con la quale un numero complesso viene registrato in memoria prevede l’utilizzo di due unità di memoria consecutive destinate ad immagazzinare quindi, due valori reali, rispettivamente la parte reale,e la parte immaginaria del numero complesso.

La sintassi di una istruzione di dichiarazione di tipo di dato complesso ha la seguente forma:

COMPLEX [[([KIND=]parametro di kind )][, attributi ] ::] variabili

Ad esempio, la seguente istruzione dichiara due variabili complesse var_a e var_b aventi parametro di kind pari a 5.

COMPLEX(KIND=5) :: var_a,var_b

Poiché, come già anticipato un tipo complesso contiene due informazioni( parte reale e parte immaginaria del numero), tale specifica del numero di kind resta attribuita ad entrambe le parti.

Altri esempi di dichiarazioni di tipi comlessi sono:

COMPLEX(KIND=4), DIMENSION(8) :: vet_a, vet_b

Per dichiarare una costante del tipo complesso utilizzeremo una coppia di numeri reali (interi), scritti nel modo seguente:

a=(1.4,2.1)

La prima di tali costanti rappresenta la parte reale del valore complesso, la seconda la parte immaginaria. La forma generale di una costante complessa è la seguente:

complesso = “(” (intero | reale) “,” (intero | reale)“)”.

in cui la parte reale e la parte immaginaria sono costanti del tipo REAL/INTEGER.

I seguenti sono esempi di numeri complessi ammessi dal FORTRAN: il numero complesso 3.14 + 0.000736i viene rappresentato come (3.14,.763E-3), mentre il numero complesso 3 + 4i viene rappresentato come (3, 4).

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il tipo REAL nel Fortran


FORTRANIl tipo REAL nel Fortran rappresenta gli elementi di un sottinsieme dei numeri reali utilizzando due metodi di approssimazione: singola precisione e doppia precisione.

I numeri del tipo real vengono anche detti numeri in virgola mobile (floating-point). L’istruzione REAL è utilizzata per dichiarare una variabile/costante del tipo reale.

La sintassi dell’istruzione di dichiarazione di un ipo REAL è la seguente:

REAL [[([KIND=]parametro_di_kind )][, attributi ] ::] variabili

dove REAL è una parola chiave del Fortran e variabili è una lista di nomi di variabili, costanti o funzioni (separati da virgole) atte a contenere dati di tipo reale.

L’indicazione dei parametri è opzionale, ad esempio se il parametro_di_kind non è specificato allora è impiegato il valore del parametro di kind di default.

Facciamo un esempio:

REAL :: x, y, z

dichiara tre variabili, x, y e z, di tipo reale. Dichiarazioni più complesse sono:

REAL(KIND=high), OPTIONAL :: var1

REAL, SAVE, DIMENSION(10) :: var2

Oppure nella forma:

REAL(KIND=high) :: var3

REAL :: var4

DIMENSION var5(10)

SAVE var6

OPTIONAL var7

Quando risulta necessario definire una costante reale che rappresenta quindi il valore di un numero appartenente al sottoinsieme dei numeri reali, che la macchina che stiamo utilizzando è in grado di rappresentare, sono possibili due metodologie di rappresentazioni che si differenziano per la parte esponenziale.

Una costante del tipo REAL è immagazzinata in memoria con due informazioni: la mantissa e l’esponente. Il numero di bit allocati per la mantissa determina la precisione della costante, mentre il numero di bit allocati per l’esponente determina il range della costante.

Caratteristiche del tipo REAL nel Fortran

-valore reale minimo: –1.70141183E+38 circa
-valore reale massimo: +1.70141183E+38 circa
-precisione: 1.40129846E–45 circa

Operazioni ammesse dal tipo REAL nel Fortran

-assegnazione =
-somma +
-sottrazione –
-moltiplicazione *
-divisione /
-potenza **

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il tipo INTEGER nel Fortran


FORTRANIl tipo INTEGER nel Fortran rappresenta un tipo di dato destinato ad immagazzinare un valore appartenente ad un sottoinsieme dei numeri interi. Attraverso l’istruzione INTEGER potremo dichiarare che una data variabile è del tipo intero.

La sintassi dell’istruzione di dichiarazione di un tipo di dato intero è:

INTEGER [[([KIND=]parametro_di_kind )][, attributi ]::] variabili

dove INTEGER e KIND sono parole chiave del Fortran e variaibili è una lista di nomi di variabili, costanti o funzioni, separati tra loro attraverso l’impiego di virgole.

L’inidicazione dei parametri è opzionale, ad esempio se il parametro_di_kind non è specificato allora è impiegato il valore del parametro di kind di default.

Facciamo allora un esempio di dichiarazione di un tipo integer:

INTEGER :: i, j, k

In questa dichiarazione vengono specificate tre variabili, i, j e k, di tipo intero.

Per dichiarare un array di puntatori scriveremo:

 INTEGER, DIMENSION(15), POINTER :: array

Vediamo ora come possono essere dichiarate delle costanti intere: si utilizza una stringa di cifre con un segno (positivo/negativo) opzionale. Esempi corretti di dichiarazione di costati intere sono:

0, -345, 768, +12345

Mentre esempi sbagliati di dichiarazione di costati intere sono:

  • 1,234 : la virgola non è ammessa
  • 12.0: il punto decimale non è ammesso
  • —4 and ++3: più di un segno
  • 5- and 7+: il segno opzionale segue la stringa di cifre, mentre la dovrebbe precedere.

Sulle variabili del tipo integer sono ammesse le seguenti operazioni:

-assegnazione =
-somma +
-sottrazione –
-moltiplicazione *
-divisione intera /
-potenza **
-confronto >,< ,>=,< =,==./=

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Come inserire dei dati in un programma fortran


FORTRANIn questa lezione vedremo come inserire dei dati in programma fortran attraverso l’utilizzo dello statement DATA. La dichiarazione dei dati rappresenta un altro modo di inserire dei dati di input che sono noti al momento in cui il programma è scritto. E ‘ simile alla istruzione di assegnazione. La sintassi è la seguente:

data lista-delle-variabili/ lista-dei-valori/, …

dove i tre punti significano che questo modello può essere ripetuto. Ecco un esempio:

data a/10/,b/20/, c/2.5/, d/2.5/

Potremmo anche avere scritto questo nel modo seguente:

data a, b/10, 20 /, c,d / 2 * 2,5 /

Lo stesso risultato si ottiene con le assegnazioni:

a = 10
b= 20
c = 2.5
d= 2.5

La dichiarazione dei dati con l’ausilio dello statement data è più compatta e quindi spesso più conveniente. Si noti in particolare la notazione abbreviata per l’assegnazione di valori identici da utilizzare ripetutamente. La dichiarazione dei dati viene effettuata solo una volta, giusto prima dell’esecuzione del programma quando cioè esso si avvia. Per questo motivo, la dichiarazione di dati è utilizzata principalmente nel programma principale e non nelle subroutine.

La dichiarazione dei dati può anche essere utilizzata per inizializzare gli array (vettori, matrici). Questo esempio mostra come per assicurarsi che una matrice sia composta da tutti zero all’avvio del programma può essere utilizzato lo statement data:

real A(10,20)
data A/ 200 * 0.0/

Alcuni compilatori inizializzano automaticamente gli array ma non tutti, quindi se si utilizzare una matrice con elementi diversi da zero è una buona idea di seguire questo esempio. Naturalmente è possibile inizializzare gli array con valori diversi da zero. Si possono anche inizializzare i singoli elementi:

data A (1,1) / 12,5 /, A (2,1) / -33,3 /, A (2,2) / 1.0 /

In alternativa, è possibile elencare tutti gli elementi per piccoli array in questo modo:

integer v(5)
real B(2,2)
data v/10,20,30,40,50/, B/1.0,-3.7,4.3,0.0/

I valori per gli array bidimensionali saranno assegnati in ordine di colonna come al solito.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Interfacce nel Fortran


FORTRANIn questo articolo vedremo come utilizzare le interfacce nel Fortran per definire un sottoprogramma. Le interfacce sono necessarie per definire un sottoprogramma generico. L’ interfaccia è  un blocco di istruzioni non eseguibili  che serve a informare il compilatore sui tipi dati e numero degli argomenti dei sottoprogrammi utilizzati, in mdo che eventuali  utilizzi incoerenti (numero di argomenti diverso,  tipi dati differenti)  possa essere segnalato al momento della compilazione.

La sintassi per definire un blocco interfaccia è la seguente:

interface
...
end interface

al cui interno vanno inseriti i soli blocchi di dichiarazione dei sottoprogrammi e dei rispettivi argomenti. Non vanno messe nell’ interfaccia né  le dichiarazioni di variabili locali né  le istruzioni eseguibili dei sottoprogrammi.
In un blocco interfaccia si possono collocare le dichiarazioni relative a più  sottoprogrammi. Si possono anche avere più  blocchi interfaccia nella stessa unità  di programma.

Le interfacce nel Fortran riferiscono la specifica conoscenza che il compilatore ha circa una procedura durante la sua compilazione. Se l’interfaccia è esplicita, il compilatore può verificare che il sottoprogramma venga richiamato correttamente. Se, tuttavia, l’interfaccia è implicita, il compilatore Fortran 90 non dispone di informazioni sui tipi e numero di argomenti utilizzati dal sottoprogramma o il valore di ritorno del risultato di una funzione.

La Tipizzazione implicita viene utilizzata nel programma chiamante per determinare il risultato restituito da una funzione, nel caso in cui non si disponga della dichiarazione. Di conseguenza, nessun tipo di controllo può essere fatto per verificare che un sottoprogramma è stato chiamato correttamente. Diremo allora implicite tutte le interfacce che sono disponibili nel Fortran 77.

Ad esempio la funzione sin (x)  calcola, in modo appropriato, il seno del suo argomento, se x è singola o in doppia precisione, oppure un numero reale o complesso. In Fortran 90, i sottoprogrammi definiti dall’utente possono essere generici nello stesso senso. Le funzioni generiche e le subroutine possono essere definiti, analogamente a qualsiasi altro sottoprogramma, anche se l’interfaccia deve essere esplicita. Il modo usuale di definire una tale funzione generica è quella di inserirlo in un modulo, come nell’esempio riportato di seguito.

module AritmeticaRazionale
   type rational
      integer n, d   ! Numeratore e denominatore.
   end type rational

   interface operator (*)
      module procedure integerRationalMultiply, &
                       rationalIntegerMultiply
   end interface

   contains

   function integerRationalMultiply( i, r )
      type( rational ) integerRationalMultiply
      integer, intent( in ) :: i
      type( rational ), intent( in ) :: r

      integerRationalMultiply = rational( i * r%n, r%d )
   end function integerRationalMultiply

   function rationalIntegerMultiply( r, i )
      type( rational ) rationalIntegerMultiply
      type( rational ), intent( in ) :: r
      integer, intent( in ) :: i

      rationalIntegerMultiply = rational( i * r%n, r%d )
   end function rationalIntegerMultiply

end module AritmeticaRazionale

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Cicli FOR in Matlab

MATLAB

Per implementare dei Cicli FOR in Matlab bisogna utiizzare l’istruzione for che ripete un gruppo di istruioni un numero fissato di volte . Il ciclo viene terminato dall’istruzione END. Il ciclo for è una struttura di controllo iterativa che determina l’esecuzione di una porzione di programma ripetuta per un certo numero noto di volte.

Vediamo un esempio:

for n = 3:32
   r(n) = rank(magic(n));
end
r

Il punto e virgola che termina l’istruzione sopprime la stampa ripetuta, e il termine r dopo il loop espone a video il risultato finale.

Cicli FOR in Matlab

E’ buona norma ordinare i loop al fine di una discreta leggibilità; per fare questo è necessario identare il testo come nell’esempio proposto:

for i = 1:m
  for j = 1:n
    H(i,j) = 1/(i+j);
  end
end

In tale esempio è stato implementato un ciclo for annidato, in cui vengono utilizzati due cicli for per eseguire un doppio ciclo su una varibile strutturata.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO: