Exercice 1 (Introduction à R)

1. Commentez les sorties de R suite aux intructions suivantes.

  • log(-1)
  • 1/0
  • 0/0
  • log(2, base=23)
  • round(exp(1),digit=3)
  • asin(3/11)
log(-1)
## Warning in log(-1): NaNs produced
## [1] NaN
1/0
## [1] Inf
0/0
## [1] NaN
log(2, base=23)
## [1] 0.2210647
log(2)/log(23)
## [1] 0.2210647
round(exp(1),digit=3)
## [1] 2.718
asin(3/11)
## [1] 0.2762266

2. Affectation

(a) En utilisant la fonction c, affecter les valeurs \((10, 5, 3, 6, 21)\) au vecteur (au sens de R) \(a\). Afficher \(a\).

a <- c(10, 5, 3, 6, 21)
a
## [1] 10  5  3  6 21
?c
help(cbind)

(b) Extraire successivement le deuxième et le troisième élément de \(a\).

a[2]
## [1] 5
a[c(1,3)]
## [1] 10  3

(c) En utilisant la fonction matrix, affecter les valeurs \((15, 3, 12, 2, 1)\) au vecteur (au sens mathématique) \(b\). Retourner \(b\).

b <- matrix(c(15, 3, 12, 2, 1))
b
##      [,1]
## [1,]   15
## [2,]    3
## [3,]   12
## [4,]    2
## [5,]    1

(d) Pour voir la différence entre un vecteur et une matrice. Demander nrow(a), ncol(a), dim(a) et de même pour \(b\).

nrow(a); ncol(a); dim(a)
## NULL
## NULL
## NULL
nrow(b); ncol(b); dim(b)
## [1] 5
## [1] 1
## [1] 5 1

Dans toute la suite, on considère des vecteurs au sens de R (i.e., sans dimension).

(e) Utiliser la fonction seq pour définir un vecteur \(d\) composé des 5 premiers entiers impairs.

d <- seq(from=1, to=9, by=2)
d
## [1] 1 3 5 7 9

(f) Créer un vecteur \(e\) composé des 5 premiers entiers.

e <- seq(from=1, to=5, by=1)
e
## [1] 1 2 3 4 5
# ou encore
e <- 1:5
e
## [1] 1 2 3 4 5

(g) A l’aide de la fonction rep, générer les vecteurs: (1, 2, 3, 1, 2, 3) et (1, 1, 2, 2, 3, 3).

?rep
rep(1:3, times=2)
## [1] 1 2 3 1 2 3
rep(1:3, each=2)
## [1] 1 1 2 2 3 3
# ou encore
rep(1:3, rep(2,3))
## [1] 1 1 2 2 3 3

(h) Créer la matrice diagonale de dimension 3 dont les éléments de la diagonale sont 1, 5 et 9.

diag(c(1,5,9))
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    5    0
## [3,]    0    0    9

3. Manipulation de base

(a) Taper 2*a + b + 1, e[3], cos(a), exp(a). Qu’obtient-on ?

a
## [1] 10  5  3  6 21
b
##      [,1]
## [1,]   15
## [2,]    3
## [3,]   12
## [4,]    2
## [5,]    1
2*a
## [1] 20 10  6 12 42
2*a+b+1
##      [,1]
## [1,]   36
## [2,]   14
## [3,]   19
## [4,]   15
## [5,]   44
cos(a); exp(a)
## [1] -0.8390715  0.2836622 -0.9899925  0.9601703 -0.5477293
## [1] 2.202647e+04 1.484132e+02 2.008554e+01 4.034288e+02 1.318816e+09

(b) Taper a*e puis a%*%e. Comparer.

a
## [1] 10  5  3  6 21
e
## [1] 1 2 3 4 5
a*e
## [1]  10  10   9  24 105
a%*%e # si vecteurs produit scalaire, sinon produit mat
##      [,1]
## [1,]  158
help("%*%")

(c) Taper b%*%e. Que se passe-t-il? Taper f <- t(b)%*%e, comparer.

