题目:

《孙子算经》卷下31:今有鸡兔同笼,上有三十五头,下有九十四足。问鸡、兔各几何? ^[《算经十书》P320]

提示:本题可按n元一次方程组来求解(高斯消元法)。编写具有一定通用性的解方程的函数(假设n不超过20)。可参考《数值分析》方面的资料来确定求解方法。


讲解:

为了解决这个问题,我们可以使用线性代数方法求解n元一次方程组。在这个特定的例子中,我们有一个二元一次方程组:

x + y = 35
2x + 4y = 94

其中x表示鸡的数量,y表示兔子的数量。

我们可以使用高斯消元法来求解这个方程组。以下是一个C语言程序,它使用高斯消元法求解给定的二元一次方程组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <stdlib.h>

#define N 2

void gaussian_elimination(double a[N][N + 1], double *result) {
for (int i = 0; i < N; i++) {
// 找到主元
int max_row = i;
for (int k = i + 1; k < N; k++) {
if (abs(a[k][i]) > abs(a[max_row][i])) {
max_row = k;
}
}

// 交换行
for (int k = i; k < N + 1; k++) {
double tmp = a[i][k];
a[i][k] = a[max_row][k];
a[max_row][k] = tmp;
}

// 消元
for (int k = i + 1; k < N; k++) {
double factor = a[k][i] / a[i][i];
for (int j = i; j < N + 1; j++) {
a[k][j] -= factor * a[i][j];
}
}
}

// 回代
for (int i = N - 1; i >= 0; i--) {
result[i] = a[i][N];
for (int k = i + 1; k < N; k++) {
result[i] -= a[i][k] * result[k];
}
result[i] /= a[i][i];
}
}

int main() {
double a[N][N + 1] = {
{1, 1, 35},
{2, 4, 94}
};
double result[N];

gaussian_elimination(a, result);

printf("鸡: %.0f, 兔: %.0f\n", result[0], result[1]);

return 0;
}

上面这个程序示例了矩阵变化高斯全主元消去法,调用gaussian_elimination函数来求解方程组。

此外,我们还可以用高斯顺序消元法。matlab讲解此算法


实质: