#
#    - - -    INCONTRO N. 4 - Geometria  e  Funzioni di due variabili      - - -
#
# Intermezzo: esempio da elaborare proposto da qualcuno di voi.
# Che fare di una tabella di votazioni di questo tipo?
# Potremmo leggerla direttamente con R, ma non sarebbe banale dare i comandi per
# caricare le informazioni dai posti giusti. Con un copia e incolla riscriviamo
# le informazioni in questo formato; ecco il file: voti2.csv (devo eventualmente
# specificare che il separatore è la ",").
# Supponiamo non solo di volre fare un semplice calcolo di quanti hanno preso i
# diversi "voti", ma di voler trovare voto medio e cose del genere: traduciamo
# i voti in forma numerica. Prima di vedere come farlo, cerchiamo di caricare la
# cartella. Se siamo in rete basta che facciamo:
read.csv("http://macosa.dima.unige.it/om/prg/R/voti2.csv",sep=",",skip=1)
# salto la prima riga e specifico che il separatore è ","
# Se il file è sul nostro computer basta che mettiamo il file preceduto
# dal percorso. Nel caso del mio attuale PC basta che batta:
# read.csv("C:/Users/dadaumpa/Documents/macosa/om/prg/R/voti2.csv",sep=",",skip=1)
# oppure cambiare la directory di lavoro con Change Dir dal menu File, o con:
# setwd("C:/Users/dadaumpa/Documents/macosa/om/prg/R")
# e poi usare semplicemente:     read.csv("voti2.csv",sep=",",skip=1)
#
# Quindi metto i dati in una variabile
voti <- read.csv("voti2.csv",sep=",",skip=1)
# o
voti <- read.csv("http://macosa.dima.unige.it/om/prg/R/voti2.csv",sep=",",skip=1)
# o ...
# Metto in sost come sostituire le "lettere" a dei "punteggi", ad es.:
sost <- function(x) ifelse(x=="X",2,ifelse(x=="N",4,ifelse(x=="B",6,ifelse(x=="I",8,10))))
# Definisco una tabella in cui mettere le 11 righe e le sei colonne
t <- array(dim=c(11,6))
# metto nella tabella i voti nella forma numerica
for (i in 1:11) for (j in 1:6) t[i,j] <- sost(voti[i,j])
# stampo la tabella, che poi posso elaborare statiticamente
t
summary(t)
boxplot(t)
# Altri esempi di utilizzo di R e di interfaccia con altro software
# statistico si trovano in  http://www.bayes.it/html/statistica_con_r.html
#
# Ricordiamo quanto osservato nell'incontro 2 sulla virgola come separatore
# tra parte intera e parte decimale, e vediamo come ovviare. Con:
dati <- read.table("http://macosa.dima.unige.it/om/prg/R/agg/tabella2.csv", sep=";")
dati
# il programma non capisce che si tratta di dati con parte decimale.
# Possiamo usare read.csv2 per fargli tradurre le "," in ".":
dati <- read.csv2("http://macosa.dima.unige.it/om/prg/R/agg/tabella2.csv", sep=";")
dati
#
#
# Torniamo alla geometria.
# Vediamo, prima, un ulteriore esempio, per vedere una figura piana generabile
# con altre tecniche matematiche:
sin <- -1.1; des <- 1.1
plot(c(sin,des), c(sin,des), type="n", xlab="", ylab="", asp=1)
abline(h=seq(sin,des,0.1), v=seq(sin,des,0.1), col="grey")
# in s metto un intero scelto "del tutto a caso" in {-1, 1}
# in x metto un numero "reale" che cade a caso tra -1 ed 1
traccia <- function(n) for(i in 1:n) {s <- sign(runif(1)-.5); x <- runif(1)*2-1;
                                      lines(c(x,0),c(0,s*(sign(x)-x)),col=i) }
