高斯消去解非齐次线性方程组

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
// typedef struct 
// {
//     int (*Matrix)
//     /* data */
// }Equation_Typedef;


    double Solve_Matrix_1[][10]={
                                4 , 2 , -3 , -1 , 2 , 1 , 0 , 0 , 0 , 0 ,
                                8 , 6 , -5 , -3 , 6 , 5 , 0 , 1 , 0 , 0 ,
                                4 , 2 , -2 , -1 , 3 , 2 , -1 , 0 , 3 , 1 ,
                                0 , -2 , 1 , 5 , -1 , 3 , -1 , 1 , 9 , 4 ,
                                -4 , 2 , 6 , -1 , 6 , 7 , -3 , 3 , 2 , 3 ,
                                8 , 6 , -8 , 5 , 7 , 17 , 2 , 6 , -3 , 5 ,
                                0 , 2 , -1 , 3 , -4 , 2 , 5 , 3 , 0 , 1 ,
                                16 , 10 , -11 , -9 , 17 , 34 , 2 , -1 , 2 , 2 ,
                                4 , 6 , 2 , -7 , 13 , 9 , 2 , 0 , 12 , 4 ,
                                0 , 0 , -1 , 8 , -3 , -24 , -8 , 6 , 3 , -1
                            };
    double B_1[]={5,12,3,2,3,46,13,38,19,-21};
    double Solve_Matrix_2[][8]={
                                4, 2, -4, 0, 2, 4, 0, 0 , 
                                2, 2, -1, -2, 1, 3, 2, 0 , 
                                -4, -1, 14, 1, -8, -3, 5, 6 , 
                                0, -2, 1, 6, -1, -4, -3, 3 , 
                                2, 1, -8, -1, 22, 4, -10, -3 , 
                                4, 3, -3, -4, 4, 11, 1, -4 , 
                                0, 2, 5, -3, -10, 1, 14, 2 , 
                                0, 0, 6, 3, -3, -4, 2, 19
                            };
    double B_2[]={0,-6,20,23,9,-22,-15,45};
    double Solve_Matrix_3[][10]={
                                4,-1,0,0,0,0,0,0,0, 0,
                                -1,4,-1,0,0,0,0,0,0,0,
                                0,-1,4,-1,0,0,0,0,0,0,
                                0,0,-1,4,-1,0,0,0,0,0,
                                0,0,0,-1,4,-1,0,0,0,0,
                                0,0,0,0,-1,4,-1,0,0,0,
                                0,0,0,0,0,-1,4,-1,0,0,
                                0,0,0,0,0,0,-1,4,-1,0,
                                0,0,0,0,0,0,0,-1,4,-1,
                                0,0,0,0,0,0,0,0,-1,4
                                };
    double B_3[]={7,5,-13,2,6,-12,14,-4,5,-5};


void Gauss(void *Matrix,double *B,int Order)
{
    double *X = malloc(sizeof(double)*Order);
    for(int i = 0;i<Order-1;i++)
    {
        for(int j = i+1;j<Order;j++)
        {
            double k = ((double (*)[Order])Matrix)[j][i]/((double (*)[Order])Matrix)[i][i];
            for(int m = i;m<Order;m++)
            {
                ((double (*)[Order])Matrix)[j][m]-= k*((double (*)[Order])Matrix)[i][m];
            }
            B[j] -=k*B[i];
        }
    }
    for(int i = Order-1;i>=0;i--)
    {
        double Tmp = 0;
        for(int j = Order-1;j>i;j--)
        {
            Tmp += X[j]*((double (*)[Order])Matrix)[i][j];
        }
        X[i] = (B[i]-Tmp)/((double (*)[Order])Matrix)[i][i];
    }
    printf("X = [");
    for(int i = 0;i<Order;i++)
    {
        printf(" %.5lf",X[i]);
    }
    printf("]\n");
    free(X);
}

