鱼C论坛

 找回密码
 立即注册
查看: 1021|回复: 1

[已解决]高斯消去法解线性方程组(c语言)

[复制链接]
发表于 2020-12-27 08:57:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
搞不明白,有大佬可以稍微解答一下吗,就是大致思路
最佳答案
2020-12-27 09:46:52
#include <stdio.h>
#define _PARAM        (5)

/*
原方程:5元1次方程组
        (1):        a0*X1 + b0*X2 + c0*X3 + d0*X4 + e0*X5 = f0
        (2):        a1*X1 + b1*X2 + c1*X3 + d1*X4 + e1*X5 = f1
        (3):        a2*X1 + b2*X2 + c2*X3 + d2*X4 + e2*X5 = f2
        (4):        a3*X1 + b3*X2 + c3*X3 + d3*X4 + e3*X5 = f3
        (5):        a4*X1 + b4*X2 + c4*X3 + d4*X4 + e4*X5 = f4
第一步:消除未知数 X1
        (2) * a0 / a1 - (1) 得4元1次方程组
        (1): (b1 * (a0/a1) - b0)*X2 + (c1 * (a0/a1) - c0)*X3 + (d1 * (a0/a1) - d0)*X4 + (e1 * (a0/a1) - e0)*X2 = f1 * (a0/a1) - f0
        (2): (b2 * (a0/a2) - b0)*X2 + (c2 * (a0/a2) - c0)*X3 + (d2 * (a0/a2) - d0)*X4 + (e2 * (a0/a2) - e0)*X2 = f2 * (a0/a2) - f0
        (3): (b3 * (a0/a3) - b0)*X2 + (c3 * (a0/a3) - c0)*X3 + (d3 * (a0/a3) - d0)*X4 + (e3 * (a0/a3) - e0)*X2 = f3 * (a0/a3) - f0
        (4): (b4 * (a0/a4) - b0)*X2 + (c4 * (a0/a4) - c0)*X3 + (d4 * (a0/a4) - d0)*X4 + (e4 * (a0/a4) - e0)*X2 = f4 * (a0/a4) - f0
第二步: 同理消除未知数 X2
        .....
        最后只剩未知数 X4 = n 一元一次方程

第三步:将求得的X4,一步一步回代,分别求出X3,X2,X1,X0
*/

int main()
{
        int i,j,k;
        int n = _PARAM;
        double temp = 0;
        double param[_PARAM][_PARAM+1] =
        {
                {101,97,86,74,55,145},
                {86,79,123,119,87,117},
                {96,129,136,97,64,92},
                {158,201,158,124,131,224},
                {76,102,95,53,111,135}
        };

        double parameter[_PARAM][_PARAM+1];
        double Result_x[_PARAM] ={0};
        
        for(i=0 ; i<n ; i++)
        {
                for(j=0; j<=n ; j++)
                {
                        parameter[i][j] = param[i][j];
                }
        }

        //消元
        for(i=0; i<n; i++)
        {
                for(j=i ; j<n ; j++)
                {
                        for(k=i+1; k<=n; k++)
                        {
                                parameter[j][k] /= parameter[j][i];
                                
                                if(j > i)
                                {
                                        parameter[j][k] -= parameter[i][k];
                                }
                        }
                }
        }
        
        //回代
        for(i=n-1; i>=0 ; i--)
        {
                temp = 0.0;
                
                for(j=n-1 ; j>i; j--)
                {
                        temp += Result_x[j] * parameter[i][j];
                }
                
                Result_x[i] = parameter[i][n] - temp;
        }
        
        //输出结果及验算
        for(i=0 ; i<n ; i++)
        {
                printf("X%d=%f,",i,Result_x[i]);
                temp = 0;
                for(j=0 ; j<n ; j++)
                {
                        temp = temp + param[i][j] * Result_x[j];
                }
                //temp = 0 证明解正确
                temp -= param[i][j];
                printf("temp=%f\n",temp);
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-27 09:46:52 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#define _PARAM        (5)

/*
原方程:5元1次方程组
        (1):        a0*X1 + b0*X2 + c0*X3 + d0*X4 + e0*X5 = f0
        (2):        a1*X1 + b1*X2 + c1*X3 + d1*X4 + e1*X5 = f1
        (3):        a2*X1 + b2*X2 + c2*X3 + d2*X4 + e2*X5 = f2
        (4):        a3*X1 + b3*X2 + c3*X3 + d3*X4 + e3*X5 = f3
        (5):        a4*X1 + b4*X2 + c4*X3 + d4*X4 + e4*X5 = f4
第一步:消除未知数 X1
        (2) * a0 / a1 - (1) 得4元1次方程组
        (1): (b1 * (a0/a1) - b0)*X2 + (c1 * (a0/a1) - c0)*X3 + (d1 * (a0/a1) - d0)*X4 + (e1 * (a0/a1) - e0)*X2 = f1 * (a0/a1) - f0
        (2): (b2 * (a0/a2) - b0)*X2 + (c2 * (a0/a2) - c0)*X3 + (d2 * (a0/a2) - d0)*X4 + (e2 * (a0/a2) - e0)*X2 = f2 * (a0/a2) - f0
        (3): (b3 * (a0/a3) - b0)*X2 + (c3 * (a0/a3) - c0)*X3 + (d3 * (a0/a3) - d0)*X4 + (e3 * (a0/a3) - e0)*X2 = f3 * (a0/a3) - f0
        (4): (b4 * (a0/a4) - b0)*X2 + (c4 * (a0/a4) - c0)*X3 + (d4 * (a0/a4) - d0)*X4 + (e4 * (a0/a4) - e0)*X2 = f4 * (a0/a4) - f0
第二步: 同理消除未知数 X2
        .....
        最后只剩未知数 X4 = n 一元一次方程

第三步:将求得的X4,一步一步回代,分别求出X3,X2,X1,X0
*/

int main()
{
        int i,j,k;
        int n = _PARAM;
        double temp = 0;
        double param[_PARAM][_PARAM+1] =
        {
                {101,97,86,74,55,145},
                {86,79,123,119,87,117},
                {96,129,136,97,64,92},
                {158,201,158,124,131,224},
                {76,102,95,53,111,135}
        };

        double parameter[_PARAM][_PARAM+1];
        double Result_x[_PARAM] ={0};
        
        for(i=0 ; i<n ; i++)
        {
                for(j=0; j<=n ; j++)
                {
                        parameter[i][j] = param[i][j];
                }
        }

        //消元
        for(i=0; i<n; i++)
        {
                for(j=i ; j<n ; j++)
                {
                        for(k=i+1; k<=n; k++)
                        {
                                parameter[j][k] /= parameter[j][i];
                                
                                if(j > i)
                                {
                                        parameter[j][k] -= parameter[i][k];
                                }
                        }
                }
        }
        
        //回代
        for(i=n-1; i>=0 ; i--)
        {
                temp = 0.0;
                
                for(j=n-1 ; j>i; j--)
                {
                        temp += Result_x[j] * parameter[i][j];
                }
                
                Result_x[i] = parameter[i][n] - temp;
        }
        
        //输出结果及验算
        for(i=0 ; i<n ; i++)
        {
                printf("X%d=%f,",i,Result_x[i]);
                temp = 0;
                for(j=0 ; j<n ; j++)
                {
                        temp = temp + param[i][j] * Result_x[j];
                }
                //temp = 0 证明解正确
                temp -= param[i][j];
                printf("temp=%f\n",temp);
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表