traccia(10);abline(h=0,v=0,lty=2)
#
traccia(10);abline(h=0,v=0,lty=2)
#
traccia(50);abline(h=0,v=0,lty=2)
#
traccia(1000);abline(h=0,v=0,lty=2)
# Vengono tracciati generici segmenti con estremi posti uno sull'asse x e l'altro
# sull'asse y in modo tale che la somma delle loro distanze dall'origine sia 1;
# ad es. se un estremo č (0,0.8) l'altro č (0.2,0) o (-0.2,0); il programma
# evidenzia la figura che questa famiglia di segmenti "descrive" (si tratta
# dell'inviluppo, ossia della curva che in ogni suo punto ha come tangente
# esattamente uno dei segmenti della famiglia); assomiglia ad un asteroide.
#
# Dopo questo break, e i due esempi visti alla fine dell'incontro precedente,
# affrontiamo, rapidamente, una panoramica di cose fattibili.
#
# Figure varie
# Tracciamo un sistema di riferimento monometrico, con i soliti comandi:
plot(c(-10,10),c(-10,10),type="n",xlab="", ylab="", asp=1)
abline(h=seq(-10,10,1),v=seq(-10,10,1),lty=3,col="orange")
abline(h=0,v=0,col="brown")
# Tracciamo un po' di figure. Un cerchio (vedi):
symbols(-5, 2, circles=2, inches=FALSE, add=TRUE, fg="blue")
# L'asse di un segmento (costruendo una procedura generale):
# [la media di x e y viene in genere calcolata come x+(y-x)/2: con (x+y)/2
#  si potrebbe ottenere un valore esterno a (x,y) - ma è un dettaglio]
asse <- function(A,B) { points(A[1],A[2]); points(B[1],B[2]);
  lines(c(A[1],B[1]),c(A[2],B[2])); M <- A+(B-A)/2
  points(M[1],M[2],col="blue");
  if (A[2]==B[2]) abline(v=A[1]+(B[1]-A[1])/2) else
   abline(M[2]+(A[1]-B[1])/(A[2]-B[2])*M[1],-(A[1]-B[1])/(A[2]-B[2])) }
asse(c(-9,7), c(6,-8)); asse(c(3,-4), c(7,-4))
# dei punti e la poligonale li ha come vertici
points(c(-9,-2,3,8),c(-2,3,-8,-6),col="brown")
lines(c(-9,-2,3,8),c(-2,3,-8,-6),col="brown")
# il poligono che li ha come vertici
polygon(c(-9,-2,3,8),c(-2,3,-8,-6), border="red")
# colorato al suo interno
polygon(c(-9,-2,3,8),c(-2,3,-8,-6), col="yellow")
#
# Vediamo come costruire un programmino che può essere memorizzato (e
# usato a scatola nera) per tracciare un generico poligono regolare:
pol <- function(C,R,AngIniz,N,co) {
  gr <- function(x) x/180*pi;
  ang <- function(i) gr((360/N)*i+AngIniz);
  polygon( cos(ang(0:N))*R+C[1], sin(ang(0:N))*R+C[2],border=co) }
