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 聚类分析或者python进行数据分析
  • ¥15 如何用visual studio code实现html页面
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?