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 \(\neq 0\))Consideriamo la funzione Zeta di Riemann ed il nostro vecchio codice:
\[\zeta(s) = \sum_{n=1}^\infty \frac{1}{n^s}\]
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:
\[\zeta(s) = \sum_{n=1}^\infty \frac{1}{n^s}\]
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:
\[\zeta(s) = \sum_{n=1}^\infty \frac{1}{n^s}\]
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
\[A x = 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)} = p \underbrace{\frac{1}{n}}_{\text{vettore}} + (1-p) P x^{(t)}\]
Uguagliando \(x^{(t+1)}\) e \(x^{(t)}\) otteniamo:
\[I x = p \frac{1}{n} - (1-p) P x\]
\[\underbrace{(I - (1-p) P)}_{A} x = \underbrace{p \frac{1}{n}}_{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:
\[\begin{align} x^{(t+1)} = P x^{(t)} \quad\text{ con }\quad P = \left(\begin{array}{cc} 0.9 & 0.5 \\ 0.1 & 0.5 \\ \end{array}\right) \end{align}\]
Da cui si ottiene il sistema:
\[(I - P) x = 0 \quad\text{ con }\quad \begin{aligned} (I-P) = \left(\begin{array}{cc} 0.1 & -0.5 \\ -0.1 & 0.5 \\ \end{array}\right) \end{aligned}\]
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
\[\begin{align} 0.1 x_g - 0.5 x_b = 0\\ -0.1 x_g + 0.5 x_b = 0 \end{align}\]
\[\begin{align} 0.1 x_g - 0.5 x_b = 0\\ x_g + x_b = 1 \end{align}\]
Nel file es_weather.m
:
Una stanza è ventilata mediante una sola apertura:
Il flusso di calore tra l’esterno e l’aria è dato da:
\[i_1 = \frac{1}{R_1}(T_o - T_a)\]
Il flusso di calore tra l’aria e i muri è dato da:
\[i_2 = \frac{1}{R_2}(T_a - T_w)\]
Per quanto riguarda le temperature:
In particolare vale la relazione:
\[\frac{d T_a}{d t} = \frac{1}{C_a} (i_1 - i_2)\]
Per completezza, ricordiamo che:
\[\begin{align} i_1 &= \frac{1}{R_1}(T_o - T_a) & i_2 &= \frac{1}{R_2}(T_a - T_w) \end{align}\]
Questo è un primo esempio di sistema dinamico tempo-continuo
I sistemi dinamici tempo continui sono descritti mediante equazioni differenziali
\[\dot{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:
\[\begin{align} \frac{d T_a}{d t} &= \frac{1}{C_a} (i_1 - i_2) & i_1 &= \frac{1}{R_1}(T_o - T_a) & i_2 = \frac{1}{R_2}(T_a - T_w) \end{align}\]
Quindi, all’equilibrio avremo:
\[\begin{align} 0 &= \frac{1}{C_a} (i_1 - i_2) \\ i_1 &= \frac{1}{R_1}(T_o - T_a) \\ i_2 &= \frac{1}{R_2}(T_a - T_w) \end{align}\]
E questo sappiamo come risolverlo!
Partiamo dal sistema originale:
\[\begin{align} 0 &= \frac{1}{C_a} (i_1 - i_2) \\ i_1 &= \frac{1}{R_1}(T_o - T_a) \\ i_2 &= \frac{1}{R_2}(T_a - T_w) \end{align}\]
Partiamo dal sistema originale:
\[\begin{align} \frac{1}{C_a} (i_1 - i_2) &=0 \\ i_1 + \frac{1}{R_1} T_a &= \frac{1}{R_1}T_o \\ i_2 - \frac{1}{R_2}T_a &= \frac{1}{R_2} T_w \end{align}\]
Partiamo dal sistema originale:
\[\left(\begin{array}{ccc} \frac{1}{C_a} & - \frac{1}{C_a} & \\ 1 & & \frac{1}{R_1} \\ & 1 & -\frac{1}{R_2} \\ \end{array}\right) \left(\begin{array}{c} T_a \\ i_1 \\ i_2 \end{array}\right) = \left(\begin{array}{c} 0 \\ \frac{1}{R_1}T_o \\ -\frac{1}{R_2}T_w \end{array}\right)\]
Se chiamiamo la matrice \(A\) ed il termine noto \(b\), abbiamo:
\[A x = 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(x_0) = y_0\]
\[f(x_2) = y_2\]
\[f'(x_1) = y_1\]
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) = \sum_{i=0}^n \alpha_i x^i\]
Le nostre condizioni allora diventano:
\[\begin{align} & \text{passaggio per } (x_0, y_0) && \sum_{i=0}^n \alpha_i x_0^i = y_0 \\ & \text{passaggio per } (x_1, y_1) && \sum_{i=0}^n \alpha_i x_2^i = y_2 \\ & \text{annullamento di } f'(x_1) && \sum_{i=1}^n i \alpha_i x_1^{i-1} = 0 \end{align}\]
Ci siamo quasi! Guardiamole meglio:
\[\begin{align} & \text{passaggio per } (x_0, y_0) && \sum_{i=0}^n \alpha_i x_0^i = y_0 \\ & \text{passaggio per } (x_1, y_1) && \sum_{i=0}^n \alpha_i x_2^i = y_2 \\ & \text{annullamento di } f'(x_1) && \sum_{i=1}^n i \alpha_i x_1^{i-1} = 0 \end{align}\]
Quali sono le incognite?
Che grado di polinomio ci serve?
In questo modo otteniamo il sistema:
\[\begin{align} \alpha_2 x_0^2 + \alpha_1 x_0 + \alpha_0 &= y_0 \\ \alpha_2 x_2^2 + \alpha_1 x_2 + \alpha_0 &= y_2 \\ 2 \alpha_2 x_1 + \alpha_1 &= 0 \end{align}\]
La tecnica vista è un metodo generale per progettare curve:
Consideriamo il sistema per il problema di progettazione dell’arcata:
\[\begin{align} \alpha_2 x_0^2 + \alpha_1 x_0 + \alpha_0 &= y_0 \\ \alpha_2 x_2^2 + \alpha_1 x_2 + \alpha_0 &= y_2 \\ 2 \alpha_2 x_1 + \alpha_1 &= 0 \end{align}\]
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 = \int_{\underbrace{x_0}_{= 0}}^{x_1} f(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 = \int_{\underbrace{t_0}_{=0}}^{t_1} f(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!