# Chiamiamolo diverse volte:
pol(c(6,5),4.5,70,3,"red"); pol(c(6,5),4.5,70+60,3, "blue")
pol(c(6,5),4.5,70,6,"green")
#
# Curve che non sono grafici di funzioni
# La relazione inversa:
plot(c(-10,10),c(-10,10),type="n",xlab="", ylab="", asp=1)
abline(h=seq(-10,10,1),v=seq(-10,10,1),lty=3,col="orange")
abline(h=0,v=0,col="brown")
f <-function(x) x^3/7-x^2-x+5
plot(f,-10,10,add=TRUE,col="blue")
# traccio 1000 segmentini che approssimano la rel. inversa
t <- seq(-10,10,20/1000); lines(f(t),t,col="brown")
# Una sua trasformazione geometrica
lines(f(t)-5,t*3/2,col="red")
#
# un pesciolino (e sue trasformazioni affini)
x1 <- -30; x2 <- 30; y1 <- -30; y2 <- 30
plot(c(x1,x2),c(y1,y2),type="n",xlab="", ylab="", asp=1)
abline(h=seq(y1,y2,5),v=seq(x1,x2,5),lty=3,col="orange")
abline(h=0,v=0,col="brown")
x <- c(13,11,10, 9, 7,7.5, 7, 9,10,11,13,17,20,20.5,18.5,21,20,17,13)
y <- c(17,16,15,13,10, 13,16,13,11,10, 9, 9,11,  12,  13,13,15,17,17)
lines(x,y,col="blue")
# ... e di una sua trasformazione geometrica, quella che a
# (x,y) associa (-x-y+8, -y):
lines(-x-y+8,-y,col="red")
# e quella che a (x,y) associa (-x-y+8, y*3/2):
lines(-x-y+8,y*3/2,col="brown")
# Un semplicissimo movimento:
source("http://macosa.dima.unige.it/om/prg/r/tic.txt")
x1 <- -30; x2 <- 30; y1 <- -30; y2 <- 30
plot(c(x1,x2),c(y1,y2),type="n",xlab="", ylab="", asp=1)
abline(h=seq(y1,y2,5),v=seq(x1,x2,5),lty=3,col="orange")
abline(h=0,v=0,col="brown")
lines(x,y,col="blue")
for (i in 1:30) { # cancello il pesce e lo ritraccio spostato
  lines(x+(i-1)*20/100,y-(i-1)*30/100,col="white");
  abline(h=seq(y1,y2,5),v=seq(x1,x2,5),lty=3,col="orange");
  abline(h=0,v=0,col="brown");
  lines(x+i*20/100,y-i*30/100,col="blue"); tic(0.5)}
#
# Un altro movimento, guidato col MOUSE; riporto il pesce con la "coda" nella
# origine e poi, quando il programma si ferma, faccio un clic su un punto del
# riquadro grafico  (in tutto dovrò fare 3 clic):
x1 <- -30; x2 <- 30; y1 <- -30; y2 <- 30
plot(c(x1,x2),c(y1,y2),type="n",xlab="", ylab="", asp=1)
abline(h=seq(y1,y2,5),v=seq(x1,x2,5),lty=3,col="orange")
abline(h=0,v=0,col="brown")
x <- c(13,11,10, 9, 7,7.5, 7, 9,10,11,13,17,20,20.5,18.5,21,20,17,13)
y <- c(17,16,15,13,10, 13,16,13,11,10, 9, 9,11,  12,  13,13,15,17,17)
x <- x-7; y <- y-10; lines(x,y)
p <- locator(1); p$x; p$y; lines(x + p$x, y + p$y, col="red")
p <- locator(1); p$x; p$y; lines(x + p$x, y + p$y, col="blue")
p <- locator(1); p$x; p$y; lines(x + p$x, y + p$y, col="green")
#
# Qualche esempio di GEOMETRIA 3D, quasi a scatola nera:
u <- c(0,0,0,0); z <- array(u,dim=c(2,2)); x <- c(-1,1); y <- c(-1,1)
thphdi <- function(t,p,di) {
 F <- persp(x,y,z,theta=t,phi=p,scale=FALSE,zlim=c(0,2),xlim=c(-2,2),ylim=c(-2,2),d=di)
  lines(trans3d(c(-1,-1),c(-1,-1),c(0,1),pmat=F))
  lines(trans3d(c(1,1),c(-1,-1),c(0,1),pmat=F))
  lines(trans3d(c(1,1),c(1,1),c(0,1),pmat=F))
  lines(trans3d(c(-1,-1),c(1,1),c(0,1),pmat=F))
  lines(trans3d(c(-1,-1),c(-1,1),c(1,1),pmat=F))
  lines(trans3d(c(1,1),c(-1,1),c(1,1),pmat=F))
  lines(trans3d(c(1,0),c(1,1),c(1,1.5),pmat=F))
  lines(trans3d(c(-1,0),c(1,1),c(1,1.5),pmat=F))
  lines(trans3d(c(-1,0),c(-1,-1),c(1,1.5),pmat=F))
  lines(trans3d(c(1,0),c(-1,-1),c(1,1.5),pmat=F))
  lines(trans3d(c(0,0),c(1,-1),c(1.5,1.5),pmat=F))
  lines(trans3d(c(0,0),c(1,-1),c(1.5,1.5),pmat=F))
  lines(trans3d(c(-0.5,-0.5),c(-1,-1),c(0,0.5),pmat=F))
  lines(trans3d(c(0.5,0.5),c(-1,-1),c(0,0.5),pmat=F))
  lines(trans3d(c(-0.5,0.5),c(-1,-1),c(0.5,0.5),pmat=F))
  lines(trans3d(c(1,1),c(-1,100000),c(0,0),pmat=F),col="red",lty=3)
  lines(trans3d(c(1,1),c(-1,100000),c(1,1),pmat=F),col="red",lty=3)
  lines(trans3d(c(-1,-1),c(-1,100000),c(1,1),pmat=F),col="red",lty=3)
  lines(trans3d(c(-1,-1),c(-1,100000),c(0,0),pmat=F),col="red",lty=3)
  lines(trans3d(c(0,0),c(-1,100000),c(1.5,1.5),pmat=F),col="red",lty=3)
 }
