R
)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
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)
a[2]
## [1] 5
a[c(1,3)]
## [1] 10 3
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
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).
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
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
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
diag(c(1,5,9))
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 5 0
## [3,] 0 0 9
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
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("%*%")
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
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
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
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
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
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
vec
contenant les éléments de la
diagonale de mat
.vec <- diag(mat)
vec
## [1] 1 5 3 2
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
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
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
Soient \[ A= \begin{pmatrix} 1 & 0 & 0\\ 0 & 1 & 2\\ 0 & 3 & 1\\ \end{pmatrix}, \quad b= \begin{pmatrix} 1\\ 2\\ 1 \end{pmatrix} . \]
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)
det(A)
## [1] -5
solve
).x <- solve(A, b)
x
## [1] 1 0 1
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
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
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
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
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)
\[ f(x) = \sin(x)^2+\sqrt{|x-3|}. \]
f <- function(x) {
sin(x) ^ 2 + sqrt(abs(x-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)
\[ 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"))