Para todos os exercícios a seguir não se esqueça de:
Implemente uma função que recebe como entrada um vetor (array de números) v e um escalar a e retorna o vetor (array de números) definido pelo produto av.
vetor_escalar = function(v,a){
if( class(v) != "numeric" | class(a) != "numeric")
stop("Não são números reais")
n = length(v)
w = NULL
i = 1
repeat{
w[i] = a*v[i]
i = i + 1
if(i>n)
break
}
return(w)
}
v = c(1,2,3,4,5,6,7,8,9,10)
vetor_escalar(v,9)## [1] 9 18 27 36 45 54 63 72 81 90
Implemente uma função que recebe como entrada dois vetores (arrays de números) v e u e retorna outro vetor (array de números) definido pela soma entre eles.
vetor_soma = function(v,u){
if( class(v) != "numeric" | class(u) != "numeric")
stop("Não são vetores de números reais")
n = length(v); k = length(u)
if( n != k )
stop("Os vetores tem tamanhos distintos")
w = NULL
i = 1
repeat{
w[i] = v[i] + u[i]
i = i + 1
if(i>n)
break
}
return(w)
}
v = c(6,7,8,9,10)
u = c(-2,9,1,6,4)
vetor_soma(v,u)## [1] 4 16 9 15 14
No caderno escreva um pseudo-código para o algoritmo que recebe como entrada dois vetores (arrays de números) v e u e retorna outro vetor (array de números) definido pela subtração do primeiro pelo segundo. Em seguida, no computador, implemente o pseudo-código elaborado.
Pseudo Código
# Entrada: v e u = arrays de coordenadas de vetor
# Saída: array com os elementos do vetor definido pela subtração de v com u.
# 1. Defina n como o tamanho do vetor v;
# 2. Defina k como o tamanho do vetor u;
# 3. Se n e k forem diferentes, retorne uma mensagem de erro e FIM.
# 4. Inicie o vetor w como nulo;
# 5. Inicie i = 1;
# 6. Faça w[i] = v[i] - u[i];
# 7. Incremente i: i = i + 1;
# 8. Se i < = n, volte para a linha 6;
# 9. Retorne w.vetor_subtr = function(v,u){
if( class(v) != "numeric" | class(u) != "numeric")
stop("Não são vetores de números reais")
n = length(v); k = length(u)
if( n != k )
stop("Os vetores tem tamanhos distintos")
w = NULL
i = 1
repeat{
w[i] = v[i] - u[i]
i = i + 1
if(i>n)
break
}
return(w)
}
v = c(6,7,8,9,10)
u = c(-2,9,1,6,4)
vetor_subtr(v,u)## [1] 8 -2 7 3 6
Implemente uma função que recebe como entrada dois vetores (arrays de números) v e u e retorna o produto interno entre eles.
produto_interno = function(v,u){
if( class(v) != "numeric" | class(u) != "numeric")
stop("Não são vetores de números reais")
n = length(v); k = length(u)
if( n != k )
stop("Os vetores tem tamanhos distintos")
p = 0; i = 1
repeat{
p = p + (v[i] * u[i])
i = i + 1
if(i>n)
break
}
return(p)
}
v = c(6,2,4,1,3)
u = c(2,1,1,6,4)
produto_interno(v,u)## [1] 36
Implemente uma função que recebe como entrada dois vetores (arrays de números) e retorna TRUE caso eles forem ortogonais e FALSE caso contrário. Dica: dá para saber se dois vetores são ortogonais a partir do produto interno entre eles.
ortogonal_teste = function(v,u){
p = produto_interno(v,u)
if(p == 0){
teste = TRUE
}else{ teste = FALSE}
return(teste)
}
v = c(6,2,4,1,3); u = c(2,1,1,6,4)
x = c(-1,2); y = c(2,1)
ortogonal_teste(v,u)## [1] FALSE
## [1] TRUE
Implemente uma função que recebe como entrada uma matriz A e um escalar r e retorna a matriz definida pelo produto de r com A.
matriz_escalar = function(A,r){
if( class(A)[1] != "matrix" | class(r) != "numeric")
stop("Não são vetores de números reais")
n = nrow(A); m = ncol(A)
M = matrix(0, nrow = n,ncol = m)
for (i in 1:n){
for (j in 1:m){
M[i,j] = r*A[i,j]
}
}
return(M)
}
A = matrix( c(2,8,7,4,1,5,9,3,1), ncol = 3 )
matriz_escalar(A,3)## [,1] [,2] [,3]
## [1,] 6 12 27
## [2,] 24 3 9
## [3,] 21 15 3
Implemente uma função que recebe como entrada duas matrizes A e B e retorna outra matriz definida pela soma entre elas.
matriz_soma = function(A,B){
if( class(A)[1] != "matrix" | class(B)[1] != "matrix")
stop("Não são vetores de números reais")
n = nrow(A); m = ncol(A)
l = nrow(B); c = ncol(B)
if( n != l | m != c)
stop("Não são vetores de números reais")
M = matrix(0, nrow = n, ncol = l)
for (i in 1:n){
for (j in 1:m){
M[i,j] = A[i,j] + B[i,j]
}
}
return(M)
}
A = matrix( c(2,8,7,4,1,5,9,3,1), ncol = 3 )
B = matrix( c(3,1,5,2,3,4,1,1,1), ncol = 3 )
matriz_soma(A,B)## [,1] [,2] [,3]
## [1,] 5 6 10
## [2,] 9 4 4
## [3,] 12 9 2
No caderno escreva um pseudo-código para o algoritmo que recebe como entrada duas matrizes A e B e retorna outra matriz definida pela subtração da primeira pela segunda. Agora no computador implemente o pseudo-código elaborado.
Pseudo Código
# Entrada: A = matriz de números reais; B = matriz de números reais.
# Saída: uma matriz definida pelo subtração de A com B.
# 1. Defina n número de linhas da matriz A;
# 2. Defina m número de colunas da matriz A;
# 3. Defina l número de linhas da matriz B;
# 4. Defina c número de colunas da matriz B;
# 5. Se n é diferente de l, retorne uma mensagem de erro e FIM.
# 6. Se m é diferente de c, retorne uma mensagem de erro e FIM.
# 7. Inicie uma matriz M de dimensão n x m.
# 8. Inicie i = 1;
# 9. Inicie j = 1;
# 10. Faça M[i,j] = A[i,j] - B[i,j];
# 11. Incremente j: j = j + 1;
# 12. Se j < = m volte para a linha 10;
# 13. Incremente i: i = i + 1;
# 14. Se i < = n volte para a linha 9;
# 15. Retorne M.matriz_subtr = function(A,B){
if( class(A)[1] != "matrix" | class(B)[1] != "matrix")
stop("Não são vetores de números reais")
n = nrow(A); m = ncol(A)
l = nrow(B); c = ncol(B)
if( n != l | m != c)
stop("Não são vetores de números reais")
M = matrix(0, nrow = n, ncol = l)
for (i in 1:n){
for (j in 1:m){
M[i,j] = A[i,j] - B[i,j]
}
}
return(M)
}
A = matrix( c(2,8,7,4,1,5,9,3,1), ncol = 3 )
B = matrix( c(3,1,5,2,3,4,1,1,1), ncol = 3 )
matriz_subtr(A,B)## [,1] [,2] [,3]
## [1,] -1 2 8
## [2,] 7 -2 2
## [3,] 2 1 0
Implemente uma função que recebe como entrada uma matriz A e retorna a sua transposta.
matriz_transposta = function(A){
if( class(A)[1] != "matrix" )
stop("Não é uma matriz")
n = nrow(A); m = ncol(A)
M = matrix(0, nrow = m,ncol = n)
for (i in 1:n){
for (j in 1:m){
M[j,i] = A[i,j]
}
}
return(M)
}
A = matrix( c(2,8,7,4,1,5,9,3,1), ncol = 3 )
matriz_transposta(A)## [,1] [,2] [,3]
## [1,] 2 8 7
## [2,] 4 1 5
## [3,] 9 3 1
No caderno escreva um pseudo-código para o algoritmo que recebe como entrada uma matriz A e retorna TRUE se essa matriz for simétrica e FALSE caso contrário. Lembre-se: uma matriz simétrica é uma matriz quadrada tal que \(A_{i,j} = A_{j,i}\). Em seguida implemente o pseudo-código elaborado.
Pseudo Código
# Entrada: A = matriz de números reais.
# Saída: TRUE se a matriz for simetrica e FALSE se não.
#
# 1. Defina n número de linhas da matriz A;
# 2. Defina m número de colunas da matriz A;
# 3. Defina teste = 0;
# 4. Defina A_1 como a transposta da matriz A
# 5. Inicie i = 1;
# 6. Inicie j = 1;
# 7. Se A[i,j] = A_1[i,j], incremente teste: teste + 1;
# 8. Se j < = m volte para a linha 7;
# 9. Incremente i: i = i + 1;
# 10. Se i < = n volte para a linha 7;
# 11. Se teste = n*m, retorne TRUE, se não, FALSE;teste_simetrica = function(A){
if( class(A)[1] != "matrix" )
stop("Não é uma matriz")
n = nrow(A); m = ncol(A); teste = 0
if( n != m)
stop("Não é uma matriz quadrada")
A_1 = matriz_transposta(A)
for (i in 1:n){
for (j in 1:m){
if( A[i,j]==A_1[i,j] ){
teste = teste + 1
}
}
}
if(teste == n*m){
return(TRUE)
}else{ return(FALSE) }
}
A = matrix( c(2,8,7,4,1,5,9,3,1), ncol = 3 )
teste_simetrica(A)## [1] FALSE
## [1] TRUE
Implemente uma função que recebe como entrada uma matriz A e um vetor (array de números) v e retorna o vetor (array de números) definido pelo produto Av.
matriz_vetor = function(A,v){
if( class(A)[1] != "matrix" | class(v) != "numeric")
stop("Não é uma matriz ou vetor")
n = nrow(A); m = ncol(A); k = length(v); i = 1
if(m != k )
stop("Números de colunas da matriz precisa ser o mesmo números de elemento no vetor")
w = numeric(0)
repeat{
w[i] = produto_interno(A[i,],v)
i = i + 1
if(i>n)
break
}
return(w)
}
B = matrix( c(5,8,8,1), ncol = 2 )
v = c(4,2)
matriz_vetor(B,v)## [1] 36 34
Implemente uma função que recebe como entrada duas matrizes A e B e retorna a matriz definida pelo produto entre A e B. Atenção: o produto de matrizes não é uma operação comutativa, ou seja, \(AB≠BA\). Nesse exercício vamos definir que a matriz passada como primeiro argumento de entrada A será a matriz que fica do lado esquerdo do produto.
matriz_prod = function(A,B){
if( class(A)[1] != "matrix" | class(B)[1] != "matrix")
stop("Não são vetores de números reais")
n = nrow(A); m = ncol(A)
l = nrow(B); c = ncol(B)
if( m != l )
stop("Números de Colunas da primeira matriz precisa ser igual ao número de linhas da segunda matriz")
M = matrix(0, nrow = n, ncol = c)
for (i in 1:n){
for (j in 1:c){
M[i,j] = produto_interno(A[i,],B[,j])
}
}
return(M)
}
B = matrix( c(2,8,7,4,1,5), nrow = 2 )
A = matrix( c(5,9,3,1,5,9,3,1), ncol = 2 )
matriz_prod(A,B)## [,1] [,2] [,3]
## [1,] 50 55 30
## [2,] 90 99 54
## [3,] 30 33 18
## [4,] 10 11 6
## [1] 2
Para o próximo exercício considere \(α=4\), \(β=−3\), \(v_1=(2,−3,−1,5,0,−2)\), \(v_2=(3,4,−1,0,1,1)\), \(v_3=(1,2,3,4,5)\), \(v_4=(0,1,1)\),
\(M_1 = \left( \begin{array}{rrr}1 & 3 & 2 \\-1 & 0 & 1 \\\end{array}\right)\quad , \quad M_2 = \left( \begin{array}{rrr}0 & -5 & 3 \\-1 & 1 & -1 \\1 & 4 & 0\\\end{array}\right), \quad M_3 = \left( \begin{array}{rr}3 & 1 \\-2 & 10 \\3 & -1\\\end{array}\right)\), \(M_4 = \left( \begin{array}{rr} 1 & 1 \\ 0 & 1 \\\end{array}\right), \quad M_5 = \left( \begin{array}{rrrr}3 & 1 & 0 & 1\\1 & 1 & 3 & 2\\0 & 3 & -5 & 0\\1 & 2 & 0 & 0 \\\end{array}\right)\)
a=4; b=c(-3); v1=c(2,-3,-1,5,0,-2); v2=c(3,4,-1,0,1,1); v3=c(1,2,3,4,5); v4=c(0,1,1)
M1 = matrix(c(1,3,2,-1,0,1), ncol= 3, byrow = T)
M2 = matrix(c(0,-5,3,-1,1,-1,1,4,0), ncol= 3, byrow = T)
M3 = matrix(c(3,1,-2,10,3,-1), ncol= 2, byrow = T)
M4 = matrix(c(1,1,0,1), ncol= 2, byrow = T)
M5 = matrix(c(3,1,0,1,1,1,3,2,0,3,-5,0,1,2,0,0), ncol= 4, byrow = T)Usando as funções que você implementou nos exercícios anteriores faça as contas que se pede. Tente fazer cada item usando apenas uma linha de comando no R.
(a). \(αv_3\)
## [1] 4 8 12 16 20
(b). \(v_1+v_2\)
## [1] 5 1 -2 5 1 -1
(c). \(v_3−v_1\)
Resposta: ERROR: Os vetores tem tamanhos distintos.
(d). \(<v_1,v_2>\)
## [1] -7
(e). \(<αv_1,v_2−v_1>\)
## [1] -200
(f). \(<v_1+v_2,v_1−v_2>\)
## [1] 15
(g). Os vetores \(v_1\) e \(v_2\) acima são perpendiculares (ortogonais)?
## [1] FALSE
(h). \(βM_1\)
## [,1] [,2] [,3]
## [1,] -3 -9 -6
## [2,] 3 0 -3
(i). \(MT_1\)
## [,1] [,2]
## [1,] 1 -1
## [2,] 3 0
## [3,] 2 1
(j). Verifique se as matrizes \(M_1\), \(M_4\) e \(M_5\) são simétricas.
## [1] FALSE
## [1] TRUE
Resposta: ERROR in teste_simetrica(M1): Não é uma matriz quadrada.
(k). \(M_1v_4\)
## [1] 5 1
(l). \(M_2v_4+v_4\)
## [1] -2 1 5
(m). \(M_1M_2\)
## [,1] [,2] [,3]
## [1,] -1 6 0
## [2,] 1 9 -3
(n). \(M_2M_1\)
Resposta: ERROR: Números de Colunas da primeira matriz precisa ser igual ao número de Linhas da segunda matriz.
(o). \(M_3^TM_2\)
## [,1] [,2] [,3]
## [1,] 5 -5 11
## [2,] -11 1 -7
(p). \((M_1M_3)+M_4\)
## [,1] [,2]
## [1,] 4 30
## [2,] 0 -1
(q). \(M_1M_2M_3\)
## [,1] [,2]
## [1,] -15 59
## [2,] -24 94
(r). \(M_1M_2M_3−M_4\)
## [,1] [,2]
## [1,] -16 58
## [2,] -24 93