(C语言)编写解n阶方程组的列主元Gauss消去法的通用程序

一、题目

二、解法

main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "matrix_solve.h"

#endif

main.c

#include "main.h"

int main(void)
{
    double matrix_A[][9] = {{31, -13, 0, 0, 0, -10, 0, 0, 0},
							{-13, 35, -9, 0, -11, 0, 0, 0, 0},
							{0, -9, 31, -10, 0, 0, 0, 0, 0},
							{0, 0, -10, 79, -30, 0, 0, 0, -9},
							{0, 0, 0, -30, 57, -7, 0, -5, 0},
							{0, 0, 0, 0, -7, 47, -30, 0, 0},
							{0, 0, 0, 0, 0, -30, 41, 0, 0},
							{0, 0, 0, 0, -5, 0, 0, 27, -2},
							{0, 0, 0, -9, 0, 0, 0, -2, 29}};
    double matrix_b[9] = {-15, 27, -23, 0, -20, 12, -7, 7, 10};
    
    Matrix_Solve.matrix_A = (double *)matrix_A;
    Matrix_Solve.matrix_b = matrix_b;
    Matrix_Solve.N = sizeof(matrix_b) / sizeof(matrix_b[0]);
    
    Matrix_Solve.matrix_x = Matrix_Solve.solve_matrix(Matrix_Solve.matrix_A, Matrix_Solve.matrix_b, Matrix_Solve.N);

    for(int i = 0; i < Matrix_Solve.N; i++)
    {
        printf("%.5f\r\n", Matrix_Solve.matrix_x[i]);
    }

    free(Matrix_Solve.matrix_x);
    
    getchar();

    return 0;
}

matrix_solve.h

#ifndef __MATRIX_SOLVE_H__
#define __MATRIX_SOLVE_H__

typedef struct 
{
    double* matrix_A;
    double* matrix_b;
    double* matrix_x;
    int N;
    double* (*solve_matrix)(double*, double*, int);
} Matrix_Solve_t;

extern Matrix_Solve_t Matrix_Solve;

#endif

matrix_solve.c

#include "main.h"

static double* solve_matrix(double*, double*, int);

Matrix_Solve_t Matrix_Solve = {NULL, NULL, NULL, 0, solve_matrix};

static double* solve_matrix(double* matrix_A, double* matrix_b, int N)
{
    int i = 0, j = 0, k = 0;
    double Max = 0, Temp = 0, l = 0, y = 0;
    int Max_k = 0;

    double* matrix_A_extend;
    matrix_A_extend = (double *)malloc(N * (N+1) * sizeof(double));
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            matrix_A_extend[i*(N+1)+j] = matrix_A[i*N+j];
        }
        matrix_A_extend[i*(N+1)+N] = matrix_b[i];
    }

    for(i = 0; i < N - 1; i++)
    {
        Max = matrix_A_extend[i*(N+1)+i];
        Max_k = i;

        for(k = i + 1; k < N; k++)
        {
            if(matrix_A_extend[k*(N+1)+i] > Max)
            {
                Max = matrix_A_extend[k*(N+1)+i];
                Max_k = k;
            }
        }
 
        if(Max_k != i)
        {
            for(j = i; j < N + 1; j++)
            {
                Temp = matrix_A_extend[i*(N+1)+j];
                matrix_A_extend[i*(N+1)+j] = matrix_A_extend[Max_k*(N+1)+j];
                matrix_A_extend[Max_k*(N+1)+j] = Temp;
            }
        }

        for(k = i + 1; k < N; k++)
        {
            l = matrix_A_extend[k*(N+1)+i] / matrix_A_extend[i*(N+1)+i];
            for(j = i; j < N + 1; j++)
            {
                matrix_A_extend[k*(N+1)+j] -= (l * matrix_A_extend[i*(N+1)+j]);
            }
        }

    }

    double* matrix_x;
    matrix_x  = (double *)malloc(N*sizeof(double));
    matrix_x[N-1] = matrix_A_extend[(N-1)*(N+1)+N] / matrix_A_extend[(N-1)*(N+1)+N-1];

    if(N > 1)
    {
        for(i = N - 2; i >= 0; i--) 
        {
            y = matrix_A_extend[i*(N+1)+N];
            for(j = i + 1; j < N; j++)
            {
                y -= matrix_A_extend[i*(N+1)+j] * matrix_x[j]; 
            }
            matrix_x[i] = y / matrix_A_extend[i*(N+1)+i];
        }
    }
    
    free(matrix_A_extend);
    
    return matrix_x;
}

