Lineare Gleichungen mit der Cramer'schen Regel in C lösen

CCBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie lineare Gleichungen mit der Cramer'schen Regel in C lösen. Das Lab führt Sie durch den Prozess des Lesens der Koeffizienten und Konstanten eines Systems linearer Gleichungen, des Berechnens der Determinanten und schließlich des Ausgebens der Lösungen für die Variablen. Sie werden ein C-Programm erstellen, das es Benutzern ermöglicht, die Koeffizienten und Konstanten einzugeben. Anschließend wird das Programm die Lösungen mithilfe der Cramer'schen Regel liefern. Dieses Lab behandelt essentielle Konzepte der Matrix- und Linearen Algebra, und die erlernten Fähigkeiten können auf eine Vielzahl von realen Problemen angewendet werden.

Koeffizienten und Konstanten einlesen

In diesem Schritt lernen Sie, wie Sie Koeffizienten und Konstanten für die Lösung linearer Gleichungen mit der Cramer'schen Regel in C einlesen. Wir werden ein Programm erstellen, das es Benutzern ermöglicht, die Koeffizienten eines Systems linearer Gleichungen einzugeben.

Zunächst erstellen wir eine C-Quelldatei für unseren Lineargleichungslöser:

cd ~/project
nano cramer_solver.c

Fügen Sie jetzt den folgenden Code in die Datei ein:

#include <stdio.h>