int main(int arg)
{
    Gauss((void*)Solve_Matrix_1,B_1,10);
    Gauss((void*)Solve_Matrix_2,B_2,8);
    Gauss((void*)Solve_Matrix_3,B_3,10);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 高斯消元法可以用来求解非齐次线性方程组,具体步骤如下: 1. 将系数矩阵 $A$ 和常数矩阵 $B$ 合并成增广矩阵 $[A|B]$,其中 $|$ 表示矩阵的列分隔符。 2. 利用初等变换,把增广矩阵 $[A|B]$ 化为行阶梯形矩阵 $[U|C]$,其中 $U$ 是系数矩阵的行阶梯形矩阵,$C$ 是常数矩阵的相应变换。 3. 回带求解线性方程组。从最后一行开始,利用 $U$ 矩阵的非零元素逐行回代求解,得到未知量 $x_1,x_2,\cdots,x_n$ 的值。 下面是 C++ 代码实现: ```c++ #include <iostream> #include <cmath> using namespace std; const int MAXN = 100; int n; double a[MAXN][MAXN+1]; void gauss() { for (int i = 1; i <= n; i++) { int k = i; for (int j = i+1; j <= n; j++) { if (abs(a[j][i]) > abs(a[k][i])) { k = j; } } if (k != i) { for (int j = i; j <= n+1; j++) { swap(a[i][j], a[k][j]); } } for (int j = i+1; j <= n; j++) { double t = a[j][i] / a[i][i]; for (int k = i+1; k <= n+1; k++) { a[j][k] -= t * a[i][k]; } } } for (int i = n; i >= 1; i--) { for (int j = i+1; j <= n; j++) { a[i][n+1] -= a[i][j] * a[j][n+1]; } a[i][n+1] /= a[i][i]; } } int main() { cout << "请输入方程组的未知数个数:"; cin >> n; cout << "请输入增广矩阵:\n"; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n+1; j++) { cin >> a[i][j]; } } gauss(); cout << "方程组的解为:"; for (int i = 1; i <= n; i++) { cout << a[i][n+1] << " "; } cout << endl; return 0; } ``` 上述代码中,数组 `a` 存储增广矩阵,函数 `gauss()` 实现高斯消元法,最后输出方程组的解。 ### 回答2: 高斯消去法是一种用于求解线性方程组的方法,可以求解齐次和非齐次线性方程组。首先,我们将待求解的非齐次线性方程组写成增广矩阵的形式,其中最后一列表示方程组的常数项。 高斯消去法的基本思想是通过消元操作将方程组化为上三角矩阵,再通过回代求解出未知数。具体步骤如下: 1. 初等行变换:将增广矩阵中的第一行作为主元,通过乘以一个系数,使得主元的值为1。然后,用这个主元的值去消去下面的行中对应的元素,使得下面的行的该列的值为0。 2. 重复以上步骤,将第二行作为主元,消去下面的行中对应元素,依次类推,直到将矩阵化为上三角矩阵。 3. 回代求解:从最后一行开始,将已知的上一行的未知数代入到方程中,逐步求解得到所有未知数的值。 需要注意的是,在实际求解过程中,可能会遇到主元为0或非唯一解的情况,这称为消元过程中的奇异性。对于奇异性,我们需要进行特殊处理。 总结来说,高斯消去法是通过逐步消元,将线性方程组化为上三角形式,再通过回代求解未知数的值。这种方法简单易行,在实际应用中得到广泛使用。 ### 回答3: 高斯消去法是一种常用的求解线性方程组的方法,可以用来解非齐次线性方程组。非齐次线性方程组可以表示为Ax=b,其中A是一个系数矩阵,x是未知向量,b是常数向量。 高斯消去法的基本思想是通过消元操作将方程组转化为一个上三角矩阵,并利用回代求解方程组。 具体步骤如下: 1. 将增广矩阵[A|b]化为上三角矩阵。从第一行开始,将该行的第一个元素(即主元)除以主元的系数,得到该行的系数化为1。接着,用该行的倍数消去下面的行的第一个元素,使得下面行的第一个元素全部变为0。 2. 重复上述操作,依次将主元下方的元素消为0。即对第i行,将其下方各行的第i个元素消为0。 3. 得到上三角矩阵后,进行回代求解。从最后一行开始,根据已知的未知数,将其带入前面的方程进行求解,最后得到全部的未知数的解。 需要注意的是,在进行高斯消去法的过程中,可能会出现主元为0的情况。这时需要进行行交换操作,将非零主元移到对应的位置上。 总结来说,高斯消去法通过消元操作将非齐次线性方程组转化为上三角形矩阵,然后利用回代求解得到方程组的解。这是一种常用且较为高效的求解方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值