高斯消元法的介绍

高斯消元法的介绍,第1张

数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。

选列主元素消元法:在高斯消去法的消元过程中第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)

同样的也适合多元多次方程组

逐次将第一行乘以某一系数,

然后加到第二行和第三行上,使第一行和第三行左侧第一位数字为零

然后用第二行乘以某一系数加到第三行上使其第二位数也为零。

即可以求出方程的所有解

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/3506711.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-03-01
下一篇2024-03-01

随机推荐

  • 天气太套盒里面那个棍儿是干嘛用的

    天气丹的小勺子是用来取用护肤品, 尤其是眼霜的,因为眼霜每次只需要点涂一点点就能让眼周的肌肤得到充分的滋润,如果用手蘸取, 可能会涂抹过多,造成浪费的同时还有可能导致眼角产生脂肪粒,影响使用效果,所以使用小勺子可以很好地掌控。天气丹套盒是用

    2024-04-15
    25100
  • 精华露和精华液的区别

    精华露和精华液是我们常见的美容护肤产品,它们都是一种高浓度的保养品,含有多种活性成分,能够深层滋养肌肤。虽然两者名称相似,但其实它们有着不同的特点和使用方法。从质地上来看,精华露通常是半透明的液体状质地,较为清爽易吸收;而精华液则比较浓稠,

    2024-04-15
    27100
  • 艾嘉曼身体套盒怎么样

    使用效果还不错。艾嘉曼身体套盒产品采用传统上等的中药为主要原料,经过高科离子提纯技术,使有效成份分子量达到毛孔的万分之一的细度,在皮肤表面瞬间吸收,使皮肤更加的细腻,使用效果还不错。艾嘉曼除了身体套盒还有,百草赋活精华水、精华霜、秘润养护乳

    2024-04-15
    26400
  • 好用的身体防晒霜推荐 这些防晒tips你一定要知道

    防晒霜不仅可以防止晒黑还可以防止晒老,光老化是很常见的,紫外线对肌肤有很多伤害,平时出门一定要涂抹防晒霜,除了面部防晒,身体防晒也很重要。好用的身体防晒霜推荐1、妮维雅防晒 140g 质地很水润,非常好抹开,便宜又大瓶,拿来抹身上的

    2024-04-15
    17200
  • 常州公交216路跟30路改道有临时线路吗?

    [常州公交官网查询的]线路名称: 216下行 始发站: 火车站公交中心站 终点站: 青龙双沟 线路长度: 1290 所属公司: 巴士公司 全线站点: 火车站公交中心站-红梅新村-竹林北路-技师院-董头村-翠竹公园-三里庵-五里头村-森源国际

    2024-04-15
    8800
  • 妮维雅蓝罐日产和德产成分区别,妮维雅蓝罐德版和日版有区别吗

    说起妮维雅蓝罐虽然是经典的产品,不过大家在购买后发现了产品的产地有所不同,同时观察仔细的朋友也会发现在妮维雅蓝罐日产和德产成分功效作用等会有一些细微的区别,下面我们就通过对比妮维雅蓝罐日产和德产成分及使用功能等对比说明两者之间的区别。

    2024-04-15
    16100
  • 三森家具城轻奢家具品牌有哪些

    西安三森家具城有马可波罗、方太、圣象、瑞宝、欧雅等等知名品牌。过去叫三森现在叫美德亨。价格适中。有几个品牌不错。二楼的伊思曼床。三楼的柚乐居板木家具。一楼的本卫浴。都是很好的品牌。可以试一试。千万别自己刷,惨痛的教训啊。我也是跟你一样,我也

    2024-04-15
    9300

发表评论

登录后才能评论
保存