L’anno scorso, questi signori hanno vinto un premio Nobel
Michael Rosbash, Jeffrey C. Hall, and Michael W. Young
Ma cosa hanno fatto?
Hanno identificato i meccanismi fondamentali dietro il ritmo circadiano
Più in dettaglio, come funziona?
Ma come fa ad invertirsi l’andamento? La reazione è autocatalitica
Il ritmo circadiano è un esempio di oscillatore biologico
Oscillatore di Van der Pol (discretizzato)
Consideriamo una versione discretizzata dell’oscillatore di Van der Pol:
\[\begin{align} x^{(t+1)} &= x^{(t)} + h y^{(t)} \\ y^{(t+1)} &= y^{(t)} + h \left(\mu (1 - x^{(t)2})y^{(t)} - x^{(t)}\right) \\ \end{align}\]
Si dice sistema dinamico un sistema che ha uno stato che varia nel tempo
Per questa ragione, il nostro sistema dinamico si dice tempo-discreto
Un sistema dinamico tempo discreto è caratterizzato dall’equazione:
\[x^{(t+1)} = f(x^{(t)})\]
Per simulare l’andamento dello stato basta invocare ripetutamente \(f\):
Usiamo come esempio il nostro oscillatore:
\[\begin{align} x^{(t+1)} &= x^{(t)} + h y^{(t)} \\ y^{(t+1)} &= y^{(t)} + h \left(\mu (1 - x^{(t)2})y^{(t)} - x^{(t)}\right) \\ \end{align}\]
Per l’implementazione, iniziamo dalla funzione di transizione:
function Xf = f(X, h, mu)
% "Spacchetto" lo stato (per comodità)
x = X(1);
y = X(2);
% Calcolo lo stato futuro
Xf(1) = x + h * y;
Xf(2) = y + h * (mu * (1 - x^2)*y - x);
end
X
dovrà contenere lo stato corrente…Xf
Quindi possiamo effettuare la simulazione in uno script:
Prima definiamo i dati del problema:
Quindi possiamo effettuare la simulazione in uno script:
Poi effettuiamo la simulazione vera e propria:
Quindi possiamo effettuare la simulazione in uno script:
Infine disegniamo l’andamento delle grandezze che ci interessano
...
% "Spacchetto" le due componenti dello stato
x = X(:, 1); % Prima colonna
y = X(:, 2); % Prima colonna
% Disegno l'andamento nel tempo
plot(T, x)
Potete trovare il codice nello start-kit
Studiate il comportamento dell’oscillatore
Il codice è disponibile nello start-kit nel file es_van_der_pol.m
Risposte:
Consideriamo una particella in moto:
Si modelli il moto come un sistema dinamico
(0,0)
Nel file di script random_walk2.m
, definite la funzione:
xf
a partire da quello corrente xc
Come scegliere la direzione?
rand
per generare un numero \(v\) casuale in \((0, 1)\)Trovate il codice della soluzione nello start-kit
Modello di Ricker
È un sistema dinamico tempo-discreto caratterizzato dall’equazione:
\[x^{(t+1)} = x^{(t)} e^{r \left( 1 - \frac{x^{(t)}}{N}\right)}\]
È nato per modellare l’evoluzione di una popolazione di pesci
Il sistema può essere simulato in modo analogo a quanto visto
Il modello di Ricker può assumere una varietà di comportamenti:
Partite dal file es_ricker.m
nello start-kit
Determinate per via empirica per quali valori di \(r\):
Consideriamo una particella in moto:
Si modelli il moto come un sistema dinamico
0
Nel file di script random_walk1.m
, definite:
La funzione di transizione:
xf
a partire da quello corrente xc
Per scegliere la direzione, usiamo la tecnica vista in random_walk2.m
Sia data una popolazione che cresce secondo il modello
\[x^{(t+1)} = \frac{r\, x^{(t)}}{1 + \frac{x^{(t)}}{N}}\]
Dove:
Il modello è nato per applicazioni simili a quello di Ricker
Si implementi un simulatore per il modello
In particolare, partite dal file es_beverton_holt.m
nello start-kit:
Definite la funzione di transizione:
xf
a partire da quello corrente x
Studiate per via empirica il comportamento del sistema:
Il computer non gioca a dadi
Allora come fa Matlab a generare numeri casuali?
Risposta: barando! :-)
Si parla di numeri pseudo-casuali
Come esempio consideriamo il Linear Congruential Generator
È semplicemente la successione data da:
\[X_{n+1} = (a X_{n} + c)\ {\bf mod}\ m\]
Ricordate che \(x \mod y\) è il resto della divisione intera tra \(x\) e \(y\)
mod(x, y)
help
Nel file es_lcg.m
si definisca la funzione:
R
Nello script, si effettuino dei test:
my_lcg
in sequenza con diversi valori di X0
I valori prodotti possono sembrare casuali…
Sia data una popolazione che cresce secondo il modello
\[x^{(t+1)} = \frac{r\, x^{(t)}}{1 + \left(\frac{x^{(t)}}{N}\right)^2}\]
Dove:
Il modello è nato per applicazioni simili a quello di Ricker
Si implementi un simulatore per il modello
In particolare, partite dal file es_shepherd.m
nello start-kit:
Definite la funzione di transizione:
xf
a partire da quello corrente x
Studiate per via empirica il comportamento del sistema:
Nel file es_transpose.m
si definisca la funzione:
A
Nel file es_count.m
, si definisca la funzione ausiliaria:
Che, dato un vettore di ingresso V
, restituisca U
e C
tali che:
U
contenga gli elementi distinti di V
v
in U
, la cella corrispondente di C
…v
in V
I.e. la funzione deve contare le occorrenze di ogni elemento.
Suggerimento: potete ottenere U
con la funzione unique
di Matlab
Matlab fornisce la funzione:
P(ii)
del vettore restituito…V
negli indici da 1
a ii
Quindi, per esempio:
Nel file di funzione es_cumprod.m
, si definisca una funzione:
cumprod
Si verifichi la correttezza nella funzione principale:
cumprod
in Matlab“Bubble sort” un algoritmo semplice per ordinare un vettore
Ricordate l’esempio dell’ordinare l’aula nella prima lezione?
Ecco un possibile pseudo-codice
Sia dato un vettore \(V\) non necessariamente ordinato di lunghezza \(n\)
false
La difficoltà è capire come effettuare lo scambio
Nel file es_bubble.m
, definite la funzione:
V
utilizzando bubble sort…V
stesso (vedi nome della variabile di ritorno)Verificate la correttezza nella funzione principale es_bubble
:
sort
: