Gauss列主元消去法
Gauss列主元素消去法实验
Lab06.Gauss 列主元素消去法实验【实验目的和要求】1.使学生深入理解并掌握Gauss 消去法和Gauss 列主元素消去法步骤; 2.通过对Gauss 消去法和Gauss 列主元素消去法的程序设计,以提高学生程序设计的能力;3.对具体问题,分别用Gauss 消去法和Gauss 列主元素消去法求解。
通过对结果的分析比较,使学生感受Gauss 列主元素消去法优点。
【实验内容】1.根据Matlab 语言特点,描述Gauss 消去法和Gauss 列主元素消去法步骤。
2.编写用不选主元的直接三角分解法解线性方程组Ax=b 的M 文件。
要求输出Ax=b 中矩阵A 及向量b ,A=LU 分解的L 与U ,det A 及解向量x 。
3.编写用Gauss 列主元素消去法解线性方程组Ax=b 的M 文件。
要求输出Ax=b 中矩阵A 及向量b 、PA=LU 分解的L 与U 、det A 及解向量x ,交换顺序。
4.给定方程组(1) ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--11134.981.4987.023.116.427.199.103.601.3321x x x(2) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----15900001.582012151********.23107104321x x x x 先用编写的程序计算,再将(1)中的系数3.01改为3.00,0.987改为0.990;将(2)中的系数2.099999改为2.1,5.900001改为9.5,再用Gauss 列主元素消去法解,并将两次计算的结果进行比较。
【实验仪器与软件】1.CPU 主频在1GHz 以上,内存在128Mb 以上的PC ;2.Matlab 6.0及以上版本。
实验讲评:实验成绩:评阅教师:200 年 月 日Lab06.Gauss 列主元素消去法实验第一题:1、算法描述:Ⅰ、Gauss 消去法由书上定理5可知 设Ax=b ,其中A ∈R^(n(1)如果()0(1,2,....,1)k kka k n ≠=-,则可通过高斯消去法将Ax=b 约化为等价的 角形线性方程组,且计算公式为:① 消元计算(k=1,2,….,n-1)()()(1)()()(1)()()/,1,...,,,,1,...,,,1,...,.k k ik ik kk k k k ij ij ik kj k k k iiik k m a a i k n a a m a i j k n b b m b i k n ++==+=-=+=-=+② 回带公式()()()()()1/,()/,1,...,2,1.n n n n nn ni i i i iii j ii j i x b a x ba x a i n =+==-=-∑(2)如果A 为非奇异矩阵,则可通过高斯消去法将方程组Ax=b 约化方程组为上三角矩阵以上消元和回代过程总的乘除法次数为332333nn nn +-≈,加减法次数为32353263nnn n+-≈以上过程就叫高斯消去法。
Gauss列主元消去法实验
<数值计算方法>实验报告1.实验名称实验2 Gauss 列主元消去法2.实验题目用Gauss 列主元消去法求解线性方程组。
0.0011 2.0002 3.0003 1.0001.0001 3.7122 4.6233 2.0002.0001 1.0722 5.6433 3.000x x x x x x x x x ++=⎧⎪-++=⎨⎪-++=⎩3.实验目的加深自己对Gauss 列主元消去法的理解和认识,并且通过做实验或做练习来加强自己Gauss 列主元消去法的掌握,学会并灵活运用Gauss 列主元消去法来求解方程组。
4.基础理论-------Gauss 列主元消去法1.Gauss 列主元消去法的基本思想是:在进行第k (k=1,2,...,n-1)步消元时,从第k 列的kk a 及以下的各元素中选取绝对值最大的元素,然后通过行变换将它交换到主元素kk a 的位置上,再进行消元。
2.Gauss 列主元消去法的优点:当kk a (k=1,2,...,n-1)的绝对值很小时,用Gauss 列主元消去法来求解方程组时,可以避免所的数值结果产生较大误差或失真。
5.实验环境实验系统:Win 7实验平台:VisualC++语言6.实验过程写出算法→编写程序→计算结果Gauss 列元消去法的算法Input:方程组未知量的个数n;增广矩阵()()1,2,...,T ij A a A A An ==,其中i=1,2,…,n; j=1,2,…,n+1Output:方程组的解x1,x2,…,xn,或失败信息。
1. for i ←1ton-1 do;2. temp ←|ii a |;3. p ←I;4. for j ←i+1 to n do5. if ||ji a >temp then6. p ←j;8. end9. end10. if temp=0 then11. |return False;12. end13. if p ≠I then14. p A ⇔i A ;//i,p 两行交换15. end//列选主元16. for j ←i+1 to n do17.*j ji i A m A -ji m ←/ji ii a a ;18. j A ←*j ji i A m A -;//消元19. end7.实验结果原方程组的解为:X1=-0.490396 , x2=-0.051035 ,x3=0.3675208.附录程序清单#include<iostream.h> #include"stdio.h"#include"math.h"void main ( ){ int n=3,i,j,k,p;doubleA[10][10]={{0.001,2.000,3.000,1.000},{-1.000,3.712,4.623,2.000},{-2.0 00,1.072,5.643,3.000}},temp,m,x[100];for(i=0;i<n;i++){ //选主元temp=fabs(A[i][i]); p=i;for(k=i+1;k<n;k++)if(fabs(A[k][i])>temp){temp=fabs(A[k][i]); p=k;}if(temp==0){ printf("\n无法求解:");return;}if(p!=i)for(j=0;j<n+1;j++){ temp=A[i][j];A[i][j]=A[p][j];A[p][j]=temp;}//消元for(k=i+1;k<n;k++){ m=A[k][i]/A[i][i];for(j=i+1;j<=n;j++)A[k][j]=A[k][j]-m*A[i][j];}}//回代for(i=n-1;i>=0;i--){x[i]=A[i][n];for(j=i+1;j<n;j++)x[i]=x[i]-A[i][j]*x[j];x[i]=x[i]/A[i][i];}printf("\nx=\n");for(i=0;i<n;i++)printf("%f \n",x[i]);}。
Gauss列主元消去法、QR(MATLAB)
Gauss列主元消去法、QR(MATLAB)Gauss列主元消去法是一种线性方程组的求解方法,也称Gauss消去法。
其基本思想是将方程组转化为上三角矩阵,然后通过反向代入求解。
该方法的优点在于计算精度高,求解速度快,但缺点是需要大量的计算,尤其是在矩阵阶数较高时。
具体来讲,Gauss列主元消去法的步骤如下:步骤一:将系数矩阵A进行LU分解,其中L是下三角矩阵、U是上三角矩阵。
设$A=LU$,则原方程组可以写成$LUx=b$。
步骤二:通过初等矩阵左乘系数矩阵A,将每一列的主元变为该列所有元素中绝对值最大的那个元素。
这个过程称为选主元,可以避免计算中的数值不稳定问题。
步骤三:将选主元后的系数矩阵A进行LU分解,得到$L^{'}$、$U^{'}$。
步骤五:通过反向代入求解$U^{'}x=y$,得到$x$的解。
Gauss列主元消去法的实现通常通过矩阵的变换来实现。
对于$n$阶矩阵$A=[a_{ij}]$,通过一系列的行变换,可以将其变为上三角矩阵。
其中的变换可以表示为:$$ R_{i} \leftrightarrow R_{j} $$其中,$R_{i}$和$R_{j}$分别表示矩阵$A$中的第$i$行和第$j$行,$k$是一个非零常数。
这些变换被称为初等行变换。
在MATLAB中,可以使用已经实现好的{\color{blue}\texttt{gauss}}函数来求解线性方程组。
该函数实现的算法是Gauss列主元消去法。
其调用格式为:x = gauss(A,b)其中,$A$是系数矩阵,$b$是结果向量。
函数返回结果向量$x$。
如果$A$或$b$不合法,则函数会返回一个空向量。
除了Gauss列主元消去法,还有一种常用的求解线性方程组的方法是QR分解法。
步骤二:通过正交矩阵左乘系数矩阵$A$,使其变为一个上三角矩阵。
这个过程称为正交相似变换。
步骤三:将$b$进行正交相似变换,得到$Q^{T}b$。
Guass列选主元消去法和三角分解法
Guass列选主元消去法和三⾓分解法 最近数值计算学了Guass列主消元法和三⾓分解法解线性⽅程组,具体原理如下:1、Guass列选主元消去法对于AX =B1)、消元过程:将(A|B)进⾏变换为,其中是上三⾓矩阵。
即:k从1到n-1a、列选主元选取第k列中绝对值最⼤元素作为主元。
b、换⾏c、归⼀化d、消元2)、回代过程:由解出。
2、三⾓分解法(Doolittle分解)将A分解为如下形式由矩阵乘法原理a、计算U的第⼀⾏,再计算L的第⼀列b、设已求出U的1⾄r-1⾏,L的1⾄r-1列。
先计算U的第r⾏,再计算L的第r列。
a)计算U的r⾏b)计算L的r列C#代码: 代码说明:Guass列主消元法部分将计算出来的根仍然储存在增⼴矩阵的最后⼀列,⽽Doolittle分解,将分解后的结果也储存⾄原来的数组中,这样可以节约空间。
using System;using System.Windows.Forms;namespace Test{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Cannel_Button_Click(object sender, EventArgs e){this.textBox1.Clear();this.textBox2.Clear();this.textBox3.Clear();boBox1.SelectedIndex = -1;}public double[,] GetNum(string str, int n){string[] strnum = str.Split(' ');double[,] a = new double[n, n + 1];int k = 0;for (int i = 0; i < n; i++){for (int j = 0; j < strnum.Length / n; j++){a[i, j] = double.Parse((strnum[k]).ToString());k++;}}return a;}public void Gauss(double[,] a, int n){int i, j;SelectColE(a, n);for (i = n - 1; i >= 0; i--){for (j = i + 1; j < n; j++)a[i, n] -= a[i, j] * a[j, n];a[i, n] /= a[i, i];}}//选择列主元并进⾏消元public void SelectColE(double[,] a, int n){int i, j, k, maxRowE;double temp; //⽤于记录消元时的因数for (j = 0; j < n; j++){maxRowE = j;for (i = j; i < n; i++)if (System.Math.Abs(a[i, j]) > System.Math.Abs(a[maxRowE, j]))maxRowE = i;if (maxRowE != j)swapRow(a, j, maxRowE, n); //与最⼤主元所在⾏交换//消元for (i = j + 1; i < n; i++){temp = a[i, j] / a[j, j];for (k = j; k < n + 1; k++)a[i, k] -= a[j, k] * temp;}}return;}public void swapRow(double[,] a, int m, int maxRowE, int n){int k;double temp;for (k = m; k < n + 1; k++){temp = a[m, k];a[m, k] = a[maxRowE, k];a[maxRowE, k] = temp;}}public void Doolittle(double[,] a, int n){for (int i = 0; i < n; i++){if (i == 0){for (int j = i + 1; j < n; j++)a[j, 0] = a[j, 0] / a[0, 0];}else{double temp = 0, s = 0;for (int j = i; j < n; j++){for (int k = 0; k < i; k++){temp = temp + a[i, k] * a[k, j];}a[i, j] = a[i, j] - temp;}for (int j = i + 1; j < n; j++){for (int k = 0; k < i; k++){s = s + a[j, k] * a[k, i];}a[j, i] = (a[j, i] - s) / a[i, i];}}}}private void Exit_Button_Click(object sender, EventArgs e){this.Close();}private void Confirm_Button_Click(object sender, EventArgs e){if (this.textBox2.Text.Trim().ToString().Length == 0){this.textBox2.Text = this.textBox1.Text.Trim();}else{this.textBox2.Text = this.textBox2.Text + "\r\n" + this.textBox1.Text.Trim();}this.textBox1.Clear();}private void Calculate_Button_Click(object sender, EventArgs e){string str = this.textBox2.Text.Trim().ToString();string myString = str.Replace("\n", " ").Replace("\r", string.Empty);double[,] a = new double[this.textBox2.Lines.GetUpperBound(0) + 1, this.textBox2.Lines.GetUpperBound(0) + 2];a = GetNum(myString, this.textBox2.Lines.GetUpperBound(0) + 1);if (boBox1.Text == "Guass列主消元法"){Gauss(a, this.textBox2.Lines.GetUpperBound(0) + 1);for (int i = 0; i < this.textBox2.Lines.GetUpperBound(0) + 1; i++){this.textBox3.Text = this.textBox3.Text + "\r\nX" + (i + 1) + "=" + a[i, this.textBox2.Lines.GetUpperBound(0) + 1]; }}else if (boBox1.Text == "Doolittle三⾓分解法"){this.textBox3.Enabled = true;Doolittle(a, this.textBox2.Lines.GetUpperBound(0) + 1);bel3.Text = "分解后的结果:";this.textBox3.Clear();this.textBox3.Text += "L矩阵:\r\n";for (int i = 0; i < this.textBox2.Lines.GetUpperBound(0) + 1; i++) {for (int j = 0; j < this.textBox2.Lines.GetUpperBound(0) + 1; j++) {if (j < i){this.textBox3.Text += a[i, j].ToString() + "\t";}else if (i == j){this.textBox3.Text += "1\t";}else{this.textBox3.Text += "0\t";}}this.textBox3.Text += "\r\n";}this.textBox3.Text += "\r\nU矩阵:\r\n";for (int i = 0; i < this.textBox2.Lines.GetUpperBound(0) + 1; i++) {for (int j = 0; j < this.textBox2.Lines.GetUpperBound(0) + 1; j++) {if (j >= i){this.textBox3.Text += a[i, j].ToString() + "\t";}else{this.textBox3.Text += "0\t";}}this.textBox3.Text += "\r\n";}}}private void textBox1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Enter){if (this.textBox1.Text.Trim().ToString().Length == 0){Calculate_Button_Click(sender, e);}else{Confirm_Button_Click(sender, e);}}}private void button1_Click(object sender, EventArgs e){this.textBox2.Enabled = true;}}} 运⾏截图: ⾄此完毕。
高斯列主元消去法
如果在高斯顺序消去法消去过程进行到第i 步时,现选取ri a )(n r i ≤≤中绝对值最大的元素,设为第j 行的元素ji a ,把矩阵的第i 行和第j 行互换,这时ii a 变为ji a ,然后将第i+1行至第n 行中的每一行减去第i 行乘以ii ki a a (k 代表行号),依次进行消元。
Gauss 列主元消去法的算法步骤如下:将方程组写成以下的增广矩阵的形式:⎪⎩⎪⎪⎨⎧43212423222114131211............n n n n a a a a a a a a a a a a对k=1,2,3,...,n-1,令∑==nks sk pk a a max ;交换增广矩阵的第k 行与第p 行;对j=k+1,k+2,...,n,计算kk jkkm jm jm a a a a a ⋅-=(m=看,k+1,...,n )kk jkk j j a a b b b ⋅-=算法结束。
三角分解法程序如下:建立相应的M 文件,其函数名为LU,程序如下:function y=LU(A,B);n=length(A);A=[A B];for k=1:n-1;for i=k:n;if (abs(A(i,k))==max(abs(A(k:n,k)))) P(k)=i;temp=A(k,:);A(k,:)=A(i,:);A(i,:)=temp;endendfor j=k+1:n;A(j,k)=A(j,k)/A(k,k);A(j,k+1:n+1)=A(j,k+1:n+1)-A(j,k)*A(k,k+1:n+1);endendP(n)=n;L(1,1)=1;L(2:n,1)=A(2:n,1);L(1,2:n)=0;U(1,1)=A(1,1);U(2:n,1)=0;U(1,2:n)=A(1,2:n);for i=2:n;L(i,1:i-1)=A(i,1:i-1);L(i,i)=1;L(i,i+1:n)=0;U(i,1:i-1)=0;U(i,i:n)=A(i,i:n);endx(n) = A(n,n+1)/U(n,n);for k = n-1:-1:1x(k)=A(k,n+1);for p=n:-1:k+1;x(k) = x(k)-U(k,p)*x(p); endx(k)=x(k)/U(k,k);endxLUPend在程序命令行输入:a=[0.101 2.304 1.5355;-1.347 3.712 4.623;-2.835 1.072 5.643];b=[1.183,2.137,3.035]';LU(a,b)运行结果为:x =3.1160 -1.1960 2.3305 L =1.0000 0 00.4751 1.0000 0-0.0356 0.7313 1.0000 U =-2.8350 1.0720 5.64300 3.2027 1.94180 0 0.3359 P =3 2 3。
2-2 Gauss列主元消去法
S2 若ann 0,则输出“ A是奇异矩阵”;停机 . S3 置xn an,n1 / ann ;
对i n 1, n 2,...1,
ai,n1 n aij x j
置xi
j i 1
aii
S4 输出x1, x2,..., xn ;停机.
作业:
P50 习题3
k in
aik
;
S12 若aik ,k 0,则输出“ A是奇异矩阵”;停机 .
S13 若ik k,则
akj aik , j j k,...,n 1;
S14 对i k 1,..., n
置aik aik / akk ; 对j k 1,..., n 1
置aij aij aik akj.
§2-2 Gauss列主元消去法
一、Gauss列主元消去法的引入 例1. 用3位浮点数运算,求解线性方程组
0.0001xx11
x2 x2
1 2
解: 本方程组的精度较高的解为
x* (1.00010001 ,0.99989999 )T
用Gauss消去法求解
A ( A,b)
0.000100 1
1 1
21
0.000100
m2110 000
0
回代后得到
1
1
1.00 104 1.00 104
x1 0.00 , x2 1.00
与精确解相比,该结果显然是错误的 究其原因,在求行乘数时用了很小的数0.0001作除数
如果在求解时将1,2行交换,即
A ( A,b)
1 0.000100
1 1
a(2) i2
,
交换第2行和第i2行,
2in
然后进行消元,得[ A(3) , b(3) ].
数值分析1顺序消去法、列主元、列主元Gauss-Jordan消去法
数值分析1顺序消去法、列主元、列主元Gauss-Jordan消去法function x = Gauss (A, b)% 求解方程组的Gauss消去法,调用方法为% x = Gauss (A, b)% 其中% A 为方程组的系数矩阵,b为方程组的右端项% x 为方程组的解[n,m] = size (A); nb = length (b);if n~=merror ('% 系数矩阵必须为方的!');endif m~=nberror ('% b 的维数与方程组的行数不匹配!'); endfor k = 1:n-1% 消元过程for i = k+1:nm = A (i,k)/A(k,k);for j = k+1:nA (i,j) = A (i,j)-m*A (k,j);endb (i) = b (i)-m*b (k);endendx=zeros (size (b));for k = n:-1:1for j = k+1:nb (k) = b (k)-A (k,j)*x (j);endx (k) = b (k)/A(k,k);endendfunction x = Gauss_Elim (A, b)% 求解方程组的列主元Gauss消去法,调用方法为% x = Gauss_Elim (A, b)% 其中% A 为方程组的系数矩阵,b为方程组的右端项% x 为方程组的解[n,m] = size (A); nb = length (b);error ('% 系数矩阵必须为方的!');endif m~=nberror ('% b 的维数与方程组的行数不匹配!');endfor k = 1:n-1% 选主元a_max = 0;for i = k:nif abs (A (i,k))>a_maxa_max = A (i,k); r=i;endendif abs(a_max)<1e-15error ('% 系数矩阵奇异,无法求解方程组!');end% 交换两行if r>kfor j = k:nz=A (k,j); A (k,j)=A (r,j);A (r,j)=z;endz=b (k);b (k)=b (r);b (r)=z;end% 消元过程for i = k+1:nm = A (i,k)/A(k,k);for j = k+1:nA (i,j) = A (i,j)-m*A (k,j);endb (i) = b (i)-m*b (k);endend% 回代过程if abs (A (n,n))<1e-15error ('% 系数矩阵奇异,无法求解方程组!'); endx=zeros (size (b));for k = n:-1:1for j = k+1:nb (k) = b (k)-A (k,j)*x (j);endx (k) = b (k)/A(k,k);endendfunction x = Gauss_Jordan (A, b)% 求解方程组的列主元Gauss-Jordan消去法,调用方法为% x = Gauss_Jordan (A, b)% 其中% A 为方程组的系数矩阵,b为方程组的右端项% x 为方程组的解[n,m] = size (A); nb = length (b);error ('% 系数矩阵必须为方的!');endif m~=nberror ('% b 的维数与方程组的行数不匹配!'); endfor k = 1:n% 选主元a_max = 0;for i = k:nif abs (A (i,k))>a_maxa_max = A (i,k); r=i;endendif abs(a_max)<1e-15error ('% 系数矩阵奇异,无法求解方程组!'); end% 交换两行if r>kfor j = k:nz=A (k,j); A (k,j)=A (r,j);A (r,j)=z;endz=b (k);b (k)=b (r);b (r)=z;end% 消元计算b (k) = b (k)/A(k,k);for j = k+1:nA (k,j) = A (k,j)/A(k,k);endfor i=1:nfor j=k+1:nA (i,j) = A (i,j)-A (i,k)*A (k,j); endb (i)=b (i)-A (i,k)*b (k); endendendx = b; % 输出bend。
gauss列主元素消去法matlab
高斯列主元素消去法是一种解线性方程组的常用方法,特别在数值分析和线性代数中应用广泛。
在Matlab中,我们可以使用该方法来解决大规模的线性方程组,包括矩阵的求解和矩阵的反转。
一、高斯列主元素消去法的基本原理高斯列主元素消去法是一种基于矩阵消元的方法,它通过一系列的矩阵变换将原始的线性方程组转化为上三角形式,然后再进行回代求解。
这个方法的核心就是通过矩阵的变换来简化原始的线性方程组,使得求解过程更加简单高效。
在Matlab中,我们可以利用矩阵运算和函数来实现高斯列主元素消去法,如`lu`分解函数和`\"`运算符等。
通过这些工具,我们能够快速地求解各种规模的线性方程组并得到准确的结果。
二、高斯列主元素消去法在Matlab中的实现在Matlab中,我们可以通过调用`lu`函数来实现高斯列主元素消去法。
该函数返回一个上三角矩阵U和一个置换矩阵P,使得PA=LU。
通过对U进行回代求解,我们可以得到线性方程组的解。
除了`lu`函数之外,Matlab还提供了一些其他的函数和工具来帮助我们实现高斯列主元素消去法,比如`\"`运算符和`inv`函数等。
通过这些工具的组合使用,我们能够更加灵活地进行线性方程组的求解,并且可以方便地处理特殊情况和边界条件。
三、高斯列主元素消去法的应用与局限性高斯列主元素消去法在实际应用中具有广泛的适用性,特别是对于大规模的线性方程组或者稀疏矩阵的求解。
通过Matlab中的工具和函数,我们可以快速地求解各种规模的线性方程组,并得到高精度的数值解。
然而,高斯列主元素消去法也存在一些局限性,比如对于奇异矩阵或者接近奇异矩阵的情况时,该方法的求解精度可能会下降。
在实际应用中,我们需要结合具体的问题和矩阵特性来选择合适的求解方法,以确保得到准确的结果。
四、个人观点和总结作为一种经典的线性方程组求解方法,高斯列主元素消去法在Matlab 中具有较好的实现和应用效果。
通过对其原理和实现细节的深入理解,我们能够更加灵活地应用该方法,并且能够更好地理解其适用性和局限性。
数值计算基础Gauss列选主元消去法及追赶法
1、用Guass列选主元消去法求解方程组源程序代码:#include<stdio.h>#include<stdlib.h>#include<math.h>#define MAX_n 100#define PRECISION 0.0000001void MatrixInput(float A[][MAX_n],int m,int n)//输入数组{int i,j;float ftmp;printf("\n===Begin input Matrix elements===\n");for(i=1;i<=m;++i){printf("Input_Line %d : ",i);for(j=1;j<=n;++j){scanf("%f",&ftmp);A[i][j]=ftmp;}}}void MatrixOneColumnOutput(float A[][MAX_n],int n,int k)//输出方程的解{int i;for(i=1;i<=n;++i)printf("\nx[%d]=%f",i,A[i][k]);}int UpTriangle(float U[][MAX_n],int n)//解上三角方程组{int i,j;for(i=n;i>0;--i){if(fabs(U[i][i])<PRECISION)return 1;for(j=i+1;j<=n;++j)U[i][n+1]-=U[i][j]*U[j][n+1];U[i][n+1]/=U[i][i];}return 0;}void Swap(float *a,float *b)//a,b二个变量中的值交换{float ftmp;ftmp=*a;*a=*b;*b=ftmp;}int GaussElimination_column_select(float A[][MAX_n],int n)//选主元{ int i,j,k;float fTmp;for(i=1;i<n;++i){ //找主元所在行for(k=i,j=i+1;j<=n;++j)if(fabs(A[j][i])>fabs(A[k][i])) k=j;//二行交换for(j=i;j<=n+1;++j)Swap(&A[i][j],&A[k][j]);//消元if(fabs(A[i][i])<PRECISION)return 1;for(j=i+1;j<=n;++j)for(k=i+1;k<=n+1;++k)A[j][k]-=A[i][k]*A[j][i]/A[i][i];}UpTriangle(A,n);return 0;}void main(){int n;float A[MAX_n][MAX_n];printf("Input n=");scanf("%d",&n);if(n>=MAX_n-1){printf("\an must <%d!\n",MAX_n);exit(0);}MatrixInput(A,n,n+1);if(GaussElimination_column_select(A,n)) printf("\nGauss Failed!");else{printf("\nOutput Solution:");MatrixOneColumnOutput(A,n,n+1);printf("\n\n");}}运行结果:2、用追赶法求解方程组#include<stdio.h>#include<math.h>double ZhuiGanFa(double a[],double b[],double c[],double d[],int n); void main(){int n,i;double a[10],b[10],c[10],d[10];printf("Input n value:");/*表示n维向量*/scanf("%d",&n);printf("\n");printf("Now input the (a_i),i=1,2,…,%d: ",n-1);for(i=0;i<=n-2;i++)scanf("%lf",&a[i]);printf("Now input the (b_i),i=1,2,…,%d: ",n);for(i=0;i<=n-1;i++)scanf("%lf",&b[i]);printf("Now input the (c_i),i=1,2,…,%d: ",n-1);for(i=0;i<=n-2;i++)scanf("%lf",&c[i]);printf("Now input the (d_i),i=1,2,…,%d: ",n);for(i=0;i<=n-1;i++)scanf("%lf",&d[i]);ZhuiGanFa(a,b,c,d,n);}double ZhuiGanFa(double a[],double b[],double c[],double d[],int n) {int i;double t;if(fabs(b[0])<=fabs(c[0])||fabs(c[0])<=0||fabs(b[n-1])<fabs(a[n-2])||fabs(a[n-2])<=0)/*判断是否符合追赶法条件*/{printf("fail\n");return 0;}for(i=1;i<=n-2;i++){if(fabs(b[i])<(fabs(a[i])+fabs(c[i]))||a[i]*c[i]==0){printf("fail\n");return 0;}}c[0]=c[0]/b[0];d[0]=d[0]/b[0];for(i=1;i<=n-2;i++){t=b[i]-a[i-1]*c[i-1];c[i]=c[i]/t;d[i]=(d[i]-a[i-1]*d[i-1])/t;}d[n-1]=(d[n-1]-a[n-2]*d[n-2])/(b[n-1]-a[n-2]*c[n-2]);for(i=n-2;i>=0;i--)d[i]=d[i]-c[i]*d[i+1];printf("\n");for(i=0;i<=n-1;i++)printf("x(%d)=%f\n",i,d[i]);printf("\n");return 1;}运行结果1:运行结果2:。
高斯列主元
1、用直接法求解算法:Gauss列主元消去法是在Gauss消去法中增加选主元的过程,即在第k步(k=1,2,3,…)消元时,首先在第k列主对角元以下(含对角元)元素中挑选绝对值最大的数(即为列主元),并通过初等行变换,使得该数位于主对角线上,然后再继续消元。
程序:function x=gauss(A,b,n)A=[1 2 1 2;2 5 3 -2;-2 -2 3 5;1 3 2 3];b=[4;7;-1;0];n=4;a=[A,b];%a为增广阵*%消去过程for k=1:n-1%选主元c=0;for q=k:nif abs(a(q,k))>cc=a(q,k);l=q;endend%如果主元为0,则矩阵A不可逆if abs(c)<1e-10disp('error');pause;exit;end%如果1不等于k,则交换第1行和第k行if l~=kfor q=k:n+1temp=a(k,q);a(k,q)=a(l,q);a(l,q)=temp;endend%计算第k步的元素值for i=k+1:nfor j=k+1:n+1a(i,j)=a(i,j)-a(i,k)/a(k,k)*a(k,j);endendend%回带过程x(n)=a(n,n+1)/a(n,n);for i=n-1:-1:1s=0;for j=i+1:ns=s+a(i,j)*x(j);endx(i)=(a(i,n+1)-s)/a(i,i);end%返回方程组的解fprintf('方程组的解为:')计算结果为:方程组的解为:ans =18.0000 -9.5714 6.0000 -0.4286。
高斯列主元消去法优缺点
高斯列主元消去法优缺点
高斯列主元消去法是解线性方程组的一种常用方法。
它的优点是
可以有效地求解大规模线性方程组,计算精度高,稳定性强,并且可
以通过程序自动化计算。
此外,高斯列主元消去法的求解过程简单明了,易于理解和掌握,对于初学者也比较友好。
不过,高斯列主元消去法也存在一些缺点。
首先,在解决某些具
有特殊形式的线性方程组时,可能需要进行额外的操作,如部分主元
消去、对角线支配等,导致计算难度和复杂度增加。
其次,高斯列主
元消去法在求解稀疏矩阵时,可能会出现计算复杂度较高的情况,甚
至无法求解。
此外,高斯列主元消去法还可能面临误差传播和舍入误差等问题,导致求解结果略有偏差。
综合考虑,高斯列主元消去法在解决一般的
线性方程组问题时,是一种可靠、实用的方法。
但在某些特殊情况下,可能需要选择其他更适合的方法来求解。
实验二:Gauss列主元消去法
实验二:Gauss列主元消去法程序1:Gauss列主元消去法A=input('请输入线性方程组的增广矩阵A=');n=length(A)-1;x=zeros(n,1);aa=zeros(n,1);for j=1:nfor i=1:(n+1)AA(j,i)=abs(A(j,i));endendfor k=1:(n-1)for i=k:naa(i-(k-1))=AA(i,k);endfor i=k:nif AA(i,k)==max(aa)breakendendif AA(i,k)==0breakfprintf('方程组系数矩阵奇异\n');elsefor j=k:(n+1)jh=A(i,j);A(i,j)=A(k,j);A(k,j)=jh;endendfenzi=A(k,k);for j=k:(n+1)A(k,j)=A(k,j)/fenzi;endfor p=(k+1):njj=A(p,k);for j=k:(n+1)A(p,j)=A(p,j)-jj*A(k,j);endendendif k==(n-1)x(n)=A(n,(n+1))/A(n,n);for i=(n-1):(-1):1he=0;for j=(i+1):nhe=he+A(i,j)*x(j);endx(i)=A(i,(n+1))-he;endendx用Gauss列主元消去法解方程组:1.请输入线性方程组的增广矩阵A=[1e-008,2,3,1;-1,3.172,4.623,2;-2,1.072,5. 643,3]x =-0.4653-0.07000.38002.请输入线性方程组的增广矩阵A=[4,-2,4,10;-2,17,10,3;-4,10,9,-7];x =2.94640.6071-0.14293.请输入线性方程组的增广矩阵A=[0.3e-020,1,0.7;1,1,0.9]x =0.20000.7000程序2:不选主元的高斯消去法A=input('请输入线性方程组的增广矩阵A=');n=length(A)-1;x=zeros(n,1);for k=1:(n-1)if A(k,k)==0breakfprintf('方程组不能用普通的高斯消去法解\n');elsefenzi=A(k,k);for j=k:(n+1)A(k,j)=A(k,j)/fenzi;endfor p=(k+1):njj=A(p,k);for j=k:(n+1)A(p,j)=A(p,j)-jj*A(k,j);endendx(n)=A(n,(n+1))/A(n,n);for i=(n-1):(-1):1he=0;for j=(i+1):nhe=he+A(i,j)*x(j);endx(i)=A(i,(n+1))-he;endendendx用不选主元的Gauss消去法解方程组:1.请输入线性方程组的增广矩阵A=[4,-2,4,10;-2,17,10,3;-4,10,9,-7];x =2.94640.6071-0.14292.请输入线性方程组的增广矩阵A=[1e-008,2,3,1;-1,3.172,4.623,2;-2,1.072,5. 643,3];x =-0.4653-0.07000.38003.请输入线性方程组的增广矩阵A=[0.3e-020,1,0.7;1,1,0.9]x =0.7000。
高斯列主元消去法和直接三角分解法(LU分解)
实验六高斯列主元消去法和直接三角分解法(LU分解)一、实验名称:分别用高斯列主元消去法和直接三角分解法(LU分解)求方程组的解系数矩阵:10 7 8 7 常向量:107 5 6 5 88 6 10 9 67 5 9 10 7精确解为:(-60,102,-27,16)二、试验目的:分别用高斯列主元消去法和直接三角分解法(LU分解)求方程组的解,比较二者不同的特点。
三、算法描述:2、直接三角分解法(LU分解)四、源程序:1、高斯列主元消去法#include <stdio.h>void main(){float a[4][4]={{10,7,8,7},{7,5,6,5},{8,6,10,9},{7,5,9,10}}, y[4],c[4][4],x[4],d[4],m,b; int i,n,j,f;printf("请输入右端项:\n");for(i=0;i<=3;i++)scanf("%f",&y[i]);for(n=0;n<=2;n++){ m=a[n][n]; f=n;for(i=(n+1);i<=3;i++){if(m<a[i][n]){m=a[i][n]; f=i;}}if(f!=n){for(j=0;j<=3;j++){c[n][j]=a[n][j]; a[n][j]=a[f][j];a[f][j]=c[n][j];}d[n]=y[n]; y[n]=y[f]; y[f]=d[n];}for(i=(n+1);i<=3;i++){b=-a[i][n]/a[n][n];for(j=0;j<=3;j++)a[i][j]=a[n][j]*b+a[i][j];y[i]=y[n]*b+y[i];}}x[3]=y[3]/a[3][3];x[2]=(y[2]-a[2][3]*x[3])/a[2][2];x[1]=(y[1]-a[1][3]*x[3]-a[1][2]*x[2])/a[1][1];x[0]=(y[0]-a[0][3]*x[3]-a[0][2]*x[2]-a[0][1]*x[1])/a[0][0];printf("x1的值为%f\nx2的值为%f\nx3的值为%f\nx4的值为%f\n",x[0],x[1],x[2],x[3]);}2、直接三角分解法(LU分解)#include <stdio.h>void main (){float a[4][4]={{10,7,8,7},{7,5,6,5},{8,6,10,9},{7,5,9,10}},y[4], l[4][4],x[4],u[4][4],b[4]; int i,n,j;printf("请输入右端项:");for(i=0;i<=2;i++)scanf ("%f",&b[i]);for (i=0;i<=3;i++){ u[0][i]=a[0][i];l[i][0]=a[i][0]/u[0][0];}for (n=1;n<=2;n++){for(j=0;j<=(3-n);j++){u[n][n+j]=a[n][n+j];for (i=0;i<n;i++)u[n][n+j]=u[n][n+j]-l[n+j][i]*u[i][n]; }if (n=1){l[2][1]=(a[2][1]-l[2][0]*u[0][1])/u[1][1]; l[3][1]=(a[3][1]-l[3][0]*u[0][1])/u[1][1]; } else if (n=2){l[3][2]=(float)(a[3][2]-l[3][0]*u[0][2]-l[3][1]*u[1][2])/u[2][2]; } }for (n=0;n<=3;n++){y[n]=b[n];for (i=0;i<n;i++)y[n]=y[n]-l[n][i]*y[i]; }for (n=3;n>=0;n--){x[n]=y[n];for (i=3;i>n;i--)x[n]=(x[n]-u[n][i]*x[i]);x[n]=x[n]/u[n][n]; }for(i=0;i<=3;i++)printf("x%d的的值为:%f\n",i+1,x[i]); }五、输出结果1、高斯列主元消去法(1)请输入右端项:10 8 6 7X1的值为-59.999584X1的值为101.999306X1的值为-26.999817X1的值为15.999890(2)请输入右端项:5 6 7 8X1的值为-98.999306X1的值为163.998840X1的值为-40.999695X1的值为24.999817六、对算法的理解和改进改变右端项会对结果产生明显的影响,高斯列主元消去法仅考虑依次按列选取主元素,然后按行使之变到主元位置,再进行消去运算,消元结果冲掉A,计算解X冲掉常数项b,则在计算过程中由于右端项的不同解必然不同。
第1节 gauss消元法
若系数矩阵A非奇异,即 det (A)≠0 ,则方程组有 惟一解 x =( x1, x2, …, xn )T . 根据 Gramer(克莱姆)法则,求解方程组(5.1)时, 要计算大量的行列式,所需乘法次数大约为
N=(n2-1)n!
当 n 较大时,这个计算量是惊人的。例 如,当 n= 20 时,约需乘法次数为 N=9.7×1020 如果用每秒一亿次的计算机来计算,需要三十万年时 间。可见Gramer法则不是一种实用的方法。 因此,必须构造出适合于计算机使用的线性方程组的求 解方法。
b
( 2) i
b
(1) i
l i 1b
(1) 1
, i 2,3, , n
第二步,设 a22(2)≠ 0 ,将第二列a22(2)以下各元素消成零,
即依次用
li 2
2 a i(2 ) ( 2) a 22
(i=3,4,…,n)
乘以矩阵[A(2),b(2)]的第二行再加到第i行,得到矩阵
这是与原线性方程组(5.1)等价的方程组.
(1 (1 ( ( a11) x1 a12) x 2 a11) x n b11) n (2 ( ( a 22) x 2 a 22 ) x n b22 ) n 对于等价方程组 ( n 1 ) ( n 1 ) ( n 1 ) a n 1n 1 x n 1 a n 1n x n bn 1 (n ( a nn) x n bnn )
(1 a12) (1 a 22) (1 a 32)
(1 a13) (1 a 23) (1 a 33)
( a11) n ( a 21) n ( a 31) n
( a n1) 2
( a n1) 3
5.2.3列主元素消去法
主元
0.000100 A ( A, b) 1
m21 10000
1 1 1 2
9999
1 1 0.000100 4 4 0 1 . 00 10 1 . 00 10
回代后得到
x1 0.00 , x2 1.00
§
例1.
Gauss列主元消去法
一、Gauss列主元消去法的引入 用Gauss消去法解线性方程组(用3位十进制浮 点数计算)
0.0001x1 x2 1 x1 x2 2
解: 本方程组的精度较高的解为
x* (0.99989999 ,1.00010001 )T
用Gauss消去法求解(用3位十进制浮点数计算)
经过回代后可得
(3) b3 0.685 138 54 x3 ( 3 ) 0.367 257 39 a 33 0.186 555 41 10
(2) (2) b2 a23 x3 0.5 0.18015 10 x3 0.05088607 x2 (2) 0.3176 10 a22 ( 1) ( 1) ( 1) b1 a12 x2 a13 x3 x1 0.49105820 ( 1) a11
2 r1 r3 1 108
m21 3.712 4.623 2 2 3 1
(A ,b )
( 1) ( 1)
绝对值最大 不需换行
2 1.072 5.643 3 0 0.3176 10 0.18015 10 0.5 0 0 . 2 10 0 . 3 10 0 . 1 10
m32 0.629 722 92
(A ,b )
解线性方程组的列主元素高斯消去法和lu分解法
数值试验报告分析一、实验名称:解线性方程组的列主元素高斯消去法和LU 分解法二、实验目的及要求:通过数值实验,从中体会解线性方程组选主元的必要性和LU 分解法的优点,以及方程组系数矩阵和右端向量的微小变化对解向量的影响。
三、算法描述:本次试验采用的是高斯列主元消去法和LU 分解法求解线性方程组的解。
其中,高斯消去法的基本思想是避免接近于零的数作分母;能进行到底的条件:当A 可逆时,列主元Gauss(高斯)消去法一定能进行到底。
优点:具有很好的数值稳定性;具有与顺序Gauss 消去法相同的计算量。
列主元Gauss(高斯)消去法的精度显著高于顺序Gauss(高斯)消去法。
注意:省去换列的步骤,每次仅选一列中最大的元。
矩阵的三角分解法是A=LU,L 是下三角阵,U 是上三角阵,Doolittle 分解:L 是单位下三角阵,U 是上三角阵;Crout 分解:L 是下三角阵,U 是单位上三角阵。
矩阵三角分解的条件 是矩阵A 有唯一的Doolittle 分解的充要条件是A 的前n-1顺序主子式非零;矩阵A 有唯一的Crout 分解的充要条件是A 的前n-1顺序主子式非零。
三角分解的实现是通过(1)Doolittle 分解的实现; (2)Doolittle 分解的缺点:条件苛刻,且不具有数值稳定性。
(3)用Doolittle 分解求解方程组: AX=b LUX=b LY=bA=LU UX=Y ;四、实验内容:解下列两个线性方程组(1) ⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--11134.981.4987.023.116.427.199.103.601.3321x x x (2) ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----15900001.582012151526099999.23107104321x x x x a 、用你熟悉的算法语言编写程序用列主元高斯消去法和LU 分解求解上述两个方程组,输出Ax=b 中矩阵A 及向量b, A=LU 分解的L 及U ,detA 及解向量x.b 、将方程组(1)中系数3.01改为3.00,0.987改为0.990,用列主元高斯消去法求解变换后的方程组,输出列主元行交换次序,解向量x及detA,并与(1)中结果比较。
高斯列主元消去法
问题提出:采用高斯列主元消去法解线性方程组。
算法(公式)推导:高斯顺序消去法有一个最大的缺点就是一旦对角元素为0,就进行不下去了,为了解决这个问题就有了高斯主元消去法。
如果在高斯顺序消去法消去过程进行到第i 步时,先选取a ri ()n r i ≤≤中(即第i 列)绝对值最大的元素,设为第j 行的元素aji ,然后将第i+1行至第n 行中的每一行减去第i 行乘以ii kj a a (k 代表行号),依次进行消元,这样得到的算法叫高斯按列主元消去法。
高斯按列主元消去法的算法步骤介绍如下:1. 将方程组写成以下的增广矩阵的形式: 432144434241343332312423222114131211b b b b a a a a a a a a a a a a a a a a 2. 对k=1,2,3,…..,n-1,令∑==nk s sk pk a a max ,交换增广矩阵的第k 行与第p 行;对j=k+1,K+2,……..,n,计算*km jkjm jm kk a a a a a =-(m=k,k+1,....n)kk jk k j j a a b b b *-=算法结束。
3. 在MATLABE 中编程实现的高斯按列主元消去法函数为:GaussXQLineMain功能:高斯按列主元消去法求线性方程组Ax=b 的解调用格式:[x,XA]=GaussXQLineMain(A,b)其中,A :线性方程组的系数矩阵;B:线性方程组中的常数向量;x:线性方程组的解:XA:消元后的系数矩阵(可选的输出参数)。
高斯列主元消去法用MATLAB实现如下所示:4.其中用到上三角矩阵求解函数:在MATLABE中编程实现的上三角系数矩阵求解函数为:SolveUPTriangle 功能:求上三角系数矩阵的线性方程组Ax=b的解调用格式:x=SolveUpTriangel(A,b)其中,A :线性方程组的系数矩阵;b :线性方程组中的常数向量; X :线性方程组的解;上三角系数矩阵求解函数用MATLAB 实现如下所示:高斯按列主元消去法解线性方程组应用实例:用高斯按列主元消去法求解下列线性方程组的解。
2.2Gauss消去法
可类似求得其解为
c1 x1 = l , 11 k 1 ck lkj x j j 1 xk , lkk
(2.2.6)
k 2,3, , n.
2.2.2 Gauss消去法
由于三角方程组的求解较为简单,对于一般的线性方程组 (2.1.2) , 若能通过同解变换将其化为上三角方程组或下三角方程 组,则求解方程组 (2.1.2) 的问题就解决了. Gauss消去法就是 基于这一基本思想. 记线性方程组(2.1.2)的增广矩阵为 a11 a12 a1n a a22 a2 n 21 A | b an1 an 2 ann
( k 1) | b( k 1) 中第 k 列的 a k 1, k , ,
( k 1) ( k 1) lik aik / akk , i k 1,, n.
( k 1) 将 A
(2.2.8)
| b( k 1) 中的第k 行乘以 lik,然后加到第i行上(i
作3060次乘除法, 而由第2.1节知Gramer法则则需作9.707 1020次 乘除法.由此可见,Gauss消去法的计算量远远小于Gramer法则 的计算量. Gauss消去法(不作行交换)能顺利进行到底的条件是主
(1) ( n 1) 元a11 , a22 ,, ann 均不为零下面定理给出了系数矩阵 . A满足这一
一般地,设已求得xn , xn1 ,, xk 1,则由(2.2.1)的第 k 个方程 可解得
xk ck
j k 1
u
ukk
n
kj
xj , k n 1, n 2,,1.
(2.2.4)
上述求解上三角方程组(2.2.1)解的过程称为回代过程. 1 回代过程需作 n( n 1)次乘除法运算. 2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贵州师范大学数学与计算机科学学院学生实验报告
课程名称:数值分析班级:数本(一)班实验日期:年月日
学号: 0098(81)姓名:吴胜指导教师:杨一都
实验成绩:一、实验名称
实验五:线性方程组的数值解法
二、实验目的及要求
1. 让学生掌握用列主元gauss消去法、超松弛迭代法求解线性方程组.
2. 培养Matlab编程与上机调试能力.
三、实验环境
每人一台计算机,要求安装Windows XP操作系统,Microsoft office2003、(或.
四、实验内容
1. 编制逐次超松弛迭代(SOR迭代)函数(子程序),并用于求解方程组
⎪⎪⎩⎪⎪⎨⎧=-++=+-+=++-=+++-1
4141414432143214
3214321x x x x x x x x x x x x x x x x
取初始向量T x )1,1,1,1()0(=,迭代控制条件为 5)1()(102
1
||||--⨯≤-k k x x 请绘制出迭代次数与松弛因子关系的函数曲线,给出最佳松弛因子.SOR 迭代的收敛速度是否一定比Gauss-Seidel 迭代快 2. 编制列主元 Gauss 消去法函数(子程序),并用于解
⎪⎩⎪
⎨⎧=++-=-+-=+-6
15318153312321
321321x x x x x x x x x 要求输出方程组的解和消元后的增广矩阵. 注:题2必须写实验报告
五、算法描述及实验步骤
Gauss 消去法: 功能 解方程组b Ax = .
输入 n ,n n ij a A ⨯=)(,T n b b b b ),,,(21 =.
输出 方程组的解T n x x x x ),,,(21 =或失败信息. 步1 对1,,2,1-=n k 执行步2→步4 . 步2 调选列主元模块 .
步3 若0=kk a ,则=x “消去法失败”,结束 . 步4 对n k k i ,,2,1 ++=执行步5→步6 .
步5 对n k k j ,,2,1 ++=执行ij kj kk ik ij a a a a a +⨯-⇐/ . 步6 i k kk ik i b b a a b +⨯-⇐/ . 步7 nn n n a b x /⇐ .
步8 对1,,2,1 --=n n i 执行ii n
i j j ij
i i a x a
b x /)(1
∑+=-
⇐ .
步9 输出T n x x x x ),,,(21 = . 选列主元模块: 功能 选列主元 .
输入 n k k i b n k k j i a i ij ,,1,,;,,1,,, +=+= . 输出 n k k i b n k k j i a i ij ,,1,,;,,1,,, +=+= . 步1 kk a m ⇐;k l ⇐ .
步2 对n k k i ,,2,1 ++=执行若m a ik >则ik a m ⇐;i l ⇐ . 步3 若k l ≠,则交换kj a 和lj a ,n k k j ,,1, +=;交换k b 和l b . 步4 返回主模块 .
六、调试过程及实验结果
>>
A=[12,-3,3;-18,3,-1;1,1,1]; >> b=[15;-15;6];
>> x=Gauss1(A,b)
Ab =
0 0 0
index =
1
x =
七、总结
由于数)1(-k
kk
a在Gauss消去法中有着突出的作用,第k步消元时,
要用)1(-k
kk
a作除数,如果)1(-k kk a=0消元会失败,即使主元)1(-k kk a≠0,但很小时,舍入误差也会使计算结果面目全非,避免这种缺陷的基本方法就是选主元。
通过选主元,就可避免绝对值小的数作除数,从而避免舍入误差的恶性增长,使得Gauss列主元消去法是解中小规模的线性方程组和某些大型稀疏线性方程组的有效方法。
八、附录(源程序清单)
function [x,index]=Gauss1(A,b)
[n,m]=size(A);x=zeros(n,1); index=1
for k=1:n-1
a_max=0;
for i=k:n
if abs(A(i,k))>a_max
a_max=abs(A(i,k));r=i;
end
end
if a_max<1e-10
index=0;return;
end
if r>k
for j=k:n
z=A(k,j);A(k,j)=A(r,j);A(r,j)=z;
end
z=b(k);b(k)=b(r);b(r)=z;
end
for i=k+1:n
m=A(i,k)/A(k,k);
for j=k:n
A(i,j)=A(i,j)-m*A(k,j);
end
b(i)=b(i)-m*b(k);
end
end
if abs(A(n,n))==0
index=0;return;
end
Ab=[A,b]
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
for j=i+1:n
b(i)=b(i)-A(i,j)*x(j);
end
x(i)=b(i)/A(i,i);
end。