b
##      [,1]
## [1,]   15
## [2,]    3
## [3,]   12
## [4,]    2
## [5,]    1
e
## [1] 1 2 3 4 5
b%*%e
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   15   30   45   60   75
## [2,]    3    6    9   12   15
## [3,]   12   24   36   48   60
## [4,]    2    4    6    8   10
## [5,]    1    2    3    4    5
b%*%t(as.matrix(e))
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   15   30   45   60   75
## [2,]    3    6    9   12   15
## [3,]   12   24   36   48   60
## [4,]    2    4    6    8   10
## [5,]    1    2    3    4    5
f <- t(b)%*%e
f
##      [,1]
## [1,]   70

(d) Taper cbind(b, e) puis rbind(b, e).

cbind(b, e)
##         e
## [1,] 15 1
## [2,]  3 2
## [3,] 12 3
## [4,]  2 4
## [5,]  1 5
rbind(b, e)
## Warning in rbind(b, e): number of columns of result is not a multiple of vector
## length (arg 2)
##   [,1]
##     15
##      3
##     12
##      2
##      1
## e    1
nrow(b);ncol(b)
## [1] 5
## [1] 1
nrow(e);ncol(e)
## NULL
## NULL

(e) Taper c(a,b).

a
## [1] 10  5  3  6 21
b
##      [,1]
## [1,]   15
## [2,]    3
## [3,]   12
## [4,]    2
## [5,]    1
c(a,b)
##  [1] 10  5  3  6 21 15  3 12  2  1

#- groupe matin

(f) Taper sum(a), range(a), length(a) et summary(a)

sum(a) 
## [1] 45
range(a)
## [1]  3 21
length(a)
## [1] 5
summary(a)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       3       5       6       9      10      21

(g) Saisir le vecteur \(u\) en tapant u <- c(TRUE, FALSE, TRUE, TRUE). Evaluer les instructions suivantes: !u, u | !u, any(u) et all(u).

u <- c(TRUE, FALSE, TRUE, TRUE)
!u
## [1] FALSE  TRUE FALSE FALSE
u|!u
## [1] TRUE TRUE TRUE TRUE
any(u)
## [1] TRUE
all(u)
## [1] FALSE

Exercice 2 (Manipulation de matrices)

1. Créer la matrice mat en executant les instructions suivantes.

values <- c(1, 0, 3, 4, 5, 5, 0, 4, 5, 6, 3, 4, 0, 1, 3, 2)
length(values)
## [1] 16
mat <- matrix( 
              nrow = 4, 
              ncol = 4,
              data = values)
mat
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    5    0
## [2,]    0    5    6    1
## [3,]    3    0    3    3
## [4,]    4    4    4    2

2. Créer le vecteur vec contenant les éléments de la diagonale de mat.

vec <- diag(mat)
vec
## [1] 1 5 3 2

3. Créer la matrice submat contenant les deux premières lignes de mat, et la matrice submat2 contenant les deux dernières colonnes de mat.

submat <- mat[1:2, ]
submat2 <- mat[ ,(ncol(mat)-1):ncol(mat)]
submat
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    5    0
## [2,]    0    5    6    1
submat2
##      [,1] [,2]
## [1,]    5    0
## [2,]    6    1
## [3,]    3    3
## [4,]    4    2

4. Créeer la matrice smallmat composée des colonnes de mat dont tous les éléments sont inférieurs à 5 (utiliser apply et all), et la matrice notzero composée des lignes de mat dont tous les éléments sont non nuls.

smallmat <- mat[ , apply(mat<5, 2, all)]
mat!=0
##       [,1]  [,2] [,3]  [,4]
## [1,]  TRUE  TRUE TRUE FALSE
## [2,] FALSE  TRUE TRUE  TRUE
## [3,]  TRUE FALSE TRUE  TRUE
## [4,]  TRUE  TRUE TRUE  TRUE
apply(mat!=0, 1, all)
## [1] FALSE FALSE FALSE  TRUE
mat[apply(mat!=0, 1, all), ]
## [1] 4 4 4 2
matrix(mat[apply(mat!=0, 1, all),],ncol=4)
##      [,1] [,2] [,3] [,4]
## [1,]    4    4    4    2
mat[apply(mat!=0, 1, all),, drop=F]
##      [,1] [,2] [,3] [,4]
## [1,]    4    4    4    2

5. Générer la matrice mat2 par la commande suivante mat2 <- matrix(1:16, nrow=4), puis saisir et comparer les deux commandes suivantes: mat * mat2 et mat % * % mat2.

