[已到期] [未解决]
用C++算法如何实现高斯塞得尔算法,并且以图形的方式显示结果
提问人:郭秀娟  回答:5  浏览:2798  提问时间:2010/4/29 8:38:34  到期时间:2010/5/9 8:38:34  悬赏分:15+5+20
主要是C++的图形问题
补充问题 我来回答
此问题的回答(5)
郑晓明
不会哎。。呵呵。。你学c++?
回答者:郑晓明  2010/4/29 14:08:47
李林
先说如何调用的,用高斯消元法做的

//By JJ,2008

#include<iostream.h>
#include"01.h"
void main()
{
 equation a;
 a.InputData();
 a.solve_eqution();
 cin.get();
 cin.get();
}

下面是以前写的类,可能要你自己修改一下

#include<iomanip.h>
const int Max_Number=20;
class equation
{
private:
 int number;          //方程个数
 char value[Max_Number];       //未知量
 double modulus[Max_Number][Max_Number];   //方程系数
 double  constant[Max_Number];     //右端常数
public:
 equation(int _number=0);      //构造函数
 void InputData();        //输入数据
 void solve_eqution();       //高斯全主元消去  
 void gauss_all_valueiaoqu();     //Gauss全主元消去法
 void gauss_calculate();       //高斯消去法以后计算未知量的结果
 void evaluechange_hang(int m,int n);
 void evaluechange_a_lie(int m,int n);
 void evaluechange_value(int m,int n);
};

equation::equation(int _number)
{
 number=_number;
}

//----------------------------初始化数据为0
void equation::InputData()     
{
 int i,j;
 if(number==0)
 {
  cout<<"输入方程的个数:";
  cin>>number;
 }

 //--------------初始化变量符号为默认的a,b,c..
 for(i=0;i<number;i++)
  value[i]='a'+i;

 //---------输入数据------01.提示如何输入
 cout<<"====================================================\n";
 cout<<"请在每个方程里输入"<<number<<"系数和一个常数:\n";
  cout<<"例:\n方程:a";
 for(i=1;i<number;i++)
 {
  cout<<"+"<<i+1<<value[i];
 }
 cout<<"=10\n";
 cout<<"应输入:";
 for(i=0;i<number;i++)
  cout<<i+1<<" ";
 cout<<"10\n";
 cout<<"==============================\n";

 
//---------02.输入每个方程
 for(i=0;i<number;i++)
 { 
  cout<<"输入方程"<<i+1<<":";
  for(j=0;j<number;j++)
   cin>>modulus[i][j];
  cin>>constant[i];
 }
}

//高斯全主元排列求解方程
void equation::solve_eqution()
{
 int i,j;
 gauss_all_valueiaoqu();
 if(modulus[number-1][number-1]!=0)
 {
 
  gauss_calculate();

  for(i=0;i<number;i++)   //输出结果
  { 
   for(j=0;value[j]!='a'+i&&j<number;j++);
   cout<<value[j]<<"="<<constant[j]<<endl;
  }
 }
 else
  cout<<"系数行列式等于零,方程没有唯一的解.\n";
}

void equation::gauss_all_valueiaoqu()   //Gauss全主元消去法
{
 int i,j,k,mavaluei,mavaluej;double lik;
 cout<<"用Gauss全主元消去法结果如下:\n";

 for(k=0;k<number-1;k++)
 { 
  
  for(mavaluei=mavaluej=i=k;i<number;i++)
  { 
   for(j=k;j<number;j++)
   if(modulus[i][j]>modulus[mavaluei][ mavaluej]) 
   { mavaluei=i;
    mavaluej=j;
   }
  
  } 
  if(mavaluei!=k) 
   evaluechange_hang(k,mavaluei);
  if(mavaluej!=k)
  {
   evaluechange_a_lie(mavaluej,k);    //交换两列
   evaluechange_value(mavaluej,k);

  }
  
  for(i=k+1;i<number;i++)
  { 
   lik=modulus[i][k]/modulus[k][k];
   for(j=k;j<number;j++)
    modulus[i][j]=modulus[i][j]-modulus[k][j]*lik;
   constant[i]=constant[i]-constant[k]*lik;
  }
 }
}

void equation::gauss_calculate()    //高斯消去法以后计算未知量的结果

 int i,j;double sum_avalue;
 constant[number-1]=constant[number-1]/modulus[number-1][number-1];
 for(i=number-2;i>=0;i--)
 { 
  for(j=i+1,sum_avalue=0;j<number;j++)
   sum_avalue+=modulus[i][j]*constant[j];
  constant[i]=(constant[i]-sum_avalue)/modulus[i][i];
 }
}

void equation::evaluechange_hang(int m,int n)  //交换a[][]中和b[]两行

 int j; double temp;
 for(j=0;j<number;j++)
 { temp=modulus[m][j];
  modulus[m][j]=modulus[n][j];
  modulus[n][j]=temp;
  
 }
 temp=constant[m];
 constant[m]=constant[n];
 constant[n]=temp;
}

void equation::evaluechange_a_lie(int m,int n)   //交换a[]中的两列
{ double temp;int i;
 for(i=0;i<number;i++)
 { temp=modulus[i][m];
  modulus[i][m]=modulus[i][n];
  modulus[i][n]=temp;
 }
}

void equation::evaluechange_value(int m,int n)    //交换未知量x[m]与x[n]
{ char temp;
 temp=value[m];
 value[m]=value[n];
 value[n]=temp;
}
回答者:李林  2010/4/30 19:11:51
李健
搞死赛尔 算法  没学过 虽然我学了c++
回答者:李健  2010/5/1 9:38:17
史建平
tainanle
回答者:史建平  2010/5/1 15:16:57
陈雪
去csdn和pudn上搜搜源码
回答者:陈雪  2010/5/6 17:05:53
同类快到期问题