소개
이 실습에서는 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;
// 방정식 시스템의 크기를 입력받습니다.
printf("방정식의 개수를 입력하세요 (최대 3 개): ");
scanf("%d", &n);
// 계수 입력
printf("행렬의 계수를 입력하세요:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("계수 a[%d][%d] 를 입력하세요: ", i + 1, j + 1);
scanf("%f", &matrix[i][j]);
}
}
// 상수 입력
printf("상수를 입력하세요:\n");
for (int i = 0; i < n; i++) {
printf("상수 b[%d] 를 입력하세요: ", i + 1);
scanf("%f", &constants[i]);
}
// 입력된 행렬과 상수 출력
printf("\n입력 행렬:\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
예시 출력:
방정식의 개수를 입력하세요(최대 3개): 2
행렬의 계수를 입력하세요:
계수 a[1][1]를 입력하세요: 2
계수 a[1][2]를 입력하세요: 1
계수 a[2][1]를 입력하세요: -3
계수 a[2][2]를 입력하세요: 4
상수를 입력하세요:
상수 b[1]를 입력하세요: 4
상수 b[2]를 입력하세요: 5
입력 행렬:
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
// 행렬의 행렬식을 계산하는 함수
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;
// 이전 입력 코드는 동일하게 유지
printf("방정식의 개수를 입력하세요 (최대 3 개): ");
scanf("%d", &n);
// 계수 입력
printf("행렬의 계수를 입력하세요:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("계수 a[%d][%d] 를 입력하세요: ", i+1, j+1);
scanf("%f", &matrix[i][j]);
}
}
// 상수 입력
printf("상수를 입력하세요:\n");
for (int i = 0; i < n; i++) {
printf("상수 b[%d] 를 입력하세요: ", i+1);
scanf("%f", &constants[i]);
}
// 행렬식 계산 및 출력
float mainDeterminant = computeDeterminant(matrix, n);
printf("\n주 행렬식: %.2f\n", mainDeterminant);
return 0;
}
업데이트된 프로그램을 컴파일합니다.
gcc -o cramer_solver cramer_solver.c
프로그램을 실행합니다.
./cramer_solver
예시 출력:
방정식의 개수를 입력하세요(최대 3개): 2
행렬의 계수를 입력하세요:
계수 a[1][1]를 입력하세요: 2
계수 a[1][2]를 입력하세요: 1
계수 a[2][1]를 입력하세요: -3
계수 a[2][2]를 입력하세요: 4
상수를 입력하세요:
상수 b[1]를 입력하세요: 4
상수 b[2]를 입력하세요: 5
주 행렬식: 11.00
행렬식 계산에 대한 주요 내용:
computeDeterminant()함수는 재귀를 사용하여 행렬식을 계산합니다.- 1x1 및 2x2 행렬은 기본 사례로 처리합니다.
- 더 큰 행렬의 경우, 여기서는 공변수 전개 방법을 사용합니다.
- 이 함수는 3x3 까지의 정방 행렬에 대해 작동합니다.
이 코드는 선형 방정식을 풀기 위한 크래머의 규칙에서 필수적인 단계인 계수 행렬의 주 행렬식을 계산하는 방법을 보여줍니다.
변수에 대한 해 출력
이 단계에서는 선형 방정식 시스템의 변수에 대한 해를 계산하고 출력하여 크래머의 규칙 구현을 완료합니다.
기존 소스 파일을 엽니다.
cd ~/project
nano cramer_solver.c
크래머의 규칙 해 계산을 포함하여 코드를 업데이트합니다.
#include <stdio.h>
#define MAX_SIZE 3
// 이전 computeDeterminant 함수는 동일하게 유지
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;
}
// 크래머의 규칙을 사용하여 선형 방정식을 푸는 함수
void solveUsingCramersRule(float matrix[MAX_SIZE][MAX_SIZE], float constants[MAX_SIZE], int n) {
float mainDeterminant = computeDeterminant(matrix, n);
// 시스템에 고유한 해가 있는지 확인
if (mainDeterminant == 0) {
printf("시스템에 고유한 해가 없습니다 (행렬식이 0 입니다).\n");
return;
}
// 각 변수에 대한 임시 행렬 생성
float tempMatrix[MAX_SIZE][MAX_SIZE];
float solutions[MAX_SIZE];
// 각 변수에 대한 해 계산
for (int i = 0; i < n; i++) {
// 원래 행렬 복사
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
tempMatrix[j][k] = matrix[j][k];
}
}
// i 번째 열을 상수로 대체
for (int j = 0; j < n; j++) {
tempMatrix[j][i] = constants[j];
}
// 이 변수에 대한 행렬식 계산
solutions[i] = computeDeterminant(tempMatrix, n) / mainDeterminant;
}
// 해 출력
printf("\n해:\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;
// 입력 코드는 동일하게 유지
printf("방정식의 개수를 입력하세요 (최대 3 개): ");
scanf("%d", &n);
// 계수 입력
printf("행렬의 계수를 입력하세요:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("계수 a[%d][%d] 를 입력하세요: ", i+1, j+1);
scanf("%f", &matrix[i][j]);
}
}
// 상수 입력
printf("상수를 입력하세요:\n");
for (int i = 0; i < n; i++) {
printf("상수 b[%d] 를 입력하세요: ", i+1);
scanf("%f", &constants[i]);
}
// 크래머의 규칙을 사용하여 풀기
solveUsingCramersRule(matrix, constants, n);
return 0;
}
업데이트된 프로그램을 컴파일합니다.
gcc -o cramer_solver cramer_solver.c
프로그램을 실행합니다.
./cramer_solver
예시 출력:
방정식의 개수를 입력하세요(최대 3개): 2
행렬의 계수를 입력하세요:
계수 a[1][1]를 입력하세요: 2
계수 a[1][2]를 입력하세요: 1
계수 a[2][1]를 입력하세요: -3
계수 a[2][2]를 입력하세요: 4
상수를 입력하세요:
상수 b[1]를 입력하세요: 4
상수 b[2]를 입력하세요: 5
해:
x1 = 2.00
x2 = 1.00
해 계산에 대한 주요 내용:
solveUsingCramersRule()함수는 크래머의 규칙을 구현합니다.- 주 행렬식을 확인하여 시스템에 고유한 해가 있는지 확인합니다.
- 각 변수에 대해 임시 행렬을 생성하고 행렬식을 계산합니다.
- 각 변수의 해는 주 행렬식으로 나눈 해당 변수의 행렬식으로 계산됩니다.
이제 프로그램은 크래머의 규칙을 사용하여 선형 방정식 시스템을 완전히 풉니다.
요약
이 실험에서는 C 언어를 사용하여 크래머의 규칙으로 선형 방정식을 풀기 위한 첫 번째 단계인 선형 방정식의 계수와 상수를 읽는 방법을 배웁니다. 이 프로그램은 사용자가 행렬의 계수와 상수를 입력할 수 있도록 하며, 입력된 행렬을 확인하기 위해 입력된 행렬을 출력합니다. 이 단계는 이후 단계인 행렬식 계산 및 변수의 해 출력을 위한 기반을 마련합니다.
다음 단계에서는 계수 행렬과 수정된 행렬의 행렬식을 계산하는 작업이 포함됩니다. 이는 크래머의 규칙의 중요한 부분입니다. 마지막 단계는 수정된 행렬의 행렬식을 계수 행렬의 행렬식으로 나누어 변수의 해를 출력하는 것입니다.



