【算法】高斯算法(1)

高斯算法(1)
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
void max_ele(double af[][21],int n,int k) /* 选主元 */
 {double max1,t;
   int i,j;
   max1=af[k][k]; i=k;
   for (j=k+1;j<=n;j++)
     if(fabs(af[j][k])>fabs(max1)) i=j;
   if(i>k)
     for (j=k;j<=n+1;j++)
       {t=af[i][j],af[i][j]=af[k][j],af[k][j]=t;}
 }
int gauss(double a[][20],double f[],double x[],int n)
/* Guass 消去法,引入af[20[21],x[]是为了不改变矩阵a[][],f[]
   及简化程序 */
 {int i,j,k;
 double af[20][21],del,t;
 for(i=1;i<=n;i++)
    { for(j=1;j<=n;j++) af[i][j]=a[i][j];
      af[i][n+1]=f[i];
    }
 for (k=1;k<n;k++)
    { max_ele(af,n,k);
      del=af[k][k];
      if (fabs(del)<1e-7)
       {printf("Single! press any key return.../n");
        getchar();
        return 0;}
      for (j=k;j<=n+1;j++) af[k][j]/=del;
      for (i=k+1;i<=n;i++)
       { t=af[i][k];
        for (j=k;j<=n+1;j++)
           af[i][j]-=af[k][j]*t;
       }
     }
 del=af[n][n];
 for (j=n;j<=n+1;j++) af[n][j]/=del;
 for (j=1;j<=n;j++) x[j]=af[j][n+1];
 for (i=n-1;i>0;i--)
    for (j=n;j>i;j--) x[i]-=x[j]*af[i][j];
 return 1;
 }
void test1()
 /* 检验 Guass消去法 */
 { double a[20][20], f[20],x[20];
   int i,j,n;
   printf("Input n(<20)");
   scanf("%d",&n);
   /* 随机生成系数矩阵及右端项,进行检验 */
   for (i=1;i<=n;i++)
      for (j=1;j<=n;j++) a[i][j]=(float)rand()/100.0;
   for (i=1;i<=n;i++)
     { for (j=1;j<=n;j++) printf("%8.4f ",a[i][j]);
       printf("/n");}
   for (i=1;i<=n;i++)
     { f[i]=0;
       for (j=1;j<=n;j++) f[i]+=a[i][j];
      }
   gauss(a,f,x,n);
   printf("the system solution is:/n");
   for (i=1;i<=n;i++) printf("%lf ",x[i]);
   printf("/n");
 }
int inver(double a[20][20],double e[20][20],int n)
 /* 用追赶法求三对角阵 a[][] 的逆 */
 {double ae[20][40],gamma,del;
 int i,j;
 gamma=-a[2][1];
 for (i=1;i<=n;i++)
    {for (j=1;j<=n;j++)
      { ae[i][j]=a[i][j]; ae[i][n+j]=0; }
      ae[i][n+i]=1;
     }
 for(i=1;i<=n-1;i++)
    {if((del=ae[i][i])==0) return 0;
     for (j=i;j<=n*2;j++)
       { ae[i][j]/=del; ae[i+1][j]+=ae[i][j]*gamma; }
     }
 del=ae[n][n];
 for(j=n;j<=n*2;j++)
    ae[n][j]/=del;
 for(i=1;i<=n;i++)
    {for (j=1;j<=2*n;j++)
       printf("%8.4f ",ae[i][j]);
    printf("/n");
    }
 for(i=n;i>1;i--)
    { del=ae[i-1][i];
      for (j=i;j<=n*2;j++)
       ae[i-1][j]-=ae[i][j]*del;
     }
 for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
      e[i][j]=ae[i][n+j];
 return 1;
 }
void mult(double a[][20],double e[][20],double f[][20],int n)
 {double s;
 int i,j,k;
 for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
      { s=0;
       for (k=1;k<=n;k++)
        s+=a[i][k]*e[k][j];
       if (fabs(s)<1e-7) s=fabs(s);
       f[i][j]=s;
      }
 }
void minus(double a[][20],double b[][20],double c[][20],int n)
 {int i,j;
 for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
      c[i][j]=a[i][j]-b[i][j];
 }
main()
{
 int i,j,n,m;
 double gamma,beta,beta1,a[20][20],b[20][20],c[20][20],d[20][20],
       e[20][20],f[20][20],deltag,deltax;
 double gx[20]={0,1,0,1,0,-1}, r[20][20],x[20];
 printf("请输入主梁数目,gamma,beta,beta1:/n");
 scanf("%d,%lf,%lf,%lf",&n,&gamma,&beta,&beta1);
 m=n-1;
 for (i=1;i<=m;i++)
   for (j=1;j<=m;j++)
     a[i][j]=b[i][j]=c[i][j]=d[i][j]=0;
 deltag=2*(1+gamma+beta);
 deltax=2*(gamma+3*beta1);
 printf("%8.4f %8.4f/n",deltag,deltax);
 for (i=1;i<=m;i++)
 { a[i][i]=deltax;
    b[i][i]=deltag;}
 for (i=1;i<=m-1;i++)
 { a[i][i+1]=a[i+1][i]=-gamma;
    b[i][i+1]=b[i+1][i]=gamma-1;
    c[i][i+1]=d[i+1][i]=gamma;
    c[i+1][i]=d[i][i+1]=-gamma;}
 inver(a,e,m);
 for (i=1;i<=m;i++)
   { for (j=1;j<=m;j++)
     printf("%6.3f ", e[i][j]);
     printf("/n"); }
 mult(c,e,f,m);
 mult(f,d,e,m);
 minus(b,e,r,m);
 gauss(r,gx,x,m);
 printf("The result is:/n");
 for (j=1;j<=m;j++)
   printf("%8.4f ", x[j]);
 printf("/n");
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值