Lunedì scorso, questi signori hanno vinto un premio Nobel
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:
x(t+1)=x(t)+hy(t)y(t+1)=y(t)+h(μ(1−x(t)2)y(t)−x(t))
x
è la variabile che corrisponde alla proteina, y
è ausiliariat
t
...t+1
x
e y
...Per questa ragione, il nostro sistema dinamico è tempo-discreto
x(t+1)=f(x(t))
x
può essere un vettore (i.e. molte variabili)f
si dice funzione di transizioneTorniamo al nostro oscillatore:
x(t+1)=x(t)+hy(t)y(t+1)=y(t)+h(μ(1−x(t)2)y(t)−x(t))
h
, μ
ed i valori iniziali di x
e y
...Lo pseudo-codice per il nostro algoritmo potrebbe essere:
xcur=x0
t=1..n
Xt=xcur
xcur=f(xcur)
x0
è il valore iniziale dello stato, xcur
quello correnteX
contiene il risultatoPer l'implementazione, iniziamo dalla funzione di transizione:
function Xf = f(X, h, mu)
% "Spacchetto" lo stato
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...x
e y
Xf
Quindi possiamo effettuare la simulazione in uno script:
Prima definiamo i dati del problema:
function es_van_der_pol()
% Dati del problema
x0 = 1;
y0 = 1;
h = 0.05;
mu = 2;
...
end
Quindi possiamo effettuare la simulazione in uno script:
Poi effettuiamo la simulazione vera e propria:
function es_van_der_pol()
...
% Simulazione
X = [];
T = 1:1000; % Istanti di tempo
xc = [x0, y0]; % Stato iniziale
for t = T
X(t, :) = xc; % Salvo lo stato corrente
xc = f(xc, h, mu); % Genero lo stato futuro
end
...
end
Quindi possiamo effettuare la simulazione in uno script:
Infine disegniamo l'andamento delle grandezze che ci interessano
function es_van_der_pol()
...
% "Spacchetto" le due componenti dello stato
x = X(:, 1); % Prima colonna
y = X(:, 2); % Prima colonna
% Disegno l'andamento nel tempo
plot(T, x)
end
Studiate il comportamento dell'oscillatore
Il codice è disponibile nello start-kit
x0
e y0
?μ
(in [1,6]
)?μ=1
e h=0.315
?Risposte:
x0
e y0
?μ
(in [1,6]
)?μ=1
e h=0.315
?Modello di Ricker
È un sistema dinamico tempo-discreto caratterizzato dall'equazione:
x(t+1)=x(t)er(1−x(t)N)
È nato per modellare l'evoluzione di una popolazione di salmoni
x
è il numero di individuir
è un tasso di crescitaN
è la popolazione sostenibileIl 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
function xf = f(x, r, N)
Determinate per via empirica per quali valori di r
:
Sia data una popolazione cresce secondo il modello
x(t+1)=rx(t)1+x(t)N
Dove:
r
indica il tasso di crescita (deve valere r∈[1.0,2.0]
)N
indica un valore di popolazione...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:
function xf = f(x, r, N)
xf
a partire da quello corrente x
Studiate per via empirica il comportamento del sistema:
r
la popolazione cresce?Sia data una popolazione cresce secondo il modello
x(t+1)=rx(t)1+(x(t)N)2
Dove:
r
indica il tasso di crescita (positivo)N
indica un valore di popolazione...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:
function xf = f(x, r, N)
xf
a partire da quello corrente x
Studiate per via empirica il comportamento del sistema:
r
la popolazione si azzera?N
?Nel file di funzione es_transpose.m
si definisca la funzione ausiliaria:
function B = my_transpose(A)
A
Si verifichi la correttezza:
es_transpose
Nel file di funzione es_count.m
, si definisca la funzione ausiliaria:
function [U, C] = my_count(V)
Che, dato un vettore di ingresso V
, restituisca U
e C
tali che:
U
contenga gli elementi distinti di V
unique
di Matlabv
in U
, la cella corrispondente di C
...v
in V
I.e. la funzione deve contare le occorrenze di ogni elemento.
Matlab fornisce la funzione:
function P = cumprod(V)
P(ii)
del vettore restituito...V
negli indici da 1
a ii
Quindi, per esempio:
cumprod([2, 4, 6]) % denota [2, 8=2*4, 48=2*4*6]
Nel file di funzione es_cumprod.m
, si definisca una funzione:
function P = my_cumprod(V)
cumprod
Si verifichi la correttezza nella funzione principale:
cumprod
in MatlabSi consideri la successione (linear congruential generator):
Xn+1=(aXn+c) mod m
Xi
, a
, c
ed m
interi; il valore di partenza X0
è notoNel file di funzione es_lcg.m
si definisca la funzione ausiliaria:
function R = my_lcg(X0, N)
X0
...X1
a XN
della successione...R
Si consideri m=16,a=9,c=3
Suggerimento: somiglia al codice per simulare sistemi dinamici!
x \mod y
è il resto della divisione intera tra x
e y
mod(x, y)
Si effettuino dei test nella funzione principale es_lcg
:
my_lcg
in sequenza con diversi valori di X0
Noterete che i valori di uscita variano in modo imprevedibile
X_0
, che si dice anche "seme" (seed)La funzione rand
in Matlab funziona in modo simile! Ci ritorneremo su...