gauss消元法求解线性方程组(举例子)

二维数组变成上三角矩阵,从后面求xn-1一直求到x0即可

简单模拟

注意事项:

(1)注意分母不为0的情况

(2)化成上三角过程中,如果已经化为0的就不用再进行运算了,continue

(3)最好一步求解最后结果,避免提前约分

以以下线性方程组为例:

x1+x2-4*x4=1

-x1+x2+x3+3*x4=-2

x1+3*x2+5*x3-4*x4=-4

x2+2*x3-x4=-2

 

program:

#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
double a[4][5];
double x[4];
int n=4;
int main()
{
 
a[0][0]=1,a[0][1]=1,a[0][2]=0,a[0][3]=4,a[0][4]=1;
a[1][0]=-1,a[1][1]=1,a[1][2]=1,a[1][3]=3,a[1][4]=-2;
a[2][0]=1,a[2][1]=3,a[2][2]=5,a[2][3]=-4,a[2][4]=-4;
a[3][0]=0,a[3][1]=1,a[3][2]=2,a[3][3]=-1,a[3][4]=-2;
double tmp;
for(int i=1;i<n;i++)//i:1,2,3      (化成上三角)
{
    for(int j=0;j<i;j++)//j:0,1,2
    {
          
          if(fabs(a[i][j])<=0.00001)
               {
                 tmp=0;
                 continue;//是0的就跳过,不用再加了 
               }
          else
               tmp= -a[j][j]/a[i][j];//note!
          //a[i][j]=0; //下面改了之后这里就要改位置了啦 
          for(int k=j+1;k<n+1;k++)//从j+1列开始 
          {
              //a[i][k]=a[i][k]*tmp+a[j][k];//note!tmp最好不好这样写,误差大. 
              a[i][k]=-(a[i][k]*(a[j][j])/a[i][j])+a[j][k];
              
          }
          a[i][j]=0;      
    }    
}
for(int i=0;i<n;i++)         //(输出化成上三角的结果)
{
   for(int j=0;j<n+1;j++)
     {
         
         printf("%10lf ",a[i][j]);
     }        
   cout<<endl;
}
for(int i=n-1;i>=0;i--)      //(从最后逆推得x0~xn-1的结果)
{
   if(fabs(a[i][i])<=0.0001)//如果xi前面的系数为0,那么这个解-_-为0?貌似不可能 
      {
        x[i]=0;
        continue;                      
      }
   tmp=a[i][n];
   for(int j=n-1;j>=i+1;j--)//因为是求xi,所以减运算就是进行到i+1项 
   {
       tmp-=a[i][j]*x[j];
          
   } 
    
   x[i]=tmp/a[i][i]; 
         
}
cout<<"最后的解如下:"<<endl; 
for(int i=0;i<n;i++)
{
        
  printf("%10lf ",x[i]);
}
cout<<endl; 
system("pause");
return 0;} 



 

 gauss消元法求解线性方程组(举例子)_第1张图片

你可能感兴趣的:(数值分析)