高斯消去法

ExpandedBlockStart.gif 代码
#include  " stdio.h "
#include 
" math.h "
#include 
" stdlib.h "
typedef 
double  arrtype;
// 高斯消去法
void  GuassScale(arrtype coff[], int  n,arrtype  * =  NULL, int  m  =   1 )
{
int  col  =  n  +  m;
arrtype 
* =   new  arrtype[n];
int   * nrow  =   new   int [n];
arrtype 
* base   =  coff;
for ( int  i  =   0 ; i < n;i ++ )
{
  s[i] 
=   0 ;
  
for ( int  j  =   0 ;j < n;j ++ )
  {
   arrtype t 
=  fabs(coff[i * col  +  j]);
   
if (s[i]  <  t)
    s[i] 
=  t;
  }
  nrow[i] 
=  i;
}
for (i = 0 ;i < n - 1 ;i ++ )
{
  
int  p  =  i;
  arrtype t 
=  fabs(coff[nrow[p] * col + i]) / s[nrow[p]];
  
for ( int  j =  i + 1 ;j < n;j ++ )
  {
   arrtype temp
=  fabs(coff[nrow[j] * col + i]) / s[nrow[j]];
   
if (t < temp)
   {
    t
= temp;
    p
= j;
   }    
  }
  
if (coff[nrow[p] * col + i] == 0 )
   
return ;
  
if (nrow[p] != nrow[i])
  {
   
int  ncopy  =  nrow[i];
   nrow[i] 
=  nrow[p];
   nrow[p] 
= ncopy;
  }
  
for (j =  i + 1 ;j < n;j ++ )
  {
   arrtype m 
=  coff[nrow[j] * col + i] / coff[nrow[i] * col + i];
   
for ( int  k = i + 1 ;k < col;k ++ )
   {
    coff[nrow[j]
* col + k] -= coff[nrow[i] * col + k] * m;
   }
  }
}
if (coff[nrow[n - 1 ] * col + n - 1 ] == 0 )
  
return ;
for (i = n;i < col;i ++ )
{
  x[(n
- 1 ) * m + (i - n)] = coff[nrow[n - 1 ] * col + i] / coff[nrow[n - 1 ] * col + n - 1 ];
}
for (i = n - 2 ;i >= 0 ;i -- )
{
  
for ( int  j  =  n;j < col;j ++ )
  {
   
for ( int  k = n - 1 ;k > i;k -- )
    coff[nrow[i]
* col + j] -= coff[nrow[i] * col + k] * x[k * m + (j - n)];
   x[i
* m + (j - n)] = coff[nrow[i] * col + j] / coff[nrow[i] * col + i];
  }
}
}
void  main( int  argc, char *  argv[])
{
FILE 
* fpi, * fpo;
if (argc  >   1 )
  fpi
= fopen(argv[ 1 ], " r " );
else
  fpi
= stdin;
if ( ! fpi) return ;
if (argc > 2 )
  fpo 
=  fopen(argv[ 2 ], " w " );
else
  fpo 
=  stdout;
if ( ! fpo) return ;
int  m,n;
printf(
" 请输入n和m的值:\n " );
fscanf(fpi,
" %d " , & n);
fscanf(fpi,
" %d " , & m);
arrtype 
* co;
co 
=   new  arrtype[n * (n + m)];
for ( int  i  =   0 ;i < n * (n + m);i ++ )
{
  
float  t;
  fscanf(fpi,
" %f " , & t);
  co[i]
= t;
}
fclose(fpi);
arrtype 
* =   new  arrtype[m * n];
GuassScale(co,n,x,m);
delete[] co;
for (i = 0 ;i < n;i ++ )
{
  fprintf(fpo,
" x[%d]= " ,i);
  
for ( int  j = 0 ;j < m;j ++ )
   fprintf(fpo,
" %f " ,x[i * m + j]);
  fprintf(fpo,
" \n " );
}
delete[] x;
fclose(fpo);

 

转载于:https://www.cnblogs.com/magic_evan/archive/2010/10/11/1847527.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值