数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。
选列主元素消元法:在高斯消去法的消元过程中第k步要求除以akk,为了防止除数为零或除数太小造成的误差过大的问题,在消元开始是先将该列最大元(绝对值)所在行移到消元第一行在除akk,然后消元。
列主元消去法虽然和高斯消去法原理一样,但是列主元消去法可以减小舍入误差,精度比较高,是解决小型稠密矩阵的一个较好的算法。而高斯消去法虽然编程简单,但是计算量大,而且对于两个相近的解时由于舍入误差的存在,使得结果误差很大。
引起其他元素
的数量级及舍人误差急剧增大,导致最终计算结果不可靠。为了避免在高斯消去法应用中可能出现的这类问题,就发展形成了列主元、全主元等多种消去法。
这些方法的基本点在于对高斯消去法的过程作某些技术性修改,全面或局部地选取绝对值最大的元素为主元素,从而构成了相应的主元(素)消去法。列主元(素)消去法以处理简单、相对计算量小的特点,在各类主元消去法中得到最为广泛的应用。
程序如下function
x=gauss(A,b)
%高斯求解方程组%x=gauss(A,b)n=length(A);a=[A,b];for
k=1:n-1
maxa=max(abs(a(k:n,k)));
if
maxa==0
return;
end
for
i=k:n
if
abs(a(i,k))==maxa
y=a(i,k:n+1);a(i,k:n+1)=a(k,k:n+1);a(k,k:n+1)=y;
break;
end
end
for
i=k+1:n
l(i,k)=a(i,k)/a(k,k);
a(i,k+1:n+1)=a(i,k+1:n+1)-l(i,k)a(k,k+1:n+1);
endend%回代if
a(n,n)==0
returnendx(n)=a(n,n+1)/a(n,n);for
i=n-1:-1:1
x(i)=(a(i,n+1)-sum(a(i,i+1:n)x(i+1:n)))/a(i,i);end
调用示例如下:>>
A=[2,-1,3;4,2,5;1,2,0];
>>
b=[1;4;7];
>>
x=gauss(A,b)x
=
9
-1
-6
你这个是科学计算的吧,列主元消去法虽然和高斯消去法原理一样,但是列主元消去法可以减小舍入误差,精度比较高,是解决小型稠密矩阵的一个较好的算法。而高斯消去法虽然编程简单,但是计算量大,而且对于两个相近的解时由于舍入误差的存在,使得结果误差很大。
function x=gauss_lie(A,b)
%采用高斯列主元法求解方程组Ax=b
n=length(b);
p=1:n;lu=A;
y=[];
for k=1:n
[c,i]=max(abs(lu(k:n,k)));
ik=i+k-1;
if ik~=k
m=p(k);p(k)=p(ik);p(ik)=m;
ck=lu(k,:);lu(k,:)=lu(ik,:);lu(ik,:)=ck;
end
if k==n
break;
end
lu(k+1:n,k)=lu(k+1:n,k)/lu(k,k);
lu(k+1:n,k+1:n)=lu(k+1:n,k+1:n)-lu(k+1:n,k)lu(k,k+1:n);
end
l=diag(ones(n,1))+tril(lu,-1);
u=triu(lu);
y(1)=b(p(1));
for i=2:n
y(i)=b(p(i))-l(i,1:i-1)y(1:i-1)';
end
x(n)=y(n)/u(n,n);
for i=n-1:-1:1
x(i)=(y(i)-u(i,i+1:n)x(i+1:n)')/u(i,i);
end
x=x';
先说如何调用的,用高斯消元法做的
//By JJ,2008
#include<iostreamh>
#include"01h"
void main()
{
equation a;
aInputData();
asolve_eqution();
cinget();
cinget();
}
下面是以前写的类,可能要你自己修改一下
#include<iomaniph>
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;
}
高斯消去法,又称高斯消元法,实际上就是我们俗称的加减消元法
数学上,高斯消去法或称高斯-约当消去法,由高斯和约当得名(很多人将高斯消去作为完整的高斯-约当消去的前半部分),它是线性代数中的一个算法,用于决定线性方程组的解,决定矩阵的秩,以及决定可逆方矩阵的逆当用于一个矩阵时,高斯消去产生“行消去梯形形式”
例如:一个二元一次方程组,设法对每个等式进行变形,使两个等式中的同一个未知数的系数相等,这两个等式相减,得到一个新的等式,在这个新的等式中,细数相等的未知数就被除去了(系数为0)
同样的也适合多元多次方程组
逐次将第一行乘以某一系数,
然后加到第二行和第三行上,使第一行和第三行左侧第一位数字为零
然后用第二行乘以某一系数加到第三行上使其第二位数也为零。
即可以求出方程的所有解
欢迎分享,转载请注明来源:品搜搜测评网