#define MAX_SIZE 3

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

    // Eingabe der Größe des Gleichungssystems
    printf("Geben Sie die Anzahl der Gleichungen (max. 3) ein: ");
    scanf("%d", &n);

    // Eingabe der Koeffizienten
    printf("Geben Sie die Koeffizienten der Matrix ein:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Geben Sie den Koeffizienten a[%d][%d] ein: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Eingabe der Konstanten
    printf("Geben Sie die Konstanten ein:\n");
    for (int i = 0; i < n; i++) {
        printf("Geben Sie die Konstante b[%d] ein: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Ausgabe der eingegebenen Matrix und Konstanten
    printf("\nEingegebene Matrix:\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;
}

Kompilieren Sie das Programm:

gcc -o cramer_solver cramer_solver.c

Führen Sie das Programm aus:

./cramer_solver

Beispielausgabe:

Geben Sie die Anzahl der Gleichungen (max. 3) ein: 2
Geben Sie die Koeffizienten der Matrix ein:
Geben Sie den Koeffizienten a[1][1] ein: 2
Geben Sie den Koeffizienten a[1][2] ein: 1
Geben Sie den Koeffizienten a[2][1] ein: -3
Geben Sie den Koeffizienten a[2][2] ein: 4
Geben Sie die Konstanten ein:
Geben Sie die Konstante b[1] ein: 4
Geben Sie die Konstante b[2] ein: 5

Eingegebene Matrix:
2.00 1.00 | 4.00
-3.00 4.00 | 5.00

Lassen Sie uns den Code analysieren:

  1. Wir definieren eine maximale Größe von 3x3 für das System linearer Gleichungen.
  2. Das Programm fragt zunächst den Benutzer nach der Anzahl der Gleichungen.
  3. Anschließend fordert es den Benutzer auf, die Koeffizienten der Matrix einzugeben.
  4. Danach wird nach den Konstanten der linearen Gleichungen gefragt.
  5. Schließlich werden die eingegebene Matrix und die Konstanten zur Überprüfung ausgegeben.

Dieser Schritt legt die Grundlage für die Implementierung der Cramer'schen Regel, indem es Benutzern ermöglicht, die Koeffizienten und Konstanten eines Systems linearer Gleichungen einzugeben.

Determinanten berechnen

In diesem Schritt lernen Sie, wie Sie Determinanten für die Lösung linearer Gleichungen mit der Cramer'schen Regel in C berechnen. Wir erweitern das vorherige Programm um Funktionen zur Berechnung von Determinanten.

Öffnen Sie die vorhandene Quelldatei:

cd ~/project
nano cramer_solver.c

Aktualisieren Sie den Code mit Funktionen zur Berechnung von Determinanten:

#include <stdio.h>

#define MAX_SIZE 3

// Funktion zur Berechnung der Determinante einer Matrix
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;

    // Der vorherige Eingabecode bleibt unverändert
    printf("Geben Sie die Anzahl der Gleichungen (max. 3) ein: ");
    scanf("%d", &n);

    // Eingabe der Koeffizienten
    printf("Geben Sie die Koeffizienten der Matrix ein:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Geben Sie den Koeffizienten a[%d][%d] ein: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Eingabe der Konstanten
    printf("Geben Sie die Konstanten ein:\n");
    for (int i = 0; i < n; i++) {
        printf("Geben Sie die Konstante b[%d] ein: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Berechnung und Anzeige der Determinante
    float mainDeterminant = computeDeterminant(matrix, n);
    printf("\nHauptdeterminante: %.2f\n", mainDeterminant);

    return 0;
}

Kompilieren Sie das aktualisierte Programm:

gcc -o cramer_solver cramer_solver.c

Führen Sie das Programm aus:

./cramer_solver

Beispielausgabe:

Geben Sie die Anzahl der Gleichungen (max. 3) ein: 2
Geben Sie die Koeffizienten der Matrix ein:
Geben Sie den Koeffizienten a[1][1] ein: 2
Geben Sie den Koeffizienten a[1][2] ein: 1
Geben Sie den Koeffizienten a[2][1] ein: -3
Geben Sie den Koeffizienten a[2][2] ein: 4
Geben Sie die Konstanten ein:
Geben Sie die Konstante b[1] ein: 4
Geben Sie die Konstante b[2] ein: 5

Hauptdeterminante: 11.00

Wichtige Punkte zur Berechnung der Determinante:

  1. Die Funktion computeDeterminant() verwendet Rekursion zur Berechnung von Matrixdeterminanten.
  2. Sie behandelt 1x1- und 2x2-Matrizen als Basisfälle.
  3. Für größere Matrizen verwendet sie die Methode der Kofaktorexpansion.
  4. Die Funktion funktioniert für quadratische Matrizen bis zu 3x3.

Der Code zeigt, wie die Hauptdeterminante der Koeffizientenmatrix berechnet wird, was ein entscheidender Schritt in der Cramer'schen Regel zur Lösung linearer Gleichungen ist.

Lösungen für die Variablen ausgeben

In diesem Schritt vervollständigen Sie die Implementierung der Cramer'schen Regel, indem Sie die Lösungen für die Variablen in einem System linearer Gleichungen berechnen und ausgeben.

Öffnen Sie die vorhandene Quelldatei:

cd ~/project
nano cramer_solver.c

Aktualisieren Sie den Code mit der Berechnung der Lösungen nach der Cramer'schen Regel:

#include <stdio.h>

#define MAX_SIZE 3

// Die vorherige Funktion computeDeterminant bleibt unverändert
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;
}

// Funktion zur Lösung linearer Gleichungen mit der Cramer'schen Regel
void solveUsingCramersRule(float matrix[MAX_SIZE][MAX_SIZE], float constants[MAX_SIZE], int n) {
    float mainDeterminant = computeDeterminant(matrix, n);

    // Prüfen, ob das System eine eindeutige Lösung hat
    if (mainDeterminant == 0) {
        printf("Das System hat keine eindeutige Lösung (Determinante ist Null).\n");
        return;
    }

    // Temporäre Matrizen für jede Variable erstellen
    float tempMatrix[MAX_SIZE][MAX_SIZE];
    float solutions[MAX_SIZE];

    // Lösungen für jede Variable berechnen
    for (int i = 0; i < n; i++) {
        // Ursprüngliche Matrix kopieren
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                tempMatrix[j][k] = matrix[j][k];
            }
        }

        // i-te Spalte mit Konstanten ersetzen
        for (int j = 0; j < n; j++) {
            tempMatrix[j][i] = constants[j];
        }

        // Determinante für diese Variable berechnen
        solutions[i] = computeDeterminant(tempMatrix, n) / mainDeterminant;
    }

    // Lösungen ausgeben
    printf("\nLösungen:\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;

    // Eingabecode bleibt unverändert
    printf("Geben Sie die Anzahl der Gleichungen (max. 3) ein: ");
    scanf("%d", &n);

    // Eingabe der Koeffizienten
    printf("Geben Sie die Koeffizienten der Matrix ein:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Geben Sie den Koeffizienten a[%d][%d] ein: ", i+1, j+1);
            scanf("%f", &matrix[i][j]);
        }
    }

    // Eingabe der Konstanten
    printf("Geben Sie die Konstanten ein:\n");
    for (int i = 0; i < n; i++) {
        printf("Geben Sie die Konstante b[%d] ein: ", i+1);
        scanf("%f", &constants[i]);
    }

    // Mit der Cramer'schen Regel lösen
    solveUsingCramersRule(matrix, constants, n);

    return 0;
}

Kompilieren Sie das aktualisierte Programm:

gcc -o cramer_solver cramer_solver.c

Führen Sie das Programm aus:

./cramer_solver

Beispielausgabe:

Geben Sie die Anzahl der Gleichungen (max. 3) ein: 2
Geben Sie die Koeffizienten der Matrix ein:
Geben Sie den Koeffizienten a[1][1] ein: 2
Geben Sie den Koeffizienten a[1][2] ein: 1
Geben Sie den Koeffizienten a[2][1] ein: -3
Geben Sie den Koeffizienten a[2][2] ein: 4
Geben Sie die Konstanten ein:
Geben Sie die Konstante b[1] ein: 4
Geben Sie die Konstante b[2] ein: 5

Lösungen:
x1 = 2.00
x2 = 1.00

Wichtige Punkte zur Berechnung der Lösungen:

  1. Die Funktion solveUsingCramersRule() implementiert die Cramer'sche Regel.
  2. Sie prüft, ob das System eine eindeutige Lösung hat, indem sie die Hauptdeterminante überprüft.
  3. Für jede Variable erstellt sie eine temporäre Matrix und berechnet deren Determinante.
  4. Die Lösungen werden berechnet, indem die Determinante jeder Variable durch die Hauptdeterminante dividiert wird.

Das Programm löst nun vollständig ein System linearer Gleichungen mit der Cramer'schen Regel.

Zusammenfassung

In diesem Lab lernen Sie, wie Sie die Koeffizienten und Konstanten eines Systems linearer Gleichungen einlesen, was der erste Schritt bei der Lösung mit der Cramer'schen Regel in C ist. Das Programm ermöglicht es Benutzern, die Koeffizienten der Matrix und die Konstanten einzugeben. Anschließend wird die eingegebene Matrix zur Überprüfung ausgegeben. Dieser Schritt legt die Grundlage für die folgenden Schritte der Berechnung der Determinanten und der Ausgabe der Lösungen für die Variablen.

Im nächsten Schritt werden die Determinanten der Koeffizientenmatrix und der modifizierten Matrizen berechnet, was ein entscheidender Teil der Cramer'schen Regel ist. Der letzte Schritt besteht darin, die Lösungen für die Variablen auszugeben, indem die Determinanten der modifizierten Matrizen durch die Determinante der Koeffizientenmatrix dividiert werden.