tianxiezhi 2015-07-25 12:41 采纳率: 50%
浏览 1875
已采纳

请教:如果用visual c++进行高斯消元法求解呢?

请教下大家,如何用visual c++进行高斯消元法求解呢?谢谢!

  • 写回答

2条回答 默认 最新

  • threenewbee 2015-07-25 15:10
    关注
    列选主元消元法
    /*
    *Gauss.cpp
    *功能:列选主元消元法 课本3.5为例
    *时间:2013.4.1
    */
    #include<stdio.h>
    #include"Gass.h"
    
    //高斯消元法(列选主元)
    void Gauss (double a[][MAXNUM],int n)
    {
        int i,j;
        SelectColE(a,n);   //列选主元并消元成上三角
        //回代求解
        printf("上三角的结果\n");
        printM(a,3);
        for(i=n;i>=1;i--)
        {
            for(j=i+1;j<=n;j++)
                a[i][n+1]-=a[i][j]*a[j][n+1];
            a[i][n+1]/=a[i][i];
        }
        return ;
    }
    //选择列主元并进行消元
    void SelectColE(double a[][MAXNUM],int n)
    {
        int i,j,k,maxRowE;
        double temp; //用于记录消元时的因数
        for(j=1;j<=n;j++)
        {
            maxRowE=j;
            for(i=j;i<=n;i++)
                if(fabs(a[i][j])>fabs(a[maxRowE][j]))
                    maxRowE = i;
            if(maxRowE!=j)
                swapRow(a,j,maxRowE,n);   //与最大主元所在行交换
            //消元
            for(i=j+1;i<=n;i++)
            {
                temp =a[i][j]/a[j][j];
                for(k=j;k<=n+1;k++)
                    a[i][k]-=a[j][k]*temp;
            }
            printf("第%d列消元后:\n",j);
            printM(a,3);
        }
        return;
    }
    void swapRow(double a[][MAXNUM],int m,int maxRowE,int n)
    {
        int k;
        double temp;
        for(k=m;k<=n+1;k++)
        {
            temp = a[m][k];
            a[m][k] = a[maxRowE][k];
            a[maxRowE][k] = temp;
        }
        return ;
    }
    
    //测试函数
    int main()
    {
        double a[4][MAXNUM];
    
        int i,n,j;
    
        a[1][1] = 0.001; a[1][2]=2.000;a[1][3]=3.000;a[1][4]=1.000;
        a[2][1] = -1.000;a[2][2]=3.712;a[2][3]=4.623;a[2][4]=2.000;
        a[3][1] = -2.000;a[3][2]=1.070;a[3][3]=5.643;a[3][4]=3.000;
        Gauss (a,3);
        for(i=1;i<=3;i++)
            printf("X%d=%f\n",i,a[i][4]);
        return 0;
    }
    //输出矩阵
    void printM(double a[][MAXNUM], int n)
    {
       int i,j;
       for(i=1;i<=n;i++)
        {
            for(j=1;j<=n+1;j++)
            {
                printf("%f ,",a[i][j]);
            }
            printf("\n");
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于#flink#的问题:关于docker部署flink集成hadoop的yarn,请教个问题flink启动yarn-session.sh连不上hadoop
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题