Revisão Aula 17
INF01202
Exercício #1 (Matriz transposta)
Preencha (com números aleatórios de 1 a 99, supondo que a semente de números aleatórios seja 0) uma matriz quadrada (de inteiros) de ordem 10 e obtenha a sua transposta. Imprima as duas matrizes para averiguação.
(#1) Code rev-a17-transposta.c
#include <stdio.h> #include <stdlib.h> //Limites da nossa matriz #define ORDEM 10
//Limites de valores aleatórios #define MIN 1
#define MAX 99
int main(){
//A matriz m e seus índices int m[ORDEM][ORDEM] = {0}; int mt[ORDEM][ORDEM] = {0}; int l, c;
// Define a semente para aleatórios srand(0);
// inicializar a matriz // com valores aleatórios for (l = 0; l < ORDEM; l++)
for (c = 0; c < ORDEM; c++) m[l][c] =
MIN+(rand()%(MAX-MIN+1));
// gera a transposta for (l = 0; l < ORDEM; l++) for (c = 0; c < ORDEM; c++) mt[l][c] = m[c][l]; // imprime m printf("Original:\n"); for (l = 0; l < ORDEM; l++){ for (c = 0; c < ORDEM; c++) printf("%2d ", m[l][c]); printf("\n"); } // imprime mt printf("Transposta:\n"); for (l = 0; l < ORDEM; l++){ for (c = 0; c < ORDEM; c++) printf("%2d ", mt[l][c]); printf("\n"); } return 0; }
Exercício #2 (Sistema de Equações Lineares)
Suponha um n máximo.
Ex
:Escrever um programa que leia do teclado os coeficientes de um sistema linear triangular superior, os termos independentes, e calcule (imprimindo na tela) o vetor solução. Assuma que o sistema possui solução única.Dica: um sistema linear triangular superior de ordem n pode ser escrito na forma:
Cortesia: Prof. Claudio Jung
(#2) Sistema linear
Caso geral a11x1+ a12x2+ ... + a13xn= b1 a21x1+ a22x2+ ... + a23xn= b2 ... an1x1+ an2x2+ ... + an3xn= bnExemplo com 3 incógnitas a11x1+ a12x2+ a13x3 = b1 a21x1+ a22x2+ a23x3 = b2 a31x1+ a32x2+ a33x3 = b3
Caso triangular superior do exemplo a11x1+ a12x2+ a13x3 = b1 a22x2+ a23x3 = b2 a33x3 = b3
(#2) Sistema linear
Caso geral a11x1+ a12x2+ ... + a13xn= b1 a21x1+ a22x2+ ... + a23xn= b2 ... an1x1+ an2x2+ ... + an3xn= bnExemplo com 3 incógnitas a11x1+ a12x2+ a13x3 = b1 a21x1+ a22x2+ a23x3 = b2 a31x1+ a32x2+ a33x3 = b3
Caso triangular superior do exemplo a11x1+ a12x2+ a13x3 = b1 a22x2+ a23x3 = b2 a33x3 = b3 5 / 12
(#2) Sistema linear
Caso geral a11x1+ a12x2+ ... + a13xn= b1 a21x1+ a22x2+ ... + a23xn= b2 ... an1x1+ an2x2+ ... + an3xn= bnExemplo com 3 incógnitas a11x1+ a12x2+ a13x3 = b1 a21x1+ a22x2+ a23x3 = b2 a31x1+ a32x2+ a33x3 = b3
Caso triangular superior do exemplo a11x1+ a12x2+ a13x3 = b1 a22x2+ a23x3 = b2 a33x3 = b3
(#2) Versão computacional
Caso triangular superior do exemplo com 3 incógnitas a11x1+ a12x2+ a13x3 = b1 a22x2+ a23x3 = b2 a33x3 = b3
Versão computacional (com matrizes e vetores) a11 a12 a13 0.0 a22 a13 0.0 0.0 a33 x1 x2 x3 = b1 b2 b3
Nomes para estes três elementos
[ Matriz Coecientes ] [ Vetor Solução ] = [ Vetor Termos Independentes ]
(#2) Estratégia + Planejamento
Estratégia de retrossubstituição para resolução de sistemas triangulares Veja este video, procure extrair o algoritmo
https://www.youtube.com/watch?v=53QVmZpZQ0M
Exemplo de teste com 4 incógnitas, do video acima 3.0000 1.0000 1.0000 1.0000 0.0000 1.6667 0.6667 1.6667 0.0000 0.0000 0.4000 0.0000 0.0000 0.0000 0.0000 −1.0001 x1 x2 x3 x4 = 6.0000 4.0002 0.4001 −1.0003
(#2) Algoritmo de retrossubstituição
Caso triangular superior de um exemplo com quatro incógnitas a11x1+ a12x2+ a13x3+ a14x4 = b1 a22x2+ a23x3+ a24x4 = b2 a33x3+ a34x4 = b3 a44x4 = b4 Passo 1 → x4 = b4 a44 Passo 2 → x3 = b3− a34x4 a33 Passo 3 → x2 = b2− a23x3− a24x4 a22 Passo 4 → x1 = b1− a12x2− a13x3− a14x4 a11 8 / 12
(#2) Algoritmo de retrossubstituição (Computacional)
a11 a12 a13 a14 0.0 a22 a13 a24 0.0 0.0 a33 a34 0.0 0.0 0.0 a44 x1 x2 x3 x4 = b1 b2 b3 b4 1. Para cada linha l do vetor solução (da linha n até 1)
1.1 Calcula o numerador na variável aux
1.1.1 Inicializa variável aux da linha l do vetor independente 1.1.2 Para cada coluna c da matriz (do valor l+1 até n)
1.1.1 Subtrai de aux o termo a[l][c]*x[c];
(#2) Code rev-a17-sistema.c
#include <stdio.h> #define MAX 5 int main () { // Qtdade de incógnitas int n; // Matriz de Coeficientes float a[MAX][MAX] = {0}; // Vetor de Termos Indep. float b[MAX] = {0}; // Vetor solução float x[MAX] = {0}; // Auxiliar (numerador) float aux; // Índices int l, c; // leitura de n do {printf("Entre o tamanho (n) do " "sistema (n <= %d): ", MAX); scanf("%d", &n);
} while (n > 0 && n > MAX);
// Leitura dos dados de entrada for (l = 0; l < n; l++) {
for (c = l; c < n; c++) {
printf("Coeficiente a(%d,%d): ", l+1, c+1);
scanf("%f", &a[l][c]); }
printf("Termo independente b(%d): ", l+1);
scanf("%f", &b[l]); }
// Resolucao por retrossubstituicao for (l = n - 1; l >= 0; l--) {
aux = b[l];
for (c = l + 1; c < n; c++) aux = aux - a[l][c] * x[c]; x[l] = aux / a[l][l]; }
// Impressao da solucao
printf("O vetor solucao é: \n");
for (l = 0; l < n; l++)
printf("x_%d = %f\n", l+1, x[l]);
return 0;
(#2) Zoom no Algoritmo versus Programa
1. Para cada linha l do vetor solução (da linha n até 1)
1.1 Calcula o numerador na variável aux
1.1.1 Inicializa variável aux da linha l do vetor independente 1.1.2 Para cada coluna c da matriz (do valor l+1 até n)
1.1.1 Subtrai de aux o termo a[l][c]*x[c];
1.2 Dene a posição l do vetor solução como aux/a[l][l]
// ...
// Resolucao por retrossubstituicao for (l = n - 1; l >= 0; l--) {
aux = b[l];
for (c = l + 1; c < n; c++) aux = aux - a[l][c] * x[c]; x[l] = aux / a[l][l]; } // ... Elementos a11 a12 a13 a14 0.0 a22 a13 a24 0.0 0.0 a33 a34 0.0 0.0 0.0 a44 x1 x2 x3 x4 = b1 b2 b3 b4
Lembrete do último passo para x1
x1 = b1− a12x2− a13x3− a14x4 a11
(#2) Testes com o exemplo de video
3.0000 1.0000 1.0000 1.0000 0.0000 1.6667 0.6667 1.6667 0.0000 0.0000 0.4000 0.0000 0.0000 0.0000 0.0000 −1.0001 x1 x2 x3 x4 = 6.0000 4.0002 0.4001 −1.0003 Automatizando a entrada dos dados em bash (terminal do Linux)
gcc rev-a17-sistema.c
echo "4 3 1 1 1 6 1.6667 0.6667 1.6667 4.0002 0.4000 0 0.4001 -1.0001 -1.0003" | ./a.out
Entre o tamanho (n) do sistema (n <= 5): Coeficiente a(1,1): Coeficiente a(1,2): Coeficiente a(1,3): Coeficiente a(1,4): Termo independente b(1): Coeficiente a(2,2): Coeficiente a(2,3): Coeficiente a(2,4): Termo independente b(2): Coeficiente a(3,3): Coeficiente a(3,4): Termo independente b(3): Coeficiente a(4,4): Termo independente b(4): O vetor solucao é: x_1 = 0.999930
x_2 = 0.999760 x_3 = 1.000250 x_4 = 1.000200