Exercícios


Para todos os exercícios a seguir não se esqueça de:

  • Verificar sempre se as entradas passadas pelo usuário são viáveis para os cálculos das funções.
  • Inventar várias entradas para as funções implementadas a fim de verificar se elas estão funcionando corretamente.
  • Sempre que possível chamar as funções já implementadas dentro de uma nova função. Assim você simplifica bastante seu código.

Questão 1

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

Questão 2

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

Questão 3

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

Questão 4

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

Questão 5

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
ortogonal_teste(x,y)
## [1] TRUE

Questão 6

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

Questão 7

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

Questão 8

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

Questão 9

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

Questão 10

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
B = matrix( c(5,8,8,1), ncol = 2 )
teste_simetrica(B)
## [1] TRUE

Questão 11

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

Questão 12

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
ncol(A)
## [1] 2

Questão 13

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\)

vetor_escalar(v3,a)
## [1]  4  8 12 16 20

(b). \(v_1+v_2\)

vetor_soma(v1,v2)
## [1]  5  1 -2  5  1 -1

(c). \(v_3−v_1\)

#vetor_subtr(v3,v1)

Resposta: ERROR: Os vetores tem tamanhos distintos.

(d). \(<v_1,v_2>\)

produto_interno(v1,v2)
## [1] -7

(e). \(<αv_1,v_2−v_1>\)

produto_interno(vetor_escalar(v1,a), vetor_subtr(v2,v1))
## [1] -200

(f). \(<v_1+v_2,v_1−v_2>\)

produto_interno(vetor_soma(v1,v2),vetor_subtr(v1,v2))
## [1] 15

(g). Os vetores \(v_1\) e \(v_2\) acima são perpendiculares (ortogonais)?

ortogonal_teste(v1,v2)
## [1] FALSE

(h). \(βM_1\)

matriz_escalar(M1,b)
##      [,1] [,2] [,3]
## [1,]   -3   -9   -6
## [2,]    3    0   -3

(i). \(MT_1\)

matriz_transposta(M1)
##      [,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.

#teste_simetrica(M1)
teste_simetrica(M4)
## [1] FALSE
teste_simetrica(M5)
## [1] TRUE

Resposta: ERROR in teste_simetrica(M1): Não é uma matriz quadrada.

(k). \(M_1v_4\)

matriz_vetor(M1,v4)
## [1] 5 1

(l). \(M_2v_4+v_4\)

vetor_soma(matriz_vetor(M2,v4), v4)
## [1] -2  1  5

(m). \(M_1M_2\)

matriz_prod(M1,M2)
##      [,1] [,2] [,3]
## [1,]   -1    6    0
## [2,]    1    9   -3

(n). \(M_2M_1\)

#matriz_prod(M2,M1)

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\)

matriz_prod( matriz_transposta(M3), M2)
##      [,1] [,2] [,3]
## [1,]    5   -5   11
## [2,]  -11    1   -7

(p). \((M_1M_3)+M_4\)

matriz_soma( matriz_prod(M1,M3), M4)
##      [,1] [,2]
## [1,]    4   30
## [2,]    0   -1

(q). \(M_1M_2M_3\)

matriz_prod( matriz_prod(M1,M2), M3)
##      [,1] [,2]
## [1,]  -15   59
## [2,]  -24   94

(r). \(M_1M_2M_3−M_4\)

matriz_subtr( matriz_prod( matriz_prod(M1,M2), M3) , M4 )
##      [,1] [,2]
## [1,]  -16   58
## [2,]  -24   93