Friday, December 30, 2016

Tu chiamala new economy se vuoi...

Stamattina avevo deciso di fare vacanza e di finire di preparare un breve viaggio a Roma per capodanno (vorrei vedere le mostre su "Carlo Scarpa e il Giappone" e "Star Wars" al Vittoriano). Vacanza etimologicamente sa di rarefazione, di vuoto e tempo libero, speravo di leggere un libro che non finisco mai per colpa di un rosario di pratiche, adempimenti, ASiNate varie… Ma non è andata così e sono stato letteralmente ore a risolvere un viaggio che s'ingarbugliava sempre di più, in cui i mezzi di comunicazione, la disintermediazione e il pressappochismo romano si sono intrecciati in modo che mi è sembrato istruttivo (anche se per poco non era distruttivo). Proviamo a mettere ordine in codesta simpatica vicenda:

  • prenoto su internet il lontano 4 dicembre un appartamento per 4 persone e due notti; ci metto la mia bella carta di credito e ricevo conferma (per email) che è tutto ok, con tanto di "codice PIN" e "stato prenotazione". 
  • di seguito vado sul sito trenitalia e compro i miei bei biglietti per Roma beccando pure delle mirabolanti offerte "2x1" all'andata e "SuperEconomy" al ritorno, wow!
  • avevo già usato quell'appartamento e il giorno prima della partenza, prevista per il 31, chiamo i signori Lavinio e Massimiliana per mettermi d'accodo sulla consegna chiavi. I poveretti cadono dal pero e iniziano a snocciolare una serie di "ma com'è possibile?", "non abbiamo ricevuto nulla" che poi si tramutano in "abbiamo affittato a degli studenti da settembre" e "sarà finita nello spam", "il provider e si è dimenticato" e vai col liscio. Penso nitidamente che ci sarà un motivo se Roma è Roma da 2000 anni, e non sono bastati Etruschi, re e imperatori, unni, Papi e cardinali, politici, borgatari, lo Zio e M5S per cambiare le cose…
  • sacramentando appena appena, provo ad andare sul sito di trenitalia per annullare/recuperare i biglietti. Già vedo la vostra faccia ghignante: col piffero che ti rimborsano i "2x1" e i "SuperEconomy", hai voluto dei biglietti ganzi e adesso t'attacchi e t'arrangi.
  • colto da un po' di rimorso Lavinio mi manda degli indirizzi web di appartamenti Airbnb. mi ci metto con dedizione anche se ricordo ancora la giornata persa in un'altra occasione. Quella volta cercavo per dei familiari due camere a New York e dopo due giorni di taranta su internet, richieste, domande, prenotazioni e sprenotazioni mi ero arreso. Magari le cose sono cambiate e ora Airbnb è un fenomeno di cui tutti parlano per la capacità di generare utili e di fare incontrare domanda e offerta, la libertà immobiliare al potere, le due camere sono mie e me le gestisco io… A dir la verità qualcuno dice che genera anche tanto nero, evasione fiscale a rotoli e competizione sleale nei confronti degli alberghi veri. Ma saranno di sicuro malignità.
  • infatti, in men che non si dica (che vuol sempre dire mezz'ora) trovo un appartamento, lo prenoto con "instant booking", carta di credito sempre in trincea e sono salvo. Pensate, ricevo pure la mia conferma di prenotazione alle 14.19, l'ho svangata anche stavolta all'ultimo minuto. 
    Carta sempre sia lodata alle 14.01, conferma alle 14.19, "Ricordati della prenotazione" (colmo del ridicolo!), cancellazione alle 15.17 ma "siamo qui per aiutarti"... Infine alle 15.49 arriva la cavalleria sotto forma di Veronica di airbnb che mi aveva pure telefonato.
  • Ehhmm… si sa che le conferme sono qual piume al vento e alle 15.17 Airbnb mi sconferma dicendomi che "Il tuo host ha cancellato la tua prenotazione". Ma come? prenotazione ok, carta di credito molto ok, conferma super e poi tonfo? Nel frattempo mi sento con l'host Lucio, quello che offre la sistemazione su internet, accetta la prenotazione, conferma e poi sconferma nel giro di meno di un'ora… mentre cercavo di capire come recuperare le chiavi. Mi spiega calmo e gentile che stava trattando con altri e che "quelli di airbnb" si sono dimenticati di togliere l'offerta dal sito. Ah, va bene ma io sono nelle peste… "Mai paura, le trovo un'altra sistemazione in Via del Gatto Morto 50, un po' più piccolo, ma sempre due camere; bagno un po' piccolo ma sempre con vaso e bidet". penso che meno male che c'è il vaso: il bidet è una gran comodità ma se non ho il vaso sarei in difficoltà anche se, vuoi mettere, si può sempre innovare… poi mi dice di mandare un bonifico o una ricarica "poste-pay". Bonifico a chi? A un privato fuori dalla rete airbnb e dalla procedura concordata? Oppure una ricarica poste-pay, sto per tracollare: a chi? e come si fa? devo diventare correntista delle poste? Cancello anche i numeri di matricola e svuoto la cache dopo che te li ho mandati?
  • quando sto per cedere al lato oscuro della forza, mi telefona Veronica di airbnb, accento romano. ha una voce empatica, è calma, sono (stranamente) calmo anche io, sto in vacanza no? si scusa, si offre di trovarmi delle sistemazioni e di seguirmi nelle prenotazioni, "se vuole contatto io gli host per farle dare risposte celeri dopo che ha formulato la richiesta". mi dice anche di non usare mai l'instant booking e suggerisce categoricamente (bell'ossimoro!) di non mandare bonifici a gente di cui sai che si chiamano "Francesca e Lucio". mi sento anche ripreso per mano da una professionista che lavora per una impresa, inspiro ed espiro, provo a seguire i link che mi ha dato, me ne manda altri per email. io continuo a cercare e, nelle vesti di guest, domando a vari host se mi prendono. Uno mi dice di no; una ha avuto solo due prenotazioni dal 2014 e tutte e due le ha cancellate, siamo messi bene!
  • ma poi Jo (è il nick dell'host) con un bell'appartamento vicino a Pza Navona mi dice che è disponibile alle 16.43. mi arriva anche un email che devo completare la prenotazione entro le 16.44: czzrla, neanche Ernesto sparalesto con un mouse a canne mozze ce la può fare! E infatti era solo un incentivo, e alle 16.48 faccio tutto e ricevo conferma. No, aspetta un attimo: alla terza conferma e con due sconferme all'attivo non mi basta più, non mi basta mai, siamo sicuri?
  • richiama Veronica della casa madre, la stessa di prima, si scusa, mi dice che che è fatta; poi mi scrive Jo, pseudonimo di Eugenia la proprietaria e conferma pure lei
È veramente fatta, sembro il Washington Post ai tempi del Watergate con conferme indipendenti dell'esistenza in vita della prenotazione, ho le email, ho le telefonate, ho quasi tutto (e Bubola direbbe "Ma non ho te!"). A dir la verità, mi sento messo bene e rimbomba nella mia testa Navona, …Ona… Ona  e sono felice (stop, non rovinate tutto con la rima!) 
Come in tutte le storie c'è il colpo di scena: scrivo a Lucio che non faccio il bonifico né la poste pay e che ho trovato altrove, sempre su airbnb che è pur sempre l'istituzione cui è iscritto e di cui dovrebbe rispettare le guidelines. Guardate il dialogo non privo di una bella surrealtà che ne esce su whatsapp:

Sogno o son desto?
Lo trovo grande: Lucio non è un host, ma un'agenzia immobiliare da 30 appartamenti e 10 camere, raffiche di bonifici e ricariche poste-pay, "instant booking" e "fast sbooking"! Ripenso alla grande bellezza, alla potenza della rete e al peculiare casino che internet ha innestato in una Roma definita da un amico di Cividale città di "indigeni approssimativi, casinisti, inaffidabili". Lo sa lui, lo so io, lo sappiamo tutti che tutto il mondo è paese e che a Venezia abbiamo il MOSE, che Roma e altre città siano diverse è tutt'altro che certezza inossidabile. Ripenso alla polemica sorta dall'idea sacrosanta di mettere una cedolare secca del 20% anche a chi su airbnb affitta camere, alloggi, case. Non l'abbiamo fatto, forse la gabella soffocava la libertà d'impresa (e i bonifici, le ricariche…) e toglieva verve a questo vorticoso e financo festoso rimbalzare di conferme che durano molto meno dell'espace d'un matin

È un post lungo, lo so, ma sento una vocina  che mi dice che non di sola deregulation vive l'uomo. Sento sussurrare anche che la rete per metà t'incasina e per l'altra metà è salvifica (Veronica e airbnb, in un certo senso stanno anche dalla parte buona). Ripenso ai consigli della nonna: non dare corda agli sconosciuti, non mangiare le loro caramelle, non fare bonifici del menga… non sapeva cos'erano le ricariche poste-pay. E non lo so bene nemmeno io. Buon anno a tutti! 

Sunday, December 11, 2016

Chaos, bifurcation diagrams and Lyapunov exponents with R (2)

(The first part of this article can be read here)

Iteration of one-dimensional maps can generate stunning complexity and famed examples of chaotic behavior.  R can be used to get the flavor of this richness and reproduce some of the most famous pictures in the history of science, such as the bifurcation diagram of the logistic map or the representation of its Lyapunov exponents.

Given a one dimensional map depending on a parameter, a bifurcation diagram shows the stable structures (fixed point, cycles, attractors) visited by the dynamics for each value of the so called "bifurcation parameter".  Resisting the temptation to use again and again the beloved logistic map, consider instead the following dynamical system

x(t+1)=a cos x(t),  

taken from exercise 10.2.6, page 389 of Strogatz, "Nonlinear Dynamics and Chaos: With Applications to Physics, Biology, Chemistry, and Engineering".  The following script defines a function to get the bifurcation diagram for a given map (I modified some existing code, but I was not able to find and credit the exact source: https://web.stanford.edu/group/heeh/cgi-bin/web/node/59, say, has the same ideas. I defined a function and removed the use of "expression" and "evalf").  See also the post at https://www.r-bloggers.com/dynamical-systems-mapping-chaos-with-r/

bif_diagram <- function(f=function(x,a) (a*x*(1-x)),alow=2.5,ahigh=4,
                        thinness=1000, transient=200, collect=200){
        # f function, parameter must be named a
    n <- 1
    R <- seq(alow,ahigh,length=thinness)
    data <- matrix(0,collect,thinness+1)

    for(a in R){
      x <- runif(1) # random initial condition
      ## first converge to attractor
      for(i in 1:transient){
        x <- f(x,a)
      } # collect points on attractor
      for(i in 1:collect){
        x <- f(x,a)
        data[i,n] <- x
      }
  n <- n+1
}

data <- data[,1:thinness]
yrange <- range(data)+c(-0.1,0.1)
plot(R,data[1,], pch=".", xlab="a", ylab="States",ylim=yrange)
for(i in 2:collect) points(R,data[i,],pch=".")
}

Now, enter
f <- function(x,a) a* cos(x)
bif_diagram(f,alow=0.5,ahigh=4)
Bifurcation diagram for f(x,a)=a cos x, when a is the range [0.5,4].
You can see that, for low values of the parameter a, there are unique fixed points or simple cycles.  Then, through  a series of (quite typical) period-doubling bifurcations, chaos appears and suddenly disappears when the parameter crosses 3.  bif_diagram has defaults parameters that can be adjusted to specify the parameter's interval of interest or increase/decrease the resolution and legibility of the resulting plot.

One of the most interesting signature of chaos is the divergence of orbits arbitrarily close in their initial conditions.  Broadly speaking, orbits are stretched apart by some systems and a positive stretching rate is signaling the presence of chaos.  The Lyapunov Exponents (LE) is the average (exponential) growth rate of the divergence of initially nearby orbits.  LEs can be computed, for any value of the bifurcation parameter using the lyap function below, where is assumed that you have properly defined the dynamics f in advance.

lyap <- function(a,trans=300,num=1000){
    x0 <- runif(1)
    for(time in 1:trans){
        x1 <- f(x0,a=a);x0 <- x1
    }
    sl <- 0
    for(time in 1:num){
        x1 <- f(x0,a=a);x0 <- x1
        sl <- sl+log(abs(grad(f,x1,a=a)))
    }
    sl/num
}
In order to graph LEs define a sequence of values of the parameters, use sapply to get the sequence of corresponding exponents by applying lyap to the elements of the sequence and finally plot.  With the same map given above:

a <- seq(0.5,4,length=100)
ly <- sapply(a,lyap)
plot(a,ly,t="l")
Lyapunov exponents for f(x,a)=a cos x, when a is the range [0.5,4].
It can be seen, say, that when a=2, the LE is positive and chaos is in action [Check the bifurcation diagram to get the same intuition for that value of a].  Entering lyap(2) would indeed produce 0.15 (approximately).  In rough terms, this means that divergence of close initial points will be on average amplified by about 15% per iteration of the map over its domain.

To conclude:
  • it is fun to try the same things with a slightly modified map: x(t+1)=cos(a x(t)) (the parameter is "inside" the cos);
  • if you want to replicate two of the most well-known pictures related to the logistic map, type
    f <- function(x,a) a*x*(1-x)
    bif_diagram(f,0,4)
    
  • the graph of LE, seen on page 369 of Strogatz's book is readily obtained through
  • a <- seq(3,4,len=100)
    f <- function(x,a) a*x*(1-x)
    ly <- sapply(a,lyap,num=2000)
    plot(a,ly,t="l",ylim=c(-1,1));abline(h=0)
    
Lyapunov exponens for the logistic map, when a is the range [3,4].

Saturday, December 03, 2016

Non-linear dynamics and chaos using R (1)

I have been teaching the course "Mathematics" for the PhD students at Ca' Foscari University for a few years. In the lectures I cover some "scattered" material that may prove useful, sooner or later, to develop quantitative models in Economics. One of the weeks of the course is devoted to non-linear dynamics, one-dimensional maps and chaos.
R can be extremely useful to explore the dynamics, compute fixed points or cycles and have a numerical look at the map. The mix of computational techniques and theoretical investigation is widely acknowledged to be fruitful. As Strogatz, "Nonlinear Dynamics and Chaos: With Applications to Physics, Biology, Chemistry, and Engineering", puts it:
The study of maps is still in its infancy, but exciting progress has been made in the last twenty year, thanks to the growing availability of calculators, then computers, and now computer graphics. Maps are easy and fast to simulate on digital computers where time is inherently discrete. Such computer experiments have revealed a number of unexpected and beautiful patterns…
Given a non-linear map \(f\) you may want to plot the time series of states \(x_{t+1}=f(x_t)\), depict the cobweb diagram and look at fixed points, to begin with. Let \(f\) be the immortal logistic map depending on the parameter \(r\).

f <- function(x,r) r*x*(1-x)
bounce <- function(f,init=4,n=10,cobweb=T,timeseries=F,dom=NULL,...){
iterates <- NULL
x0 <- init
for(t in 1:n){
  x1<- f(x0,...)
  iterates[t] <- x1
  x0 <- x1
  }

if(cobweb & !timeseries){
    if(is.null(dom)){
    a <- range(c(init,iterates))[1]-0.5
    b <- range(c(init,iterates))[2]+0.5} else
    {a <- dom[1];b <- dom[2]}
    curve(f(x,...),a,b);grid(col=1);abline(0,1,lty=2)
    lines(c(init,iterates), f(c(init,iterates),...),t="s")
    points(c(init,iterates), f(c(init,iterates),...))
}

if(timeseries){
    plot(0:n,c(init,iterates),t="l")
}

}
bounce(f,0.1,r=3.7,n=100)

bounce computes \(n\) iterates of the map starting from init an plots a cobweb diagram. Defaults may or may not work for a specific map but the plotting domain can be provided if the educated guess doesn't work (here, say, bounce(f,0.1,r=3.7,n=100,dom=c(0,1) would be probably better).
bounce(f,0.1,r=3.7,n=100)
The function bounce shows the 45-degrees line (dashed) and its intersections with the graph of the function: fixed points and their stability can be visually investigated (or found with uniroot). Indeed, the name comes from the repeated "bounces" on the line and on the graph. Setting timeseries=T displays the sequence of states of the dynamics (i.e., the time series) as shown below for \(r=3.8282\), a value that generates intermittency, see page 363 of Strogatz:
bounce(f,0.1,r=3.8282,n=100,timeseries=T)
In a coming post, we'll use R to draw bifurcation diagrams and Lyapunov exponents.