Strumenti per il calcolo numerico Matlab/Octave Informatica B – Prof. A. Morzenti Matlab Cos’è Matlab: strumento (e corrispondente linguaggio) per elaborazioni di calcolo numerico NB: sta per MATrix LABoratory » centrato sulle matrici (ma include generiche funzionalità matematiche) usato nei successivi corsi di calcolo numerico MATLAB è uno strumento commerciale distribuito, su licenza NON gratuita, da “The MathWorks Inc” Student edition disponibile quando si è al Politecnico (http://www.asi.polimi.it/software/matlab.html) Esiste un altro strumento di nome Octave identico nella concezione, molto simile per gli aspetti operativi disponibile gratuitamente, vedi www.gnu.org/software/octave/ -2- Caratteristiche del linguaggio di Matlab/Octave (1) Linguaggio di alto livello simile a linguaggi di programmazione C, Java, Pascal possiede comandi sintetici per effettuare complesse elaborazioni numeriche Linguaggio interpretato, comandi e istruzioni NON tradotti in codice eseguibile dall’hardware MA manipolati da un programma (l’interprete) che li analizza ed esegue azioni da essi descritte Linguaggio dinamico NON occorre dichiarare le variabili risultano definite dal punto in cui vengono introdotte – e vengono incluse in una struttura detta tabella dei simboli il tipo delle variabili è dinamico a una variabile si possono assegnare, successivamente, valori di tipo diverso (scalari, stringhe, vettori, matrici...) -3- Caratteristiche del linguaggio di Matlab/Octave (2) In Matlab/Octave tutto è un array ci sono casi particolari significativi di array array 1x1 sono gli scalari array con una sola riga o colonna sono i vettori array con due dimensioni sono le matrici array con >2 dimensioni: matrici multidimensionali -4- Screenshot interfaccia MATLAB Mostra le variabili nel workspace Contenuto della directory corrente Finestra dei comandi Storia dei comandi Lancia i tool di MATLAB ed altro… -5- Screenshot dell’interfaccia OCTAVE Linea di comando dell’interprete -6- Comandi in Matlab Matlab accetta comandi che l’utente scrive di seguito al “prompt”: >> es. >> a = 10; Assegna alla variabile a il valore 10 Esempio di alcuni comandi (analizzeremo quelli più importanti) Il prompt accetta i comandi del sistema operativo (DOS, UNIX…) Esempio: in ambiente dos, dir mostra il contenuto della directory corrente help richiama la guida in linea diary può essere utilizzato per salvare la sessione di lavoro who, whos e workspace mostrano l’elenco delle variabili definite save permette di salvare in un file le variabili definite. Load le ricarica clear cancella tutte le variabili -7- Esempi Input Output Commento 1234/6 ans = 205.67 calcolo di un valore scalare a=1234/6 a = 205.67 assegnamento alla risultato di 1234/6 eps eps = variabile predefinita: la più piccola differenza rappresentabile tra due numeri 2/5 ans = 0.40000 divisione “destra” 5/0 ans = Inf divisione per zero 5^2 ans = 25 potenza real(4+5j) ans = 4 real è una funzione predefinita che restituisce la parte reale di un numero complesso 1+1==2 1+1~=2 ans = 1 ans = 0 1 = vero, 0 = falso, “==” uguale, “~=” diverso (codice ASCII di ‘~’: 126) 2.2204e-16 -8- variabile a del Esempi con gli array a=[1 2; 3, 4] a = 1 3 a 2 4 a = 1 3 x = -1.30000 1.73205 x(5)=abs(x(1)) x = -1.30000 1.73205 1.30000 c=a+b x=[-1 0 2]; y=x' b = 1 2 c = 2 5 y = -1 0 2 restituisce variabile a 2 4 x=[-1.3 sqrt(3) (1+2)/5] b=a’ a ora è una matrice 2x2, “;” separa le righe; virgola opzionalmente separa elementi (ma basta lo spazio) valore elementi possono espressioni 0.60000 0.60000 il 0.00000 della essere Notazione con () per accedere a elementi di una matrice; abs valore assoluto; NB: vettore x esteso per includere nuovo elemento; elementi non assegnati sono nulli matrice trasposta (scambiate righe e colonne) 3 4 somma di matrici, elemento per elemento (sottrazione con “-” simile) 5 8 il “;” blocca l’output, ma non impedisce la valutazione -9- Altre operazioni con gli array a = [] a = array vuoto, convenzionalmente rappresenta valore nullo [] x=1:5 x = 1 2 3 4 y=0:pi/4:pi y = 0.00000 1.57080 3.14159 v=10:-4:-3 v = 10 operatore “:” per vettori di numeri 5 produrre operatore “:” con passo di 0.78540 incremento e valori non interi 2.35619 (pi è pigreco) 6 2 sin(y) ans = 0.00000 1.00000 0.00000 x=[0:pi/100:pi/2]'; [x sin(x)] ans = 0.00000 0.00000 0.03142 0.03141 ...... 1.53938 0.99951 1.57080 1.00000 -2 valori negativi del passo e degli estremi funzioni predefinite si applicano 0.70711 ai vettori 0.70711 - 10 - produce la tabella di sin(x), 0≤ ≤x≤ ≤π/2 Diagrammi a due dimensioni Diagramma = insieme di coppie che rappresentano coordinate di punti Si usano vettori per contenere sequenze ordinate dei valori di ognuna delle coordinate plot(x,y) disegna digramma cartesiano dei punti che hanno valori delle ascisse in x, delle ordinate in y e li congiunge con una linea, per dare continuità al grafico funzioni xlabel per visualizzare nome asse ascisse, ylabel per ordinate, title per il titolo cubica 1000 800 600 400 ordinate 200 0 -200 -400 -600 -800 - 11 - -1000 -10 -8 -6 -4 -2 0 ascisse 2 4 6 8 10 Un esempio di cinematica Due treni partono da due stazioni adiacenti, che distano 15km, viaggiando a velocità di 50m/s e 30m/s in direzione opposta Costruire un grafico che mostra il loro movimento, fino a quando il più veloce raggiunge la destinazione Il più veloce impiega 15000/50=300s DistanzaTreno1=50·t; DistranzaTreno2=15000-30·t; (per mostrare la provenienza dalla direzione opposta) - 12 - Soluzione t=0:1:300; p1=50 * t; p2=15000 – 30 * t; plot(t,p1); hold on %adesso è possibile inserire nuove curve sul grafico plot(t,p2) hold off - 13 - Risultati ottenuti con l’esempio - 14 - Istruzioni e ‘;’ Le istruzioni possono essere seguite da ‘;’ ma non è obbligatorio Il ‘;’ blocca la visualizzazione del valore delle variabili coinvolte nell’istruzione Maggiore velocità di esecuzione Regola di buona programmazione Inserire sempre il ‘;’, a meno che non si voglia ispezionare il valore di una variabile a scopo di debugging - 15 - Commenti Il simbolo di commento può essere messo in qualsiasi punto della linea. MATLAB ignorerà tutto quello che viene scritto alla destra del simbolo %. Per esempio: >>% This is a comment. >>x = 2+3 % So is this. x= 5 - 16 - Array e variabili L’unità fondamentale di dati in MATLAB è l’array Una variabile in MATLAB è una regione di memoria che contiene un array Ha un nome definito dall’utente Per i nomi valgono regole simili a quelle del C C è un linguaggio a tipizzazione forte Le variabili vanno dichiarate prima dell’uso MATLAB è un linguaggio a tipizzazione debole Le variabili vengono create assegnando ad esse dei valori Il loro tipo è determinato dal tipo dei valori assegnati - 17 - Tipo double Una variabile di tipo double contiene uno scalare o un array di numeri espressi in 64 bit con doppia precisione Questi numeri possono essere Reali, es var1 = -10.7; Immaginari, es var2 = 4i; var3 = 4j; Complessi, es var3 = 10.3 + 10i; Es: x = [-1.3 3.1+5.3j 0] Le parti reali e immaginarie possono essere positive e negative nell’intervallo di valori [10-308, 10308] - 18 - Tipo char Una variabile di tipo char contiene uno scalare o un array di valori a 16 bit (8 bit in Octave), ciascuno dei quali rappresenta un carattere Es: commento = ‘questa e` una stringa’; Nome della variabile Array di 1x21 caratteri (NB: stringhe racchiuse tra apici singoli) whos commento; Name Size Bytes Class Attributes commento 1x21 42 char - 19 - Creazione e inizializzazione di una variabile Le variabili sono create al momento dell’inizializzazione Modi di inizializzazione Assegnamento Lettura dati da tastiera Lettura da file - 20 - Assegnamento variabile = espressione Esempi contenuto di a a = [0 7+1]; b = [a(2) 5 a]; secondo elemento di a Risultato a = [0 8] b = [8 5 0 8] Non tutti gli elementi devono essere specificati alla creazione… c(2, 3) = 5; 0 0 0 0 - 21 - 0 5 Assegnamento (2) L’array può essere esteso successivamente … d = [2 5]; d(4)=2; d = [2 5 0 2] Operatore di trasposizione g = d’; 2 5 0 2 Creare un vettore enumerando i valori di un insieme: uso dell’operatore ‘:’ x = 1:2:10; n = 1:3; m = [n’ n’] x = [1 3 5 7 9] n = [1 2 3] 1 2 3 - 22 - 1 2 3 Tabella delle funzioni predefinite Funzione Significato zeros (n) Genera una matrice nxn di zeri zeros (m,n) Genera una matrice mxn di zeri zeros (size(arr)) Genera una matrice di zeri della stessa dimensione di arr ones(n) Genera una matrice nxn di uno ones(m,n) Genera una matrice mxn di uno ones(size(arr)) Genera una matrice di uno della stessa dimensione di arr eye(n) Genera la matrice identità nxn eye(m,n) Genera la matrice identità mxn length(arr) Ritorna la dimensione più lunga del vettore size(arr) Ritorna un vettore [r c] con il numero r di righe e c di colonne della matrice; se arr ha più dimensioni ritorna array con numero elementi per ogni dimensione v(end) m(end, end) ultimo elemento di vettore v; ultimo elemento dell’ultima riga di matrice m; la costante end, come indice in un array, denota il più alto valore possibile dell’indice - 23 - Funzioni predefinite Esempi a = zeros(2); 0 0 0 0 b = zeros(2,3); 0 0 0 0 0 0 0 0 c = [1 2; 3 4]; d = zeros(size(c)); - 24 - 0 0 sottoarray: applicazione a vettori Si denota un sottoinsieme di un array usando vettori per valori degli indici >> v=[6 8 4 2 4 5 1 3] v = 6 8 4 >> v([1 4 7]) ans = 6 2 1 >> v(2:2:6) ans = 8 >> v(3:end-2) ans = 4 >> v(v) ans = >> 2 2 4 5 1 3 primo, quarto settimo elemento 2:2:6 è il vettore [2, 4, 6]: indica secondo, quarto, sesto elemento 5 dal terzo al terz’ultimo elemento 2 4 5 i valori di v usati come indice 5 3 2 8 2 - 25 - 4 6 4 sottoarray: applicazione a matrici m = 9 8 7 6 5 4 3 2 1 0 11 12 0 0 0 tutti gli elementi sulle righe 1 e 4 e sulle >> m([1 4], [2 3]) colonne 2 e 3 ans = 8 7 11 12 tutti gli elementi delle righe 1, 3 e 5 >> m(1:2:5, 1:end) ans = 9 8 7 3 2 1 0 0 0 notazione ‘:’ abbreviata per 1:end, cioè tutti i >>>> m(1:2:5, :) valori di quell’indice ans = 9 8 7 3 2 1 0 0 0 >> m(2:2:4, :) = [-1 -2 -3; -4 -5 -6]; >> m uso della notazione dei sottoarray per m = 9 8 7 individuare elementi oggetto di assegnamento -1 -2 -3 3 2 1 -4 -5 -6 0 0 0 - 26 >> Uso di uno scalare per assegnare valori a un array Esempio 3 3 3 3 m(1:4, 1:3) = 3 3 3 3 3 3 3 3 3 Il modo con cui uno scalare viene assegnato a un array dipende dalla forma dell’array che viene specificata a sinistra dell’assegnamento Esempio 2 4 4 3 4 3 3 m(1:2, 1:2) = 4 - 27 - 4 3 3 3 3 3 uso dell’array vuoto [] per cancellare elementi di un array un array vuoto [] assegnato a un elemento di un vettore non crea un ‘buco’ ma cancella un elemento e ricompatta il vettore un array vuoto [] non assegnabile a singoli elementi di matrici (non si possono “creare buchi”) assegnabile a intere righe o colonne di matrici, che vengono cancellate (ricompattando la matrice) >> a=[1 2 3 4 5]; >> length(a) ans = 5 >> a(3) ans = 3 >> a(3)=[] a = 1 2 4 >> a(3) ans = 4 >> length(a) ans = 4 5 >> m=magic(4) m = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> m(3,4)=[] ??? Subscripted assignment dimension mismatch. >> m(3,:)=[] m = 16 2 3 13 5 11 10 8 4 14 15 1 >> [r,c]=size(m) r = 3 c = 4 >> m(:,2)=[] m = 16 3 13 5 10 8 4 15 1 >> [r,c]=size(m) r = 3 c = 3 - 28 - Array: memorizzazione Matrici memorizzate per colonna: colonna 1, poi colonna 2, 3, etc. ogni colonna memorizzata per indici di riga crescenti Array memorizzati in forma lineare nella RAM variando più velocemente i primi indici più lentamente quelli successivi NB: opposto a quanto avviene in C ... 1 3 1 2 3 4 5 6 5 2 4 6 ... - 29 - Array: forma linearizzata Si può accedere a un array a più dimensioni come se ne avesse una sola Usando un unico indice si segue l’ordine della memorizzazione Da NON usare nella programmazione ma aiuta a capire certi costrutti.... >> a = [1 2 3; 4 5 6; 7 8 9; 10 11 12] a = 1 2 3 4 5 6 7 8 9 10 11 12 >> a(3, 2) ans = 8 >> a(10) ans = 6 >> - 30 - Variabili predefinite Matlab definisce un insieme di variabili predefinite (es, pi) Queste variabili spesso rappresentano importanti costanti della matematica (pi è pigreco, i e j sono sqrt(-1) ) Attenzione! Il valore di queste variabili può essere modificato, per esempio circ1=2*pi*10; pi = 3; circ2=2*pi*10; Il valore di circ2 non sarà più la circonferenza di un cerchio E` fortemente sconsigliato modificare il valore di una variabile predefinita (⇒ evitare di usare variabili i e j come contatori) - 31 - Variabili predefinite più comuni Variabile Scopo pi contiene 15 cifre significative di π i, j contiene il valore i ( − 1 ) inf (o Inf) rappresentazione dell’infinito (ottenuto di solito come risultato di una divisione per 0) nan Not-A-Number è il risultato di una operazione matematica non definita, es 0/0 clock contiene la data e l’orario corrente. E` un vettore di sei elementi (anno, mese, giorno, ora, minuti, secondi) date contiene la data corrente sotto forma di stringa eps epsilon: la più piccola differenza rappresentabile tra due numeri ans Variabile speciale usata per immagazzinare risultati non assegnati ad altre variabili - 32 - Operazioni con scalari e array Operazioni per gli scalari: + - * / ^ Operazioni per gli array Elevamento a potenza Array operation: eseguita sugli elementi corrispondenti degli array coinvolti (devono avere lo stesso numero di righe e colonne); si indica aggiungendo un punto prima dell’operatore aritmetico a= 1 3 2 4 b= 2 5 3 7 a .* b= 2 6 15 28 Matrix operation: segue le regole dell’algebra lineare (esempio: prodotto righe per colonne) 1 a= 3 2 4 2 b= 5 3 7 12 17 a*b = 26 37 - 33 - (a * b )ij = ∑k aik * bkj Operazioni tipiche per gli array Operazione Sintassi Commenti Matlab Array addition a+b Array e matrix addition sono identiche Array subtraction a–b Array e matrix subtraction sono identiche Array multiplication a .* b Ciascun elemento del risultato è pari al prodotto degli elementi corrispondenti nei due operandi Matrix multiplication a*b Prodotto di matrici Array right division a ./ b risultato(i,j)=a(i,j)/b(i,j) Array left division a .\ b risultato(i,j)=b(i,j)/a(i,j) Matrix right division a/b a*inversa(b) Matrix left division a\b inversa(a)*b Array exponentiation a .^ b risultato(i,j)=a(i,j)^b(i,j) - 34 - Matrix left division Serve per risolvere sistemi di equazioni lineari a11x1+a12x2+a13x3=b1 a21x1+a22x2+a23x3=b2 a31x1+a32x2+a33x3=b3 può essere espresso come Ax=B con a11 a12 a13 A = a21 a22 a23 a31 a32 a33 b1 B= b2 b3 x1 x = x2 x3 di conseguenza, x = A-1B=inversa(A)*b=A\B - 35 - Altre funzioni Funzione Scopo ceil(x) approssima x all’intero immediatamente maggiore floor(x) approssima x all’intero immediatamente minore fix(x) approssima x all’intero più vicino verso lo zero max(x) se x è un vettore, ritorna il valore massimo in x e, opzionalmente, la collocazione di questo valore in x; se x è matrice, ritorna il vettore dei massimi delle sue colonne min(x) se x è un vettore, ritorna il valore minimo nel vettore x e, opzionalmente, la collocazione di questo valore nel vettore; se x è matrice, ritorna il vettore dei minimi delle sue colonne mean(x) se x è un vettore ritorna uno scalare uguale alla media dei valori di x; se x è una matrice, ritorna il vettore contentente le medie dei vettori colonna di x; mod(m,n) mod(m,n) è m - q.*n dove q = floor(m ./ n) se n ~= 0 round(x) approssima x all’intero più vicino rand(N) genera una matrice di NxN numeri casuali - 36 - funzioni min (e anche max) applicate a vettori e matrici >> b = [4 7 2 6 5] b = 4 7 2 >> min(b) ans = 2 >> [x y]=min(b) x = 2 y = 3 >> 6 5 (con un solo risultato) dà il valore del minimo con due risultati dà anche la posizione del minimo >> a = [24 28 21; 32 25 27; 30 33 31; 22 29 26] a = 24 28 21 32 25 27 30 33 31 22 29 26 per una matrice dà vettore dei minimi nelle colonne >> min(a) ans = 22 25 21 >> [x y]=min(a) x = 22 25 y = 4 2 >> 21 1 per una matrice, con due risultati dà due vettori dei valori minimi nelle colonne e della loro posizione (riga) - 37 - Input/output Acquisizione dati da tastiera Funzione input valore = input(‘inserisci un valore ‘); Matlab stampa a video la stringa ‘inserisci un valore’ ed aspetta di ricevere un dato Valore scalare Array racchiuso tra [ e ] Stringa racchiusa tra ‘ e ’ Il dato inserito dall’utente viene memorizzato nella variabile valore - 39 - Stampa dei risultati (1) I risultati di un’operazione sono mostrati immediatamente se non si inserisce il ; Altri due modi disp accetta come parametro un array. Se questo array è di tipo char, lo stampa viene usato in congiunzione con num2str Esempio: – str = [‘il valore di pi e` ‘ num2str(pi)]; – disp(str); Stampa: “il valore di pi e` 3.1416” - 40 - Stampa dei risultati (2) …altro modo fprintf fprintf(‘Il valore di pi e` %f \n’, pi); stringhe di formato: %d (interi), %e (formato esponenziale), %f (virgola mobile), %g (il più corto tra il formato esponenziale e quello in virgola mobile) disp vs. fprintf disp è in grado di stampare anche valori complessi x=2*(1-2*i)^3; str=[‘disp: x = ‘ num2str(x)]; disp(str); disp: x = -22+4i fprintf ne stampa solo la parte reale fprintf(‘fprintf: x = %8.4f\n’, x); - 41 - fprintf: x = -22.0000 Lettura e scrittura di dati su file Tipi di file gestiti ascii = file di testo .mat = file proprietari di Matlab Comandi più semplici da usare save load - 42 - Salvataggio dei dati su file (1) file .mat save filename: salva su filename.mat tutte le variabili contenute nello spazio di lavoro save filename array1 array2: salva su filename.mat le variabili array1 e array2 I file .mat hanno un formato compatto Contengono Nomi, tipi e valori di ogni variabile La dimensione degli array … in generale, tutto ciò che serve per ripristinare lo stato dello spazio di lavoro Possono essere portati da un computer all’altro, anche con sistemi operativi diversi - 43 - Salvataggio dei dati su file (2) Limitazione dei file .mat E` un formato proprietario di MATLAB. Non è utilizzabile per leggere/scrivere dati con un altro programma Es, un editor di testi, excel, … Soluzione Uso dei file di testo (ascii), esempio x = [1.23 3.14 6.28; -5.1 7.00 0]; save –ascii filename.dat x; Produce il file filename.dat organizzato come segue 1.2300000e+000 -5.1000000e+000 o 3.1400000e+000 6.2800000e+000 7.0000000e+000 0.0000000e+000 Nota: si può usare qualsiasi estensione per questi file, è buona norma distinguerli dai file .mat - 44 - Acquisizione dati da file load carica dati da file nello spazio di lavoro di MATLAB load filename: carica nello spazio di lavoro tutte le variabili nel file load filename x y: carica nello spazio di lavoro solo le variabili x ed y Se filename non ha estensione o ha estensione .mat, viene trattato come un file .mat File ascii load filename.dat: crea una variabile di nome filename che conterrà i dati in filename.dat Il file deve contenere dati separati da virgole o spazi - 45 - Acquisizione di dati da fogli di calcolo A = xlsread(’filename’) importa il file di Microsoft Excel filename.xls nella matrice A Alcuni fogli di calcolo salvano i dati nel formato .wk1 M = wk1read(’filename’) per importare questi dati nella matrice M - 46 - Script in MATLAB Script (m-file) Uno script è un file di testo contenente una sequenza di comandi MATLAB non deve contenere caratteri di formattazione (solo testo puro) viene salvato con estensione .m I comandi all’interno di uno script sono eseguiti sequenzialmente, come se fossero scritti nella finestra dei comandi Per eseguire il file si digita il suo nome (senza .m) I risultati appaiono nella finestra dei comandi (se non usiamo il ; ) - 48 - Vantaggi/Svantaggi Uno script può essere ri-eseguito essere facilmente modificato essere spedito a qualcuno Uno script NON accetta variabili di input genera variabili di output Uno script opera sulle variabili del workspace, che può essere arricchito introducendone di nuove durante l’esecuzione dello script stesso - 49 - Come creare uno script Può essere creato utilizzando un qualsiasi editor di testo Ricordarsi di salvare il file come “solo testo” e di dare l’estensione .m Il file di script deve essere presente nella directory corrente o il cammino (path) che identifica la directory in cui si trova lo script deve essere salvato tra i path di Matlab - 50 - Nomi degli script Il nome del file deve cominciare con una lettera e può contenere cifre e il carattere underscore, fino a 31 caratteri Non dare lo stesso nome al file di script e a una variabile Non chiamare uno script con lo stesso nome di un comando o funzione MATLAB. Per verificare se esiste già qualcosa che ha un certo nome si può utilizzare la funzione exist. - 51 - Suggerimenti per strutturare e documentare uno script 1. Sezione dei commenti: Il nome del programma e le parole chiave, nella prima riga La data di creazione e i nomi degli autori nella seconda riga La definizione dei nomi delle variabili per ogni variabile di input e di output Il nome di ogni funzione creata dall’utente che viene usata nel programma Il comando help visualizza tutta la sezione dei commenti all’inizio dello script 2. Sezione di Input: inserimento dei dati in input e/o uso di funzioni di input 3. Sezione di calcolo 4. Sezione di output: uso si funzioni per visualizzare i risultati del programma - 52 - Dati su cui opera uno script file Gli script non accettano argomenti d’entrata e d’uscita Usano variabili già presenti nel workspace variabili acquisite da tastiera o file nuove variabili introdotte nello script Le variabili interne allo script diventano variabili del workspace Permangono dopo l’esecuzione dello script - 53 - Sezione di calcolo Calcoli matematici Assegnamenti Strutture di controllo Condizioni Cicli Comandi per la costruzione di grafici Chiamate a funzioni - 54 - Istruzioni della programmazione strutturata: if e while Hanno sintassi simile a quella di C, semantica uguale Vediamo due script che ne fanno uso %script nel file % quadWhile.m quad=[]; k = 1; while (k <= x) quad (k) = k*k; k=k+1; end; quad >> x=3 x = 3 >> quadWhile quad = 1 4 9 >> %script nel file divisible,m if (mod (x, 2) == 0) fprintf ('even\n'); elseif (mod (x, 3) == 0) fprintf ('divisible by 3\n'); elseif (mod(x,5)==0) fprintf ('divisible by 5\n'); else fprintf ('prime or divisible by x>5\n'); end >> x=15 x = 15 >>divisible divisible by 3 >> x=8 x = 8 >>divisible even - 55 - >> x=17 x = 17 >> divisible prime or divisible by x>5