使用克莱默法则解决矩阵问题

时间:2018-01-14 03:26:16

标签: linear-algebra

所以我在互联网上搜索了 Cramer's Rule 的程序,并且有一些,但显然这些例子只适用于2x2或4x4的固定矩阵。

但是,我正在寻找一种解决NxN矩阵的方法。所以我开始并向用户询问矩阵的大小,并要求用户输入矩阵的值,但后来我不知道如何从这里继续前进。

正如我猜我的下一步是应用Cramer的规则并得到答案,但我不知道如何。This is the step I'm missing。请有人帮帮我吗?

3 个答案:

答案 0 :(得分:0)

首先,你需要计算你的方程系统矩阵的行列式 - 即矩阵,它由系数组成(从方程的左边) - 让它 D

然后,要计算某个变量的值,需要取系统的矩阵(从上一步开始),用常数项(从右侧)替换相应列的系数,计算结果矩阵的决定因素 - 让它为 C ,并将 C 除以 D

关于上一步替换的更多信息:比如说,你的矩阵是3x3(如图中所示) - 所以,你有一个方程组,其中每个 a 系数乘以 x ,每 b - 按 y ,每 c z d 是不变的术语。因此,要计算 y ,在这种情况下替换那些乘以 y - b 的系数,其中 d

您为每个变量执行第二步,系统就会得到解决。

答案 1 :(得分:0)

您可以在https://rosettacode.org/wiki/Cramer%27s_rule#C中找到一个示例 虽然具体示例涉及4X4矩阵,但代码的编写是为了适应任何大小的方阵。

答案 2 :(得分:0)

您需要的是计算行列式。 Cramer的规则仅适用于NxN矩阵的行列式

如果N不大,你可以使用Cramer的规则(见下面的代码),这非常简单。但是,这种方法效率不高;如果您的N很大,则需要采用其他方法,例如lu decomposition

假设您的数据是双倍的,结果可以保持双倍。

#include <malloc.h>
#include <stdio.h>
double det(double * matrix, int n) {
    if( 1 >= n ) return matrix[ 0 ];
    double *subMatrix = (double*)malloc(( n - 1 )*( n - 1 ) * sizeof(double));
    double result = 0.0;
    for( int i = 0; i < n; ++i ) {
        for( int j = 0; j < n - 1; ++j ) {
            for( int k = 0; k < i; ++k )
                subMatrix[ j*( n - 1 ) + k ] = matrix[ ( j + 1 )*n + k ];
            for( int k = i + 1; k < n; ++k )
                subMatrix[ j*( n - 1 ) + ( k - 1 ) ] = matrix[ ( j + 1 )*n + k ];
        }
        if( i % 2 == 0 )
            result += matrix[ 0 * n + i ] * det(subMatrix, n - 1);
        else
            result -= matrix[ 0 * n + i ] * det(subMatrix, n - 1);
    }
    free(subMatrix);
    return result;
}

int main() {
    double matrix[ ] = { 1,2,3,4,5,6,7,8,2,6,4,8,3,1,1,2 };
    printf("%lf\n", det(matrix, 4));
    return 0;
}