三、运行结果

 四、小结

C语言中一般将二维数组传给函数时,不能省略第二维的长度。但可以巧妙地将二维数组作为一维数组处理来解决这个问题。同样的方法也可以用在将二维数组作为结构体成员中。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个用C语言编写的实现列主元高斯消去法程序: ```c #include <stdio.h> #define N 3 void gaussianElimination(float matrix[N][N+1]) { int i, j, k; float factor, temp; for(i=0; i<N; i++) // 选择列主元 { for(j=i+1; j<N; j++) { if(matrix[i][i] < matrix[j][i]) { for(k=0; k<=N; k++) { temp = matrix[i][k]; matrix[i][k] = matrix[j][k]; matrix[j][k] = temp; } } } // 消元 for(j=i+1; j<N; j++) { factor = matrix[j][i] / matrix[i][i]; for(k=0; k<=N; k++) { matrix[j][k] -= factor * matrix[i][k]; } } } // 回代求 float solutions[N]; for(i=N-1; i>=0; i--) { solutions[i] = matrix[i][N] / matrix[i][i]; for(j=i-1; j>=0; j--) { matrix[j][N] -= matrix[j][i] * solutions[i]; } } printf("为:"); for(i=0; i<N; i++) { printf("%.2f ", solutions[i]); } } int main() { float matrix[N][N+1] = {{2, -3, 1, -2}, {-4, 7, 2, 3}, {3, -5, -2, 7}}; gaussianElimination(matrix); return 0; } ``` 这个程序实现了列主元高斯消去法的算法。先选择主元(本程序选择列主元),然后进行消元,将矩阵转化为上三角矩阵。然后进行回代求,得到方程组。最后输出。在示例中,使用3x3的矩阵,并将矩阵的最后一列用于存储方程组的右侧常数,通过调用`gaussianElimination`函数来计算方程组。 ### 回答2: 下面是一个用C语言编写列主元高斯消去法程序: ```c #include <stdio.h> #define N 3 void gauss_elimination(float matrix[N][N + 1]) { int i, j, k; // 高斯消去法的消去过程 for (i = 0; i < N - 1; i++) { // 如果列主元为0,则进行行变换 if (matrix[i][i] == 0) { for (j = i + 1; j < N; j++) { if (matrix[j][i] != 0) { for (k = 0; k < N + 1; k++) { float temp = matrix[i][k]; matrix[i][k] = matrix[j][k]; matrix[j][k] = temp; } break; } } } // 消去操作 for (j = i + 1; j < N; j++) { float factor = matrix[j][i] / matrix[i][i]; for (k = 0; k < N + 1; k++) { matrix[j][k] -= factor * matrix[i][k]; } } } // 回代求 float solution[N]; for (i = N - 1; i >= 0; i--) { solution[i] = matrix[i][N]; for (j = N - 1; j > i; j--) { solution[i] -= matrix[i][j] * solution[j]; } solution[i] /= matrix[i][i]; } // 输出结果 printf("方程组为:\n"); for (i = 0; i < N; i++) { printf("x%d = %.2f\n", i + 1, solution[i]); } } int main() { // 输入增广矩阵 float matrix[N][N + 1]; printf("请输入方程组的增广矩阵:\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N + 1; j++) { scanf("%f", &matrix[i][j]); } } // 调用高斯消去函数 gauss_elimination(matrix); return 0; } ``` 该程序首先使用`gauss_elimination`函数实现了列主元高斯消去法的消去和回代过程。然后在`main`函数中,用户可以输入方程组的增广矩阵,然后调用`gauss_elimination`函数来求方程组,并输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值