CORSO DI LAUREA IN INGEGNERIA ELETTRICA, CHIMICA e MATERIALI Informatica B, C Anno Accademico 2014-2015 Proff. Danilo ARDAGNA, Antonio MIELE Seconda Prova in Itinere 29.6.2015 Cognome Nome Matricola Firma Durata: 2h Valutazioni 1 (7) 2 (6) 3 (6) 4 (7) 5 (6) Si ricorda che non è possibile consultare libri o appunti, o utilizzare la calcolatrice. - 1 - punti 7 La regressione lineare è un metodo statistico che serve per calcolare una linea retta che interpola una sequenza di punti in uno spazio cartesiano. In figura è mostrato un esempio di retta che interpola una data serie di punti. La retta y=mx+q che interpola una data sequenza di punti (x i,y i ) può essere calcolata mediante le seguenti formule: m =!!!!(!!!!)(!!!!)!!!!(!!!!)! q = y mx in cui x e y indicano i valori medi dei vettori x i ed y i. Scrivere una funzione Matlab che riceve come parametri due vettori x ed y contenenti le coordinate della serie di punti, verifica se i due vettori sono consistenti (stessa dimensione) e calcola e restituisce i parametri m e q della retta interpolata. Infine in caso i due vettori non sono consistenti, la funzione segnala un errore. 1
function [m q] = regressione(x, y) assert(all(size(x)==size(y))); 2 mx = mean(x); my = mean(y); m = sum((y-my).*(x-mx))./ sum((x-mx).*(x-mx)); q = my - m.*mx; - 2 - punti 6 Implementare uno script Matlab che 1. legge in input i vettori x ed y 2. esegue l interpolazione mediante la funzione definita nel primo esercizio; 3. disegna la curva interpolata e la sequenza di punti; 4. chiede all utente se vuole eseguire un altra interpolazione. In caso affermativo lo script riparte dal punto 1, altrimenti termina. Si noti che per disegnare una sequenza di punti basta specificare alla funzione plot la stringa o come terzo parametro dopo i due vettori contenenti le coordinate. Facoltativo Fornire una diversa implementazione del punto 1 in modo tale che lo script: 1a. chiede all utente il nome del file contenente le coordinate di una serie di punti (si assuma che ogni riga del file contiene la coordinata x e y di un punto); 1b. carica i dati dal file; continua=true; while continua x = input('inserisci il vettore delle x dei punti: '); y = input('inserisci il vettore delle y dei punti: '); [m q] = regressione(x,y); y1 = m.*x+q; hold on; plot(x,y,'o'); plot(x,y1); hold off; continua=input('vuoi continuare? (true/false) '); end Soluzione facoltativo: continua=true; while continua nomefile = input('inserisci il nome del file: '); [x, y] = textread(nomefile, '%f %f'); [m q] = regressione(x,y); y1 = m.*x+q; hold on; plot(x,y,'o'); plot(x,y1); hold off; continua=input('vuoi continuare? (true/false) '); end 2
3-3 - punti 6 Si consideri la seguente funzione Matlab: function [vett] = (a) if length(a) < 2 vett = a; elseif mod(length(a),2)==0 b = (a(2:end)); vett = [b a(1)]; else b = (a(2:end)); vett = [a(1) b]; end Mostrare come evolve la pila dei workspace ad ogni chiamata a funzione ed uscita dalla funzione, specificando anche il valore dei parametri in ingresso ed uscita, nel caso in cui vengano eseguiti i seguenti due comandi nella command line. Specificare infine il valore di q. v = [1 2 3 4 5]; q = (v); a=[5] 3
a=[5] vett=[5] vett=[5 4] v=? vett=[3 5 4] vett=[3 5 4 2] vett=[1 3 5 4 2] q=[1 3 5 4 2] 4 Dopo l esecuzione della funzione ricorsiva, q vale: q = [1 3 5 4 2]; - 4 - punti 7 Realizzare un programma in C che: Richieda all utente di inserire uno alla volta tutti gli elementi (numeri in virgola mobile) di una matrice quadrata NxN con N=5. Normalizzi la matrice A salvando il risultato in una nuova matrice B Stampi a video B. La matrice normalizzata può essere calcolata con la seguente espressione: B = A kak dove Suggerimento: per il calcolo dell elevamento a potenza e della radice quadrata utilizzare le funzioni pow e sqrt definite nella libreria math.h. La funzione pow riceve come parametri la base e l esponente (due valori in virgola mobile) e restituisce l elevamento a potenza; la funzione sqrt riceve come parametri un valore in virgola mobile e restituisce la radice quadrata del numero. #include <stdio.h> #include <math.h> #define N 5 s X X kak = a(i, j) 2 i j void main() { double a[n][n], b[n][n]; int i, j; 4
float sommaquadrati; float normaa; 5 // caricamento matrice for (i = 0; i < N; ++i) scanf("%f ", &a[i][j]); // calcolo della norma di a sommaquadrati = 0; for (i = 0; i < N; ++i) sommaquadrati = sommaquadrati + pow(a[i][j],2); normaa = sqrt(sommaquadrati); // calcolo di b for (i = 0; i < N; ++i) b[i][j] = a[i][j]/normaa; } // stampa di di b for (i = 0; i < N; ++i){ printf("%f ", b[i][j]); printf("\n"); } - 5 - punti 6 Facendo riferimento al seguente schema logico: Pilota (Numero, Nome, Cognome, DataNascita, Nazione) Costruttore (Nome, Nazione, NomePresidente, CognomePresidente) Auto (Pilota, CostruttoreTelaio, CostruttoreMotore) Circuito(Nome, DataGara, Km) ClassificaCircuito(Posizione, NomeCircuito, Pilota) Auto.Pilota->Pilota.Numero Auto.CostruttoreTelaio->Costruttore.Nome Auto.CostruttoreMotore->Costruttore.Nome ClassificaCircuito.NomeCircuito->Circuito.Nome ClassificaCircuito.Pilota-> Pilota.Numero Indicare le chiavi primarie ed i vincoli di integrità referenziale e formulare in SQL le seguenti interrogazioni: a) Elencare le auto in cui sia il telaio che il motore sono forniti dallo stesso costruttore b) Fornire nome e cognome dei primi tre classificati del gran premio di Monaco c) Fornire nome e cognome dei piloti primi classificati in circuiti la cui lunghezza è superiore ai 6 km 5
6 a) SELECT Pilota FROM Auto WHERE CostruttoreTelaio=CostruttoreMotore b) SELECT Nome, Cognome FROM ClassificaCircuito, Pilota WHERE Pilota=Numero and Posizione between 1 and 3 and NomeCircuito= Monaco c) SELECT DISTINCT Pilota.Nome, Cognome FROM ClassificaCircuito, Pilota, Circuito WHERE Circuito.Nome=NomeCircuito and Pilota=Numero and Posizione=1 and Km>6 6