Resolvendo Equações Lineares Usando a Regra de Cramer em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a resolver equações lineares usando a Regra de Cramer em C. O laboratório guiará você pelo processo de leitura dos coeficientes e constantes de um sistema de equações lineares, cálculo dos determinantes e, finalmente, impressão das soluções para as variáveis. Você criará um programa em C que permite aos usuários inserir os coeficientes e constantes, e então o programa fornecerá as soluções usando a Regra de Cramer. Este laboratório abrange conceitos essenciais de álgebra linear e matrizes, e as habilidades aprendidas podem ser aplicadas a uma variedade de problemas do mundo real.

Ler Coeficientes e Constantes

Neste passo, você aprenderá a ler os coeficientes e constantes para resolver equações lineares usando a Regra de Cramer em C. Criaremos um programa que permite aos usuários inserir os coeficientes de um sistema de equações lineares.

Primeiro, vamos criar um arquivo de origem C para nosso solucionador de equações lineares:

cd ~/project
nano cramer_solver.c

Agora, adicione o seguinte código ao arquivo:

#include <stdio.h>

#define MAX_SIZE 3

int main() {
    float matrix[MAX_SIZE][MAX_SIZE];
    float constants[MAX_SIZE];
    int n;

    // Entrada do tamanho do sistema de equações
    printf("Digite o número de equações (máximo 3): ");
    scanf("%d", &n);

    // Entrada dos coeficientes
    printf("Digite os coeficientes da matriz:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Digite o coeficiente a[%d][%d]: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Entrada das constantes
    printf("Digite as constantes:\n");
    for (int i = 0; i < n; i++) {
        printf("Digite a constante b[%d]: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Imprimir a matriz de entrada e as constantes
    printf("\nMatriz de Entrada:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%.2f ", matrix[i][j]);
        }
        printf("| %.2f\n", constants[i]);
    }

    return 0;
}

Compile o programa:

gcc -o cramer_solver cramer_solver.c

Execute o programa:

./cramer_solver

Exemplo de saída:

Digite o número de equações (máximo 3): 2
Digite os coeficientes da matriz:
Digite o coeficiente a[1][1]: 2
Digite o coeficiente a[1][2]: 1
Digite o coeficiente a[2][1]: -3
Digite o coeficiente a[2][2]: 4
Digite as constantes:
Digite a constante b[1]: 4
Digite a constante b[2]: 5

Matriz de Entrada:
2.00 1.00 | 4.00
-3.00 4.00 | 5.00

Vamos decompor o código:

  1. Definimos um tamanho máximo de 3x3 para o sistema de equações lineares.
  2. O programa primeiro solicita ao usuário a entrada do número de equações.
  3. Em seguida, solicita ao usuário a entrada dos coeficientes da matriz.
  4. A seguir, solicita as constantes das equações lineares.
  5. Finalmente, imprime a matriz de entrada e as constantes para verificação.

Este passo prepara o terreno para a implementação da Regra de Cramer, permitindo que os usuários insiram os coeficientes e constantes de um sistema de equações lineares.

Calcular Determinantes

Neste passo, você aprenderá a calcular determinantes para resolver equações lineares usando a Regra de Cramer em C. Estenderemos o programa anterior para incluir funções de cálculo de determinantes.

Abra o arquivo de origem existente:

cd ~/project
nano cramer_solver.c

Atualize o código com as funções de cálculo de determinantes:

#include <stdio.h>

#define MAX_SIZE 3

// Função para calcular o determinante de uma matriz
float computeDeterminant(float matrix[MAX_SIZE][MAX_SIZE], int n) {
    if (n == 1) {
        return matrix[0][0];
    }

    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    float det = 0;
    float submatrix[MAX_SIZE][MAX_SIZE];
    int sign = 1;

    for (int x = 0; x < n; x++) {
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == x) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }
        det += sign * matrix[0][x] * computeDeterminant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

int main() {
    float matrix[MAX_SIZE][MAX_SIZE];
    float constants[MAX_SIZE];
    int n;

    // O código de entrada anterior permanece o mesmo
    printf("Digite o número de equações (máximo 3): ");
    scanf("%d", &n);

    // Entrada dos coeficientes
    printf("Digite os coeficientes da matriz:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Digite o coeficiente a[%d][%d]: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Entrada das constantes
    printf("Digite as constantes:\n");
    for (int i = 0; i < n; i++) {
        printf("Digite a constante b[%d]: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Calcular e exibir o determinante
    float mainDeterminant = computeDeterminant(matrix, n);
    printf("\nDeterminante Principal: %.2f\n", mainDeterminant);

    return 0;
}

Compile o programa atualizado:

gcc -o cramer_solver cramer_solver.c

Execute o programa:

./cramer_solver

Exemplo de saída:

Digite o número de equações (máximo 3): 2
Digite os coeficientes da matriz:
Digite o coeficiente a[1][1]: 2
Digite o coeficiente a[1][2]: 1
Digite o coeficiente a[2][1]: -3
Digite o coeficiente a[2][2]: 4
Digite as constantes:
Digite a constante b[1]: 4
Digite a constante b[2]: 5

Determinante Principal: 11.00

Pontos-chave sobre o cálculo do determinante:

  1. A função computeDeterminant() usa recursão para calcular os determinantes da matriz.
  2. Ela lida com matrizes 1x1 e 2x2 como casos base.
  3. Para matrizes maiores, usa o método de expansão de cofatores.
  4. A função funciona para matrizes quadradas de até 3x3.

O código demonstra como calcular o determinante principal da matriz de coeficientes, que é um passo crucial na Regra de Cramer para resolver equações lineares.

Imprimir Soluções para Variáveis

Neste passo, você completará a implementação da Regra de Cramer calculando e imprimindo as soluções para as variáveis em um sistema de equações lineares.

Abra o arquivo de origem existente:

cd ~/project
nano cramer_solver.c

Atualize o código com o cálculo da solução da Regra de Cramer:

#include <stdio.h>

#define MAX_SIZE 3

// A função computeDeterminant permanece a mesma
float computeDeterminant(float matrix[MAX_SIZE][MAX_SIZE], int n) {
    if (n == 1) {
        return matrix[0][0];
    }

    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    float det = 0;
    float submatrix[MAX_SIZE][MAX_SIZE];
    int sign = 1;

    for (int x = 0; x < n; x++) {
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == x) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }
        det += sign * matrix[0][x] * computeDeterminant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

// Função para resolver equações lineares usando a Regra de Cramer
void solveUsingCramersRule(float matrix[MAX_SIZE][MAX_SIZE], float constants[MAX_SIZE], int n) {
    float mainDeterminant = computeDeterminant(matrix, n);

    // Verifica se o sistema possui uma solução única
    if (mainDeterminant == 0) {
        printf("O sistema não possui uma solução única (o determinante é zero).\n");
        return;
    }

    // Cria matrizes temporárias para cada variável
    float tempMatrix[MAX_SIZE][MAX_SIZE];
    float solutions[MAX_SIZE];

    // Calcula as soluções para cada variável
    for (int i = 0; i < n; i++) {
        // Copia a matriz original
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                tempMatrix[j][k] = matrix[j][k];
            }
        }

        // Substitui a i-ésima coluna pelas constantes
        for (int j = 0; j < n; j++) {
            tempMatrix[j][i] = constants[j];
        }

        // Calcula o determinante para esta variável
        solutions[i] = computeDeterminant(tempMatrix, n) / mainDeterminant;
    }

    // Imprime as soluções
    printf("\nSoluções:\n");
    for (int i = 0; i < n; i++) {
        printf("x%d = %.2f\n", i+1, solutions[i]);
    }
}

int main() {
    float matrix[MAX_SIZE][MAX_SIZE];
    float constants[MAX_SIZE];
    int n;

    // O código de entrada permanece o mesmo
    printf("Digite o número de equações (máximo 3): ");
    scanf("%d", &n);

    // Entrada dos coeficientes
    printf("Digite os coeficientes da matriz:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Digite o coeficiente a[%d][%d]: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Entrada das constantes
    printf("Digite as constantes:\n");
    for (int i = 0; i < n; i++) {
        printf("Digite a constante b[%d]: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Resolve usando a Regra de Cramer
    solveUsingCramersRule(matrix, constants, n);

    return 0;
}

Compile o programa atualizado:

gcc -o cramer_solver cramer_solver.c

Execute o programa:

./cramer_solver

Exemplo de saída:

Digite o número de equações (máximo 3): 2
Digite os coeficientes da matriz:
Digite o coeficiente a[1][1]: 2
Digite o coeficiente a[1][2]: 1
Digite o coeficiente a[2][1]: -3
Digite o coeficiente a[2][2]: 4
Digite as constantes:
Digite a constante b[1]: 4
Digite a constante b[2]: 5

Soluções:
x1 = 2.00
x2 = 1.00

Pontos-chave sobre o cálculo da solução:

  1. A função solveUsingCramersRule() implementa a Regra de Cramer.
  2. Ela verifica se o sistema possui uma solução única, verificando o determinante principal.
  3. Para cada variável, cria uma matriz temporária e calcula seu determinante.
  4. As soluções são calculadas dividindo o determinante de cada variável pelo determinante principal.

O programa agora resolve completamente um sistema de equações lineares usando a Regra de Cramer.

Resumo

Neste laboratório, você aprenderá a ler os coeficientes e constantes de um sistema de equações lineares, que é o primeiro passo para resolvê-las usando a Regra de Cramer em C. O programa permite que os usuários insiram os coeficientes da matriz e as constantes, e então imprime a matriz de entrada para verificação. Este passo estabelece a base para os passos subsequentes de cálculo de determinantes e impressão das soluções para as variáveis.

O próximo passo envolverá o cálculo dos determinantes da matriz de coeficientes e das matrizes modificadas, que é uma parte crucial da Regra de Cramer. O passo final será imprimir as soluções para as variáveis dividindo os determinantes das matrizes modificadas pelo determinante da matriz de coeficientes.