uni
MATLAB è un ambiente per il Calcolo Numerico e l’analisi statistica scritto in C, che comprende anche l’omonimo linguaggio di programmazione creato dalla MathWorks.
Se si incontra una funzione di cui non si conosce/ricorda l’utilizzo è possibile invocare la guida: help nomefunzione
.
Funzioni
function[y1] = nomefunzione(x1,x2)
- input x1 e x2, output y1
Questa dichiarazione deve essere la prima istruzione eseguibile del file che contiene la funzione.
puoi salvare una funzione in: - un file nomefunzione.m
- oppure un file che contiene solamente definizioni di funzioni, il nome del file deve corrispondere con il nome della prima funzione contenuta nel file
- oppure in uno script che contiene comandi e definizioni di funzione, in questo caso le funzioni devono essere contenuta alla fine del file e lo script non può avere il nome di nessuna delle funzioni al suo interno
Un file può contenere molteplici funzioni locali o innestate. Al fine della leggibilità è consigliato terminare ogni funzione con end
.
In particolare la parola chiave end
è richiesta sempre in questi casi:
- una qualunque funzione in un file contiene una funzione innestata
- la funzione è una funzione locale all’interno di un file che contiene solo funzioni e, a sua volta, ogni funzione locale usa la parola chiave
end
. - la funzione è locale all’interno di uno script
Per terminare una esecuzione prima dell’end
della funzione si può usare return
.
Esempio
function [area] = areacerchio(raggio)
%AREACERCHIO Funzione che calcola l’area del cerchio di raggio r
%se viene fornito un raggio negativo ritorna il valore flag -1
if raggio < 0
area = -1;
return
end
area = pi*raggio^2;
end
Sintassi
help comando
per ottenere info sul comando
Matrici e Vettori
a:t:b
crea una matrice con componenti che partono da ed arrivano a ad incrementi di . Se si può anche solo usarea:b
.v = linspace(a,b,n)
restituisce un vettore composto daglin
numeri traa
eb
equidistanziatiA(x,y,z)=k
per assegnare il singolo elemento della matrice di coordinatex,y,k
, se cerco di scrivere un elemento che non esiste, la matrice viene ingranditalenght(A)
: length of vectorsize(A)
: size of matrixA'
: traspostaA=diag(v,k)
crea una matrice con elementi del vettore v sulla k-esima diagonale e 0 altrove.A( x1:y1 ; x2:y2 )
seleziona la sottomatrice di con estremi i punti delle coordinate specificate.:
da solo è un’abbreviazione per1:end
[L,U,P]=LU(A)
rende fattorizzazione LU di A con pivoting
Grafici
- plot(x,y)` con x, y vettori della stessa lunghezza
- loglog(x,y) rappresenta la stessa cosa ma su scala logaritmica su entrambi gli assi
Misurazione del Tempo
- tic; istruzione toc; misura il tempo di istruzione
- misurazione più precisa:
timeit
, fa la media di molte esecuzioni
Optimization ToolBox
Linprog
Per risolvere un Problema di Programmazione Lineare (PL), MatLab offre linprog.
Risolve i problemi nel seguente forma:
dove e sono i vettori dei lower e upper bound.
Questa forma è una forma standard, quindi ogni problema PL può essere portato in questa forma
Esempio
Digitare: (ordine e nomi alle matrici non contano, conta solo ordine nel comando linprog(…))
>> c=[-1 0 -1]
>> UB=[ ; 8 ; ]
>> LB=[0;0;0]
>> beq=[9]
>> b=[-7 ; 3]
>> A=[-3 -5 0 ; 1 0 1]
>> Aeq=[2 6 -8]
>> [x,v]=linprog(c,a,b,aeq,beq,lb,ub)
>> appare soluzione: x=(val ottimo)
Intlinprog
[x,v]=intlinprog(c,int,a,b,aeq,beq,lb,ub)
dove intcom
è la lista degli indici di variabili che devono essere intere.
se per esempio ho 4 variabili e le voglio tutte intere: int=[1 2 3 4]
oppure int=[1;2;3;4]
Quadprog
[x,fval,exitflag,output,lambda]=quadprog(h,f,a,b,aeq,beq,lb,ub,x0,options)
esempio:
h = [1 -1 ;-1 2]
f = [-2 ; -6]
a = [1 1; -1 2; 2 1];
b = [2; 2; 3];
######### exitflag
Assignment
Restituisce l’assegnamento di costo minimo del TSP, per fare poi l’algoritmo delle toppe.
assignment([matricespecchiatadeicostiTSP])
fgh_display(f,g,h,x,range,c)
Disegna il dominio e il valore della funzione su questo dominio.
f=x1*2+3*x1*x2 ...
g1= x2+3 ..
..
g4= ..
fgh_display(f, [g1;g2;g3;g4], [], [],[],[])
minsearch
[x,fval]= fminsearch('6*x(1)^2+3*x(2)-9*x(1)*x(2) ecc',x0)
Gradiente proiettato
esegue un passo del gradiente proiettato, inserire bene le matrici vettore, b e x, non possono essere inserite matrici righe.
MINIMIZZA
RicOp.gradienteProiettato(f,a,b,xk,100)
Gomory
esegue un taglio di gomory a partire da una certa X di base.
Vanno inseriti i dettagli della forma duale std, quindi con gli scarti!!!
MI RACCOMANDO I PUNTI E VIRGOLI PER I VETTORI COLONNA.
gomory(c,x,a,b)
x
%es:
%per trovare gli scarti (vanno messi nella x), vettore s=b-a*x dove b e a NON %hanno i vincoli di positività (sono già nel duale)
c=[43 45 0 0]
x=[32 ; 12 ; s1 ; s2]
a=[123 132 1 0 ; 3 98 0 1]
b=[12 ; 1]
Simplex
esegue un passo del simplesso, MASSIMIZZA ATTENZIONE!!!!!
RicOp.pSimplex(f,A,b,base,iter)
⎰ max f'*x
⎱ A*x<=b
% EXAMPLE
% f = [-7 1]
% A = [
% -3 2;
% -1 -3;
% 0 1;
% 3 2;
% 1 0;
% 2 -1; ]
% b = [4; -6; 5; 22; 6; 16]
% base = [4 5]