mat2 <- matrix(1:16, nrow=4)
mat; mat2
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    5    0
## [2,]    0    5    6    1
## [3,]    3    0    3    3
## [4,]    4    4    4    2
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
mat * mat2 #produit terme à terme
##      [,1] [,2] [,3] [,4]
## [1,]    1   25   45    0
## [2,]    0   30   60   14
## [3,]    9    0   33   45
## [4,]   16   32   48   32
mat %*% mat2 # produit matriciel
##      [,1] [,2] [,3] [,4]
## [1,]   26   70  114  158
## [2,]   32   80  128  176
## [3,]   24   60   96  132
## [4,]   32   88  144  200

Exercice 3 (Résolution d’un système linéaire)

Soient \[ A= \begin{pmatrix} 1 & 0 & 0\\ 0 & 1 & 2\\ 0 & 3 & 1\\ \end{pmatrix}, \quad b= \begin{pmatrix} 1\\ 2\\ 1 \end{pmatrix} . \]

1. Saisir la matrice \(A\) et le veteur \(b\).

compo <- c(1, 0, 0, 0, 1, 3, 0, 2, 1)
A <- matrix(
            nrow = 3, ncol = 3,
            data = compo)
A
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    2
## [3,]    0    3    1
b <- c(1, 2, 1)

2. La matrice A est-elle inversible ? Calculer son déterminant.

det(A)
## [1] -5

3. Résoudre le système linéaire \(Ax=b\) (en utilisant la fonction solve).

x <- solve(A, b)
x
## [1] 1 0 1

Exercice 4 (Boucle for)

1. Créer une boucle for qui permet de calculer la factorielle d’un nombre.

n <- 6
out <- 1
for (i in 1:n) {
  out <- out * i
}
out
## [1] 720
a <- 30
fact <- function(n = 1) {
  out <- 1
  for (i in 1:n) {
    out <- out * i * a
  }
  out
  return(list("factorial"=out, 
              "blabla"=3))
}
fact(6)
## $factorial
## [1] 5.2488e+11
## 
## $blabla
## [1] 3

2. Réutiliser le code de la question précédente pour en faire une fonction qui prend comme argument un entier positif, et qui retourne sa factorielle. Avant d’effectuer le calcul, la fonction vérifie le type de l’argument. Si celui-ci n’est pas conforme, alors la fonction retourne un message d’erreur.

myfactorial <- function(n){
    if (!n%%1==0 | (sign(n) == -1)) {
      # attention is.integer ne teste pas si un nombre est entier, voir l'aide associee
      warning("The input argument must be a positive integer")
      }
  out <- 1
  for (i in 1:n) {
    out <- out * i
  }
  return(out) # ou rien par defaut la dernière instruction declaree est renvoyee
}
myfactorial(6)
## [1] 720

On pourrait également utiliser la fonction \(\Gamma\) (comme dans la fonction factorial de R).

?factorial

Exercice 5 (Divisibilité)

Ecrire une fonction R qui prend deux arguments \(K\) et \(Q\). Cette fonction vérifie si \(K\) et \(Q\) sont des entiers positifs. Ensuite, elle considère le vecteur des entiers de 1 à \(K\), et détermine combien d’éléments de ce vecteur sont exactement divisible par \(Q\).

myFun <- function(K, Q){
  if (!K%%1==0 | (sign(K) == -1)){stop("K must be a positive integer")}
  if (!Q%%1==0 | (sign(Q) == -1)){stop("Q must be a positive integer")}
  allelements <- 1:K
  remainders <- 1:K %% Q
  sum(remainders == 0)
}
myFun(2048,2)
## [1] 1024

Exercice 6 (Fibonacci)

Utiliser une boucle for pour reproduire la suite de Fibonacci jusqu’à son dixième terme (la séquence \(F_n\) est définie par la relation de récurrence suivante : \(F_n = F_{n-1}+F_{n-2}\) ; les valeurs initiales sont \(F_0=0\) et \(F_1=1\)).

fibona <- function(n){
  fibo <- rep(NA, n)
  fibo[1] <- 0
  fibo[2] <- 1
  for (i in 3:length(fibo)){
    fibo[i] <- fibo[i-1] + fibo[i-2]
  } 
  return(fibo)
}
fibona(10)
##  [1]  0  1  1  2  3  5  8 13 21 34

