ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++高斯消元法求解线性方程组

2019-03-15 13:43:43  阅读:650  来源: 互联网

标签:unuse MaxNum int max c++ 高斯消 var array 元法


//高斯消元法求解方程组
#include<iostream>
#include<math.h>
using namespace std;
#define MaxNum 10
int array[MaxNum][MaxNum] = {
                            {3,5,-4,0},
                            {7,2,6,-4},
                            {4,-1,5,-5}};//输入的增广矩阵 
int unuse_result[MaxNum];
int GaussFun(int equ,int var,int result[])
{
    int i,j,k,col,num1,num2;
    int max_r,ta,tb,gcdtemp,lcmtemp;
    int temp,unuse_x_num,unuse_index;
    col=0;
    for(k=0;k<equ&&col<var;k++,col++)//循环处理增广矩阵的各行 
    {
        max_r=k;
        for(i=k+1;i<equ;i++)
        {
            if(abs(array[i][col])>abs(array[max_r][col]))
            {
                max_r=i;//保存绝对值最大的行 
            }
        }
        if(max_r!=k)
        {
            for(j=k;j<var+1;j++)
            {
                temp=array[k][j];
                array[k][j]=array[max_r][j];
                array[max_r][j]=temp;
            }
        }
        if(array[k][col]==0)
        {
            k--;
            continue;
        }
        for(i=k+1;i<equ;i++)
        {
            if(array[i][col]!=0)
            {
                num1=abs(array[i][col]);
                num2=abs(array[k][col]);
                while(num2!=0)
                {
                    temp=num2;
                    num2=num1%num2;
                    num1=temp;
                }
                gcdtemp=num1;//最大公约数 
                lcmtemp=(abs(array[i][col])*abs(array[k][col]))/gcdtemp;
                ta = lcmtemp/abs(array[i][col]);
                tb = lcmtemp/abs(array[k][col]);
                if(array[i][col]*array[k][col]<0)
                {
                    tb= -tb;
                 } 
                 for(j=col;j<var+1;j++)
                 {
                     array[i][j]=array[i][j]*ta-array[k][j]*tb;
                 }
            }
        }
    }
for(i=k;i<equ;i++)
{
    if(array[i][col]!=0)
    {
        return -1;
    }
}
if(k<var)
{
    for(i=k-1;i>=0;i--)
    {
        unuse_x_num=0;
        for(j=0;j<var;j++)
        {
            if(array[i][j]!=0&&unuse_result[j])
            {
                unuse_x_num++;
                unuse_index=j;
            }
        }
        if(unuse_x_num>1)
        {
            continue;
        }
        temp=array[i][var];
        for(j=0;j<var;j++)
        {
            if(array[i][j]!=0&&j!=unuse_index)
            {
                temp -=array[i][j]*result[j];
            }
        }
        result[unuse_index]=temp/array[i][unuse_index];
        unuse_result[unuse_index]=0;
    }
    return var-k;
}
for(i=var-1;i>=0;i--)
{
    temp=array[i][var];
    for(j=i+1;j<var;j++)
    {
        if(array[i][j]!=0)
        {
            temp -=array[i][j]*result[j];
        }
    }
    if(temp%array[i][i]!=0)
    {
        return -2;
    }
        result[i]=temp/array[i][i];
    }
    return 0;
}
int mian()
{
    int i,type;
    int equnum,varnum;
    int result[MaxNum];
    equnum =3;
    varnum = 3;
    type=GaussFun(equnum,varnum,result);//调用高斯函数
    if(type ==-1)
    {
        cout<<"该方程无解。"<<endl; 
     } 
     else if(type==-2)
     {
         cout<<"该方程又浮点数解没有整数解。"<<endl; 
     }
     else if(type>0)
     {
         cout<<"该方程有无穷多解!自由变量的数量为"<<type<<endl; 
         for(i=0;i<varnum;i++)
         {
             if(unuse_result[i])
             {
                 cout<<i+1<<"是不确定的"<<endl; 
             }
             else
             {
                 cout<<i+1<<result[i]<<endl;
             }
         }
     }
     else
    {
        cout<<"该方程的解为:"<<endl;
        for(i=0;i<varnum;i++)
        {
            cout<<i+1<<result[i]<<endl;
         } 
     } 
     return 0;
 } 

 

标签:unuse,MaxNum,int,max,c++,高斯消,var,array,元法
来源: https://www.cnblogs.com/chuxinbubian/p/10536503.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有