Введение
В этом лабораторном занятии (LabEx) вы научитесь решать системы линейных уравнений с использованием правила Крамера на языке C. В рамках лабораторной работы вы пройдете по этапам чтения коэффициентов и свободных членов системы линейных уравнений, вычисления определителей и, наконец, вывода решений для переменных. Вы создадите программу на языке C, которая позволит пользователям вводить коэффициенты и свободные члены, а затем программа будет выдавать решения с использованием правила Крамера. В этом лабораторном занятии рассматриваются основные концепции матриц и линейной алгебры, и полученные навыки могут быть применены для решения различных реальных задач.
Чтение коэффициентов и свободных членов
На этом этапе вы научитесь считывать коэффициенты и свободные члены для решения системы линейных уравнений с использованием правила Крамера на языке C. Мы создадим программу, которая позволит пользователям вводить коэффициенты системы линейных уравнений.
Сначала создадим файл исходного кода на языке C для нашего решателя линейных уравнений:
cd ~/project
nano cramer_solver.c
Теперь добавьте следующий код в файл:
#include <stdio.h>
#define MAX_SIZE 3
int main() {
float matrix[MAX_SIZE][MAX_SIZE];
float constants[MAX_SIZE];
int n;
// Input the size of the system of equations
printf("Enter the number of equations (max 3): ");
scanf("%d", &n);
// Input coefficients
printf("Enter the coefficients of the matrix:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("Enter coefficient a[%d][%d]: ", i+1, j+1);
scanf("%f", &matrix[i][j]);
}
}
// Input constants
printf("Enter the constants:\n");
for (int i = 0; i < n; i++) {
printf("Enter constant b[%d]: ", i+1);
scanf("%f", &constants[i]);
}
// Print the input matrix and constants
printf("\nInput 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;
}
Скомпилируйте программу:
gcc -o cramer_solver cramer_solver.c
Запустите программу:
./cramer_solver
Пример вывода:
Enter the number of equations (max 3): 2
Enter the coefficients of the matrix:
Enter coefficient a[1][1]: 2
Enter coefficient a[1][2]: 1
Enter coefficient a[2][1]: -3
Enter coefficient a[2][2]: 4
Enter the constants:
Enter constant b[1]: 4
Enter constant b[2]: 5
Input Matrix:
2.00 1.00 | 4.00
-3.00 4.00 | 5.00
Разберем код по частям:
- Мы определяем максимальный размер системы линейных уравнений как 3x3.
- Программа сначала запрашивает у пользователя количество уравнений.
- Затем она просит пользователя ввести коэффициенты матрицы.
- Далее запрашиваются свободные члены линейных уравнений.
- Наконец, программа выводит введенную матрицу и свободные члены для проверки.
Этот этап создает основу для реализации правила Крамера, позволяя пользователям вводить коэффициенты и свободные члены системы линейных уравнений.
Вычисление определителей
На этом этапе вы научитесь вычислять определители для решения системы линейных уравнений с использованием правила Крамера на языке C. Мы расширим предыдущую программу, добавив функции для вычисления определителей.
Откройте существующий файл исходного кода:
cd ~/project
nano cramer_solver.c
Обновите код, добавив функции для вычисления определителей:
#include <stdio.h>
#define MAX_SIZE 3
// Function to compute determinant of a 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;
// Previous input code remains the same
printf("Enter the number of equations (max 3): ");
scanf("%d", &n);
// Input coefficients
printf("Enter the coefficients of the matrix:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("Enter coefficient a[%d][%d]: ", i+1, j+1);
scanf("%f", &matrix[i][j]);
}
}
// Input constants
printf("Enter the constants:\n");
for (int i = 0; i < n; i++) {
printf("Enter constant b[%d]: ", i+1);
scanf("%f", &constants[i]);
}
// Compute and display determinant
float mainDeterminant = computeDeterminant(matrix, n);
printf("\nMain Determinant: %.2f\n", mainDeterminant);
return 0;
}
Скомпилируйте обновленную программу:
gcc -o cramer_solver cramer_solver.c
Запустите программу:
./cramer_solver
Пример вывода:
Enter the number of equations (max 3): 2
Enter the coefficients of the matrix:
Enter coefficient a[1][1]: 2
Enter coefficient a[1][2]: 1
Enter coefficient a[2][1]: -3
Enter coefficient a[2][2]: 4
Enter the constants:
Enter constant b[1]: 4
Enter constant b[2]: 5
Main Determinant: 11.00
Основные моменты вычисления определителя:
- Функция
computeDeterminant()использует рекурсию для вычисления определителей матриц. - Она обрабатывает матрицы размером 1x1 и 2x2 как базовые случаи.
- Для больших матриц используется метод разложения по минорам.
- Функция работает для квадратных матриц размером до 3x3.
Код демонстрирует, как вычислить главный определитель матрицы коэффициентов, что является важным этапом в применении правила Крамера для решения системы линейных уравнений.
Вывод решений для переменных
На этом этапе вы завершите реализацию правила Крамера, вычислив и выведя решения для переменных в системе линейных уравнений.
Откройте существующий файл исходного кода:
cd ~/project
nano cramer_solver.c
Обновите код, добавив вычисление решений по правилу Крамера:
#include <stdio.h>
#define MAX_SIZE 3
// Previous computeDeterminant function remains the same
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;
}
// Function to solve linear equations using Cramer's Rule
void solveUsingCramersRule(float matrix[MAX_SIZE][MAX_SIZE], float constants[MAX_SIZE], int n) {
float mainDeterminant = computeDeterminant(matrix, n);
// Check if the system has a unique solution
if (mainDeterminant == 0) {
printf("The system has no unique solution (determinant is zero).\n");
return;
}
// Create temporary matrices for each variable
float tempMatrix[MAX_SIZE][MAX_SIZE];
float solutions[MAX_SIZE];
// Calculate solutions for each variable
for (int i = 0; i < n; i++) {
// Copy original matrix
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
tempMatrix[j][k] = matrix[j][k];
}
}
// Replace i-th column with constants
for (int j = 0; j < n; j++) {
tempMatrix[j][i] = constants[j];
}
// Calculate determinant for this variable
solutions[i] = computeDeterminant(tempMatrix, n) / mainDeterminant;
}
// Print solutions
printf("\nSolutions:\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;
// Input code remains the same
printf("Enter the number of equations (max 3): ");
scanf("%d", &n);
// Input coefficients
printf("Enter the coefficients of the matrix:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("Enter coefficient a[%d][%d]: ", i+1, j+1);
scanf("%f", &matrix[i][j]);
}
}
// Input constants
printf("Enter the constants:\n");
for (int i = 0; i < n; i++) {
printf("Enter constant b[%d]: ", i+1);
scanf("%f", &constants[i]);
}
// Solve using Cramer's Rule
solveUsingCramersRule(matrix, constants, n);
return 0;
}
Скомпилируйте обновленную программу:
gcc -o cramer_solver cramer_solver.c
Запустите программу:
./cramer_solver
Пример вывода:
Enter the number of equations (max 3): 2
Enter the coefficients of the matrix:
Enter coefficient a[1][1]: 2
Enter coefficient a[1][2]: 1
Enter coefficient a[2][1]: -3
Enter coefficient a[2][2]: 4
Enter the constants:
Enter constant b[1]: 4
Enter constant b[2]: 5
Solutions:
x1 = 2.00
x2 = 1.00
Основные моменты вычисления решений:
- Функция
solveUsingCramersRule()реализует правило Крамера. - Она проверяет, имеет ли система единственное решение, путем проверки главного определителя.
- Для каждой переменной создается временная матрица и вычисляется ее определитель.
- Решения вычисляются путем деления определителя каждой переменной на главный определитель.
Теперь программа полностью решает систему линейных уравнений с использованием правила Крамера.
Резюме
В этом лабораторном занятии (LabEx) вы научитесь считывать коэффициенты и свободные члены системы линейных уравнений, что является первым этапом при решении их с использованием правила Крамера на языке C. Программа позволяет пользователям вводить коэффициенты матрицы и свободные члены, а затем выводит введенную матрицу для проверки. Этот этап создает основу для последующих этапов вычисления определителей и вывода решений для переменных.
Следующий этап будет заключаться в вычислении определителей матрицы коэффициентов и модифицированных матриц, что является важной частью правила Крамера. Финальным этапом будет вывод решений для переменных путем деления определителей модифицированных матриц на определитель матрицы коэффициентов.