Exercice 7 (Racine d’un polynôme et graphiques)

On souhaite trouver les solutions de l’équation \[ 2x^2-8x+6=0. \] ## 1. En rappelant la formule du discriminant, calculer les racines avec R. Puis tracer sur un graphique à l’aide de la fonction curve la courbe représentative du polynôme du second degré sur l’intervalle \([0,5]\). Tracer la droite horizontale d’équation \(y=0\), les droites verticales passant par les racines en les faisant figurer sur le graphe (e.g., avec la fonction points).

a <- 2
b <- -8
c <- 6
delta <- b^2-4*a*c
x1 <- (-b+sqrt(delta))/(2*a)
x2 <- (-b-sqrt(delta))/(2*a)
## 2.
poly <- function(x) 2*x^2-8*x+6
curve(2*x^2-8*x+6, 0, 5)

x <- seq(0,5,length.out=100)
plot(x,poly(x))
abline(h=0,col="red")
#abline(0:5,0,col="red")
abline(v=x1,col="blue")
abline(v=x2,col="blue")
points(x1, 0, pch = 8)
points(x2, 0, pch = 8)

Exercice 8 (Graphiques suite)

1. Construire une fonction qui calcule la valeur de la fonction f définie par

\[ f(x) = \sin(x)^2+\sqrt{|x-3|}. \]

f <- function(x) {
  sin(x) ^ 2 + sqrt(abs(x-3))
}

2. Tracer la courbe représentative de la fonction \(f\) sur le domaine \([-6,3]\).

values <- seq(-6, 3, by = 0.05)
plot(values, 
     f(values), 
     type="l", 
     xlab="x",
     ylab="f(x)",
     ylim=range(f(values)))

Ou encore, en utilisant la fonction curve (pas besoin de discrétiser le domaine de définition de la fonction)

curve(f, from = -6, to=3)

Une autre possiblité est d’utiliser le package ggplot2, très populaire dans la communauté des utilisateur de R.

library(ggplot2)
p <- ggplot(data = data.frame(x = 0), 
            mapping = aes(x = x))
p + stat_function(fun = f) + xlim(-6,3)

3. Ajouter sur le graphique précédent la courbe correspondant à la fonction \(g\) définie par

\[ g(x)= \begin{cases} \sin(x)\ln(x) & x>0\\ 3+\sin^2(x) &x\leq 0. \end{cases} \] On commence par définir \(g\) (sans boucle):

g <- function(x){
  out <- rep(0, length(x))
  xpositive <- x[x>0]
  xnegative <- x[x<=0]
  out[which(x>0)] <- (sin(xpositive)) * log(xpositive)
  out[which(x<=0)] <- (sin(xnegative)**2) * xnegative + 3
  return(out)
} 
gg <- function(x) {
  ifelse(x > 0,
         sin(x) * log(x),  
         3 + sin(x)^2)    
}

Avec plot() et lines()

plot(values, 
     f(values), 
     type="l", 
     xlab="x",
     ylab="y",
     ylim=range(c(g(values), f(values))))
lines(values, g(values), col="red")
legend("bottomleft", legend=c("f(x)", "g(x)"), col=1:2, lty=1)

Autre possiblité avec plot() et par(new=TRUE)

plot(values, 
     f(values), 
     type="l",
     xaxt="n", yaxt="n",
     xlab="",
     ylab="")
par(new=TRUE)
plot(values, 
     g(values), 
     col="red",
     type="l",
     xlab="x",
     ylab="y",
     ylim=range(c(g(values), f(values))))
legend(2,3.5, legend=c("f(x)", "g(x)"), col=1:2, lty=1)

Ou encore avec curve

curve(f, from = -6, to = 3, ylab = "y",
      ylim = range(c(g(values), f(values))))
curve(g, add=T,col="red")

Et enfin avec ggplot2

ggplot(data.frame(x = c(-6, 3)), aes(x = x)) +
  stat_function(fun = f, aes(colour = "f")) + 
  stat_function(fun = g, aes(colour = "g")) + 
  scale_colour_manual("Legende", values = c("deeppink", "dodgerblue3"))