thphdi(-30,25,1/2)
# cambiamo punto di vista, alla stessa distanza
thphdi(-20,25,1/2)
# cambiamo punto di vista, alla stessa distanza
thphdi(-10,25,1/2)
# cambiamo punto di vista, alla stessa distanza
thphdi(0,25,1/2)
# cambiamo punto di vista, alla stessa distanza
thphdi(10,25,1/2)
# cambiamo punto di vista, alla stessa distanza
thphdi(10,5,1/2)
# cambiamo punto di vista, alla stessa distanza
thphdi(10,-30,1/2)
# cambiamo punto di vista, alla stessa distanza
thphdi(10,30,1/4)
# cambiamo distanza
thphdi(10,30,1)
# cambiamo distanza
thphdi(10,30,5)
# cambiamo distanza
thphdi(10,30,100)
#
# un altro esempio:  il grafico di una FUNZIONE di VARIABILI
x <- y <- seq(-10, 10, len = 30)
f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp(x,y,z, theta=30, phi=30, expand=0.5, col="lightblue")
# per avere le "tacche"
persp(x,y,z, theta=30, phi=30, expand=0.5, col="lightblue", ticktype="detailed")
# Le curve di livello
windows()
contour(x,y,z)
# vediamo, una per una, le seguenti opzioni:
contour(x,y,z,col=heat.colors(12))
contour(x,y,z,col=heat.colors(12),nlevels=1)
contour(x,y,z,col=heat.colors(12),nlevels=2)
contour(x,y,z,col=heat.colors(12),nlevels=5)
#
# Un altro esempio:
x <- y <- seq(-pi,pi,by=0.1)
f <- function(x,y) sin(x)+cos(2*y)
z <- outer(x, y, f)
persp(x,y,z, theta=45, phi=25, expand=0.5, col="lightblue", ticktype="detailed")
windows()
contour(x,y,z,col=heat.colors(12))
#
# Come derivare una funzione di 2 variabili:
fxy <- expression(x^2*y+y^3+x+y-7)
f <- function(x,y) eval(fxy)
f(1,1); f(2,1); f(0,0); f(-1,-1)
D(fxy,"x"); D(fxy,"y")
g <- function(x,y) eval(D(fxy,"x"))
g(0,0); g(1,1); g(-1,5)
# Poi posso proseguire con altre derivate (rispetto a x o a y) ...
#
# Torniamo indietro (<- clicca).
#