fprintf
fprintf
La funzione fprintf
stampa con formattazione controllata:
L’interfaccia della funzione è:
FORMAT
è una stringa da stampareE1
, E2
sono espressioni (e.g. nomi di variabile)FORMAT
può contenere dei “segnaposto”, con il carattere %
%f
è un segnaposto per un valore reale%d
è un segnaposto per un valore interoE1
E2
, etc.fprintf
Vediamo un esempio:
Stampa: A = 10.500000, B = 2.000000, A*B = 21.000000
\n
” è un carattere speciale e serve ad andare a capoI segnaposto cono configurabili
Ci interessa un caso solo: “%.Nf
” stampa un reale con N
valori decimali
%.3f
stampa con 3 cifre decimali%.1f
stampa con 1 cifra decimalewhile
while
Il ciclo for
non è sempre adeguato ad implementare iterazioni:
Per questi casi, Matlab fornisce il ciclo
while
La sintassi è:
<espressione>
denota true
(o ≠0)Consideriamo la funzione Zeta di Riemann ed il nostro vecchio codice:
ζ(s)=∞∑n=11ns
z = 0; % val. della somma
old_z = -Inf; % vecchio z
for n = 1:10000 % 1e5 = iterazioni massime
z = z + 1 ./ n.^s;
if abs(z - old_z) < 1e-6 % 1e-6 è la tolleranza
break % Interrompe il ciclo
end
old_z = z; % rimpiazzo il vecchio z
end
Consideriamo la funzione Zeta di Riemann ed il nostro vecchio codice:
ζ(s)=∞∑n=11ns
z = 0; % val. della somma
n = 1;
old_z = -Inf; % vecchio z
while abs(z - old_z) > 1e-6 % 1e-6 è la tolleranza
old_z = z; % memorizzo il vecchio z
z = z + 1 ./ n.^s;
n = n + 1; % incremento n
end
Consideriamo la funzione Zeta di Riemann ed il nostro vecchio codice:
ζ(s)=∞∑n=11ns
z = 0; % val. della somma
n = 1;
old_z = -Inf; % vecchio z
while abs(z - old_z) > 1e-6 % 1e-6 è la tolleranza
old_z = z; % memorizzo il vecchio z
z = z + 1 ./ n.^s;
n = n + 1; % incremento n
end
n
esplicitamenteIl ciclo while
non fornisce garanzie di terminazione
Per esempio:
n
non viene incrementato!Se vi capita, niente panico: basta premere [CTRL+C]
Consideriamo un sistema dinamico tempo-discreto
In generale è definito da una equazione del tipo:
x(t+1)=f(x(t))
Per questo tipo di sistemi, abbiamo imparato a:
Gli stati di equilibrio, però, si possono determinare a priori!
Uno stato è di equilibrio se viene “trasformato in se stesso”
Formalmente, uno stato di equilibrio x deve soddisfare:
x=f(x)
Se risolviamo l’equazione, determiniamo gli stati di equilibrio
Ax=b
E possiamo risolverlo con i metodi visti in analisi numerica
Per l’algoritmo pagerank, visto la scorsa lezione
L’equazione fondamentale è data da:
x(t+1)=p1n⏟vettore+(1−p)Px(t)
Uguagliando x(t+1) e x(t) otteniamo:
Ix=p1n−(1−p)Px
(I−(1−p)P)⏟Ax=p1n⏟b
Supponendo di disporre delle variabili:
p
, per la probabilità di stancarsiP
, per la matrice delle probabilità di clickn
, per il numero delle paginePossiamo prima costruire la matrice A e la colonna b:
A = (eye(n) - (1-p)*P) % eye e' la matrice identita'
b = (ones(n,1) * p/n) % ones(n,1) per avere una colonna
E quindi possiamo calcolare la soluzione con una divisione sinistra:
xeq = A \ b
L’approccio è valido anche per sistemi dinamici non lineari
Uno stato, per essere di equilibrio, deve soddisfare:
x=f(x)
Ce ne occuperemo più avanti nel corso
Quando risolvere un sistema di equazioni e quando simulare?
Simuliamo se:
Risolviamo le equazioni se:
Un sistema dinamico tempo discreto lineare:
Per esempio, per le previsioni del tempo (scorsa lezione) avevamo:
x(t+1)=Px(t) con P=(0.90.50.10.5)
Da cui si ottiene il sistema:
(I−P)x=0 con (I−P)=(0.1−0.5−0.10.5)
det
per calcolare il determinante:Cosa vuol dire in pratica?
Per esempio, supponiamo di avere due vasi comunicanti
Nel caso delle previsioni del tempo:
Il tempo è bello o brutto, quindi la somma delle probabilità deve essere 1
0.1xg−0.5xb=0−0.1xg+0.5xb=0
0.1xg−0.5xb=0xg+xb=1
Nel file es_weather.m
:
Una stanza è ventilata mediante una sola apertura:
Il flusso di calore tra l’esterno e l’aria è dato da:
i1=1R1(To−Ta)
Il flusso di calore tra l’aria e i muri è dato da:
i2=1R2(Ta−Tw)
Per quanto riguarda le temperature:
In particolare vale la relazione:
dTadt=1Ca(i1−i2)
Per completezza, ricordiamo che:
i1=1R1(To−Ta)i2=1R2(Ta−Tw)
Questo è un primo esempio di sistema dinamico tempo-continuo
I sistemi dinamici tempo continui sono descritti mediante equazioni differenziali
˙x=f(x)
Possiamo però già osservare che:
Il generale, un sistema tempo continuo all’equilibrio deve soddisfare:
f(x)=0
Nel nostro esempio abbiamo:
dTadt=1Ca(i1−i2)i1=1R1(To−Ta)i2=1R2(Ta−Tw)
Quindi, all’equilibrio avremo:
0=1Ca(i1−i2)i1=1R1(To−Ta)i2=1R2(Ta−Tw)
E questo sappiamo come risolverlo!
Partiamo dal sistema originale:
0=1Ca(i1−i2)i1=1R1(To−Ta)i2=1R2(Ta−Tw)
Partiamo dal sistema originale:
1Ca(i1−i2)=0i1+1R1Ta=1R1Toi2−1R2Ta=1R2Tw
Partiamo dal sistema originale:
(1Ca−1Ca11R11−1R2)(Tai1i2)=(01R1To−1R2Tw)
Se chiamiamo la matrice A ed il termine noto b, abbiamo:
Ax=b
Partite dal file es_temperature.m
nello start-kit
Si vuole progettare una arcata a ridosso di una parete verticale
La curva che descrive l’arcata:
Un approccio: trattiamo la curva come una funzione f(x)
In questo modo possiamo tradurre le condizioni in equazioni:
f(x0)=y0
f(x2)=y2
f′(x1)=y1
Così come sono ci dicono ben poco…
Ci serve una assunzione sulla classe della funzione f(x)
Per esempio: f(x) è polinomiale. Formalmente:
f(x)=n∑i=0αixi
Le nostre condizioni allora diventano:
passaggio per (x0,y0)n∑i=0αixi0=y0passaggio per (x1,y1)n∑i=0αixi2=y2annullamento di f′(x1)n∑i=1iαixi−11=0
Ci siamo quasi! Guardiamole meglio:
passaggio per (x0,y0)n∑i=0αixi0=y0passaggio per (x1,y1)n∑i=0αixi2=y2annullamento di f′(x1)n∑i=1iαixi−11=0
Quali sono le incognite?
Che grado di polinomio ci serve?
In questo modo otteniamo il sistema:
α2x20+α1x0+α0=y0α2x22+α1x2+α0=y22α2x1+α1=0
La tecnica vista è un metodo generale per progettare curve:
Consideriamo il sistema per il problema di progettazione dell’arcata:
α2x20+α1x0+α0=y0α2x22+α1x2+α0=y22α2x1+α1=0
A partire dal file es_arc.m
nello start-kit:
Si vuole progettare lo scavo per il letto di un fiume
La sezione dello scavo deve presentarsi come segue:
Si vuole progettare lo scavo per il letto di un fiume
Se f(x) è la funzione che descrive la curva, l’area della sezione è:
S=∫x1x0⏟=0f(x)dx
A partire dal file es_riverbed.m
nello start-kit:
Si vuole controllare l’accelerazione di un carrello automatico
Il profilo di velocità in accelerazione deve presentarsi come segue:
Curve di questo tipo si utilizzano nelle centraline di controllo di auto e moto
Si vuole controllare l’accelerazione di un carrello automatico
A partire dal file es_acceleration.m
nello start-kit:
Si vuole controllare l’arresto di un carrello automatico
Il profilo di velocità in frenata deve presentarsi come segue:
Possiamo usare la curva per programmare una centralina di controllo
Si vuole controllare l’arresto di un carrello automatico
S=∫t1t0⏟=0f(t)dt
A partire dal file es_brake.m
nello start-kit:
Si vuole progettare un telaio per una bicicletta
La forma del telaio deve apparire come segue:
Si vuole progettare un telaio per una bicicletta
A partire dal file es_frame.m
nello start-kit:
Attenzione:
Ci sono due condizioni che coinvolgono entrambe le curve:
Non possono essere formulate separatamente!