方程组竖着解—克拉默法则

1 解线性方程组

以前我们学习过代入消元法解线性方程组,比如这个四元方程组: 

 尝试用代入消元法来解一下它,过程如下:

解的过程比较复杂,如果未知数继续增加,代入消元法会更痛苦。有没有一种方法能够通过方程直接写出解呢?

还真有这样的方法,这就是数学家加百列·克拉默发现的克拉默法则

下面先给出它的定义:

定理(克拉默法则). 有  个未知数,  个方程所组成的线性方程组: 

 它的系数矩阵是n阶方阵  。如果对应的行列式  不等于0,即:

 则方程组有唯一解,并且解为:

 其中  是把系数矩阵  中第  列的元素用方程组右端的常数项代替后所得到的  阶矩阵,即: 

 这就是克拉默法则(Cramer's Rule),也称为克莱姆法则。

可以看到,通过方程,我们可以直接将解写为两个行列式的商的形式。

2 克拉默法则的发展史

虽然规则最终冠以了克拉默的名字,但是为此付出的绝不止他一个人,下面我们就走近历史,看看克拉默法则发展的故事。

2.1 莱布尼茨的建议

在十七世纪数学家笛卡尔提倡使用  等字母来表示未知数,才开始形成了现在的方程,比如这个二元方程:

可以解得:

 可以发现,未知数  最终都写成了两个式子相除

再进一步观察,还可以看到分母都为  ,分子是不同的,得寻找分子的规律。

数学家莱布尼茨指出,这个规律可能与未知数的位置有关,为此他给未知数加上了索引,用  来表示未知数。方程就变为了:

解变为: 

 他将这一改变写在了1700年出版的《教师学报》上,并建议可以继续往这个方向继续研究。

2.2 克拉默的研究

后来瑞士数学家克拉默根据这一线索,对这个方程组进行了进一步修改,他用字母  来表示第一列的系数,  来表示第二列的系数,  来表示常数项,方程变为

 解变为: 

 改为这样后克拉默发现分子分母的差别不大,以 

 为例。就是将分母中  变为  ,  变为  ,而前面说过  代表第一列,  代表第二列,  代表常数项,因此  的分子就是将分母中的第一列替换为常数项:

 同样

 是将分母中的  变为  ,  变为  ,可以看出  是将分母中的第二列替换为了常数项。

 继续研究克拉默发现对于三元方程组,四元方程组,五元方程组都符合这个规律。如三元方程组:

 这个方程第三个未知数  的值为: 

 第三个未知数是将第三列的  替换为了  。

这就是克拉默本人给出的克拉默法则,他将这个结论发表在了1750年出版的《代数曲线分析》上。

2.3 大神们的改良

虽然克拉默已经给出了规律,但是由于结论太冗长了,并没有被推广开。后来又经过拉普拉斯等人的努力,发展出了行列式理论。

根据行列式的运算规则,可以将分子分母写成行列式的形式,如三阶方程的第三个未知数 

  

写成行列式的形式后得到:

 不过这和我们现在常看到的形式还有点区别,这是因为后来大神柯西又引入了双下标的记号法,并用字母  表示常数项

方程变为: 

 变为:

  这就是我们现在看到的克拉默法则。

3 几何证明

在1750年克拉默发表文章时,因为行列式技术还不成熟,因此他只给出了结论,没有给具体的证明过程。今天我们就来帮他完善一下证明过程。

首先来看二元的情况:

 对于这样一个方程组,我们习惯横着看:

看成是由两个方程组成,这样在几何上,它们可以看作是两条直线,方程组是求两个直线的交点。

这也是我们前面学习的代入消元法,而我们说过克拉默法则与代入消元法不同,我们换种思路,我们竖着看这个方程,每一列都用一个向量来表示:

我们可以在平面中画出这几个二维向量:

现在我们需要找出一个相等的量帮助我们求未知数,这里我们可以用相等的面积。

可以看到图中的两个平行四边形是同底同高的平行四边形,它们的面积相等。因此有: 

 变形后就能得到:

 我们还能得到这一组平行四边形面积相等

这一组我们可以得到:

 二元时我们通过几何意义,得出了克拉默法则的形式

4 代数证明

对于n个未知数的方程组是这样 

 根据克拉默法则,得出它的解  为:

 变下形就是:

 现在我们从等式左边 

 开始,看它是怎样一步步计算等于等式右边的:

第一步:使用行列式的数乘法则,将系数  乘到第一列中,行列式的值不变,即: 

 第二步:使用行列式的倍加法则,将第二列的  倍,第三列的  倍...一直到第  列的  倍加到第一列,行列式不变,即:

 又因为:

 这样就得出了: 

 我们用同样的通俗易懂、图形化的方式,对《线性代数》、《单变量微积分》、《多变量微积分》、《概率论与数理统计》进行了精讲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
克拉法则是一种求解线性方程组的方法,可以使用C语言实现。具体步骤如下: 1. 定义系数矩阵A和常数矩阵B; 2. 计算系数矩阵A的行列式D; 3. 对于方程组中的每个未知数,将常数矩阵B替换为系数矩阵A的对应列,并计算替换后的矩阵的行列式D_i; 4. 未知数的解即为D_i/D。 以下是C语言代码实现: ```c #include <stdio.h> #define N 3 // 方程组未知数个数 int main() { double A[N][N] = {{2, 1, -1}, {-3, -1, 2}, {-2, 1, 2}}; // 系数矩阵 double B[N] = {8, -11, -3}; // 常数矩阵 double D = 0; // 系数矩阵的行列式 double D_i[N]; // 替换后的矩阵的行列式 double X[N]; // 方程组的解 // 计算系数矩阵的行列式 for (int i = 0; i < N; i++) { double temp = 1; for (int j = 0; j < N; j++) { temp *= A[(i+j)%N][j]; } D += temp; temp = 1; for (int j = N-1; j >= 0; j--) { temp *= A[(i-j+N)%N][j]; } D -= temp; } // 计算替换后的矩阵的行列式 for (int k = 0; k < N; k++) { double temp[N][N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (j == k) { temp[i][j] = B[i]; } else { temp[i][j] = A[i][j]; } } } double D_temp = 0; for (int i = 0; i < N; i++) { double temp2 = 1; for (int j = 0; j < N; j++) { temp2 *= temp[(i+j)%N][j]; } D_temp += temp2; temp2 = 1; for (int j = N-1; j >= 0; j--) { temp2 *= temp[(i-j+N)%N][j]; } D_temp -= temp2; } D_i[k] = D_temp; } // 计算方程组的解 for (int i = 0; i < N; i++) { X[i] = D_i[i] / D; } // 输出方程组的解 printf("方程组的解为:\n"); for (int i = 0; i < N; i++) { printf("x%d = %f\n", i+1, X[i]); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值