选主元高斯消去法

#include<stdio.h>
#include<math.h>

double a[10][10];
double b[10];

int max_i(int i, int n){
    int ans = i;
    int tmp_i;
    double ans_val=fabs(a[i][i]);
    for ( tmp_i=i+1;tmp_i<=n;tmp_i++){
        if(fabs(a[tmp_i][i])>ans_val){
            ans_val=fabs(a[tmp_i][i]);//换主元
            ans = tmp_i;
        }
    }
    return ans;//第i行的主元在第ans列
}

void swap(int i, int j, int n){
    double k;
    int tmp;
    for(tmp = 1; tmp<=n; tmp++){
        k=a[i][tmp];
        a[i][tmp]=a[j][tmp];//第i行和第j行的所有元素进行交换
        a[j][tmp]=k;
    }
}

int main()
{
    int i,j,m,p;
    int k=1;
    int n;
    double x[10];
    double temp1;
    double temp[10];
    double sum[10]={};
    printf("请输入n的值:");
    scanf("%d",&n);
    printf("\n");
    printf("请输入系数矩阵:\n");
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            scanf("%lf",&a[i][j]);
        }
    }
    printf("\n");
    printf("请输入b[i]:\n");
    for(i=1;i<=n;i++)
    {
        scanf("%lf",&b[i]);
    }
    printf("\n");

    for(i=1;i<=n;i++) //选主元素
    {
        int max_num = max_i(i, n);//第i行的最大值
        swap(max_num,i,n);
        double c;
        c=b[i];
        b[i]=b[max_num];//b也相应的交换
        b[max_num]=c;
    //消元
    int col;
    for(col=i+1;col<=n ;col++)//把a[i][i]的系数化为1
    {
        a[i][col]=a[i][col]/a[i][i];
    }
    b[i]=b[i]/a[i][i];
    a[i][i]=1;
    int row,col2;
    for(row=i+1;row<=n;row++)
        {
            b[row]=b[row]/a[row][i]-b[i];
            for(col2=1;col2<=n;col2++)
            {
                if(col2!=i)
                a[row][col2]=a[row][col2]/a[row][i]-a[i][col2];
                printf("%f ",a[row][col2]);
            }
            printf("\n");
            a[row][i]=0;
        }
        int k,j1;
        for(k=1;k<=n;k++) //输出消元之后的系数矩阵
      {
        for(j1=1;j1<=n;j1++)
        {
            printf("%lf\t",a[k][j1]);
        }
        printf("%lf",b[k]);
        printf("\n");
      }
      printf("\n");
    }
    x[n]=b[n]/a[n][n]; //回代
    for(i=n-1;i>=1;i--)
    {
        for(j=i+1;j<=n;j++)
        {
            sum[i]=sum[i]+a[i][j]*x[j];
        }
        x[i]=b[i]-sum[i];
    }
    printf("结果为:\n");
    for(i=1;i<=n;i++)
    {
        printf("x[%d]=%f\n",i,x[i]);
    }
    return 0;
}

  不好意思代码有点多,但是主要看主函数里面它是怎么 “每选一个主元就消去一个元素的”,还有max_i函数,然后再看看swap函数(将i行和j行的所有元素交换)。还有一个小技巧,就是从上往下消去的时候,左下三角元素都变成0了,以后就不必处理左下三角的元素了,所以col从i+1开始。

 一开始做实验的时候想错了,以为是全部转化成对角占优阵再进行消元,其实不是的,是在转化的同时,同步消去的。

实验结果:

大家如果看不懂,不要怕麻烦,可以自己手动计算一下过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值