• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
4℃空间
众人笑我痴 我笑他人看不懂
   首页    新随笔    联系   管理    订阅  订阅

高斯消去法

代码
#include "stdio.h"
#include 
"math.h"
#include 
"stdlib.h"
typedef 
double arrtype;
//高斯消去法
void GuassScale(arrtype coff[],int n,arrtype *x = NULL,int m = 1)
{
int col = n + m;
arrtype 
*s = 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 
*x = 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);
} 

 

posted @ 2010-10-11 00:14  magic_evan  阅读(379)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3