列主元消去法
列主元消去法解方程组实验报告

实验名称:列主元消去法解方程组1 引言我们知道,高斯消去法是一个古老的解线性方程组的方法。
而在用高斯消去法解Ax=b时,其中设A为非奇异矩阵,可能出现的情况,这时必须进行带行交换的高斯消去法。
但在实际计算中即使但其绝对值很小时,用作除数,会导致中间结果矩阵元素数量级严重增长和舍入误差的扩散,使得最后的结果不可靠。
因此,小主元可能导致计算的失败,我们应该避免采用绝对值很小的主元素。
为此,我们在高斯消去法的每一步应该在系数矩阵或消元后的低阶矩阵中选取绝对值最大的元素作为主元素,保持乘数,以便减少计算过程中舍入误差对计算解的影响。
一种方式是完全主元消去法,这种消去法是在每次选主元时,选择为主元素。
这种方法是解低阶稠密矩阵方程组的有效方法,但这种方法在选取主元时要花费一定的计算机时间。
实际计算中我们常采用部分选主元的的消去法。
列主元消去法即在每次选主元时,仅依次按列选取绝对值最大的元素作为主元素,且仅交换两行,再进行消元计算。
2 实验目的和要求运用matlab编写一个.m文件,要求用列主元消去法求解方程组(实现PA=LU):要求输出以下内容:(1)计算解x;(2) L,U;(3)整形数组IP(i)(i=1,2,…,n-1)(记录主行信息)3 算法原理与流程图(1)算法原理设有线性方程组Ax=b,其中设A为非奇异矩阵。
方程组的增广矩阵为第1步(k=1):首先在A的第一列中选取绝对值最大的元素,作为第一步的主元素:,然后交换(A,b)的第1行与第i1行元素,再进行消元计算。
设列主元素消去法已经完成第1步到第k-1步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组第k步计算如下:对于k=1,2,…,n-1(1)按列选主元:即确定ik使(2)如果,则A为非奇异矩阵,停止计算。
(3)如果ik≠k,则交换[A,b]第ik行与第k行元素。
(4)消元计算消元乘数满足:(5)回代求解计算解在常数项b(n)内得到。
列主元高斯消去法例题

列主元高斯消去法例题
高斯列主元消去法是一种常用的线性方程组求解方法,它通过利用矩阵的列主元部分进行消元,从而得到线性方程组的解向量。
下面是一个例题:
给定以下线性方程组:
```
2x + 3y + z = 7
4x - 5y - 2z = 3
x + 3y - 2z = 2
```
使用高斯列主元消去法求解,首先我们需要将系数矩阵 A 表示为列主元矩阵的形式:
```
2 3 1 | 7
4 -
5 2 | 3
1 3 -
2 | 2
```
然后,我们可以使用消元法逐步将系数矩阵 A 化为上三角矩阵: ```
2 3 1 | 7
0 0 1 | -1
0 0 0 | 0
1 3 -
2 | 2
```
最后,我们利用得到的上三角矩阵求解线性方程组的解向量: ```
x = (-3*7 + 4*2 - 1*2) * 1/2 = -1
y = (2*7 - 3*2 + 1*2) * 1/2 = 1
z = (2*7 - 4*2 - 1*2) * 1/2 = -3
```
因此,线性方程组的解向量为:x = -1, y = 1, z = -3。
高斯列主元消去法的优点在于其稳定可靠,能够快速求解线性方程组的解向量,尤其是对于大型线性方程组,其计算效率更高。
同时,它也能够很好地处理线性方程组中的符号问题,使得求解过程更加稳定。
求逆矩阵的四种方法

求逆矩阵的四种方法逆矩阵是指一个矩阵与其逆矩阵相乘得到单位矩阵,也是线性代数中的重要概念之一。
但是,在实际应用中,需要对矩阵求逆的情况并不多,因为矩阵求逆的时间复杂度很高。
下面介绍四种求逆矩阵的方法:1. 初等变换法:采用列主元消去法(高斯-约旦消元法)进行初等变换,即将一个矩阵通过行变换,转化为一个行阶梯矩阵,其中行阶梯矩阵的左下方的元素均为零。
而这样一个变换后得到的矩阵实际上就是原矩阵的逆矩阵。
2. 伴随矩阵法:如果一个矩阵 A 可逆,则求它的逆矩阵等价于求它的伴随矩阵 AT 的结果除以 A 的行列式。
伴随矩阵的计算式为:adj(A)= COF(A)T,其中 COF(A) 为 A 的代数余子式组成的矩阵,它的每个元素满足 COF(A)ij = (-1)^(i+j) det(Aij),其中 det(Aij) 表示将第 i 行和第 j 列去掉后得到的子矩阵的行列式。
3. LU 分解法:LU 分解法是将矩阵分解为一个下三角矩阵 L 和一个上三角矩阵 U 的乘积,即 A = LU,其中 L 的对角线元素均为 1。
当矩阵 A 可逆时,可用 LU 分解求解其逆矩阵。
假设 L 和 U 都是方阵,则A 的逆矩阵为:A^(-1) = (LU)^(-1) = U^(-1)L^(-1)。
4. 奇异值分解(SVD)方法:当矩阵 A 是非方阵时可以采用奇异值分解法,将矩阵 A 分解为A = UΣV^T,其中 U 为一个m×m 的正交矩阵,V 为一个n×n 的正交矩阵,Σ 为一个m×n 的矩形对角矩阵,若r 是 A 的秩,则Σ左上角的 r 个元素不为 0,其余元素为 0,即Σ有 r 个非零奇异值。
当A 可逆时,Σ 中的非零元素都存在逆元,逆矩阵为:A^(-1) = VΣ^(-1)U^T。
综上所述,求逆矩阵的四种方法各有特点,应根据实际情况选择合适的方法进行求解。
初等变换法适合较小规模的矩阵,伴随矩阵法适用于计算代数余子式较容易的矩阵,LU 分解法适合较大规模的矩阵,而SVD 方法则适用于非方阵或奇异矩阵的情况。
线性方程组的解法教案

线性方程组的解法教案一、引言线性方程组是数学中常见的一个重要概念,解决线性方程组问题是解析几何、线性代数等学科的核心内容。
本文将介绍线性方程组的基本概念和解法,帮助读者更好地理解和应用线性方程组。
二、线性方程组的基本概念1. 定义:线性方程组由一组线性方程组成,每个方程中的未知数的最高次数都为1,且系数皆为实数或复数。
线性方程组可以表示为以下形式:a₁x₁ + a₂x₂ + ... + aₙxₙ = b₁a₁x₁ + a₂x₂ + ... + aₙxₙ = b₂...a₁x₁ + a₂x₂ + ... + aₙxₙ = bₙ其中,a₁、a₂、...、aₙ分别为系数,x₁、x₂、...、xₙ为未知数,b₁、b₂、...、bₙ为常数项。
2. 解的概念:对于线性方程组,找到一组使得所有方程都成立的值,即为其解。
如果线性方程组存在解,则称其为相容的;如果不存在解,则称其为不相容的。
三、线性方程组的解法1. 列主元消去法列主元消去法是解决线性方程组的常用方法之一。
具体步骤如下:(1) 将线性方程组化为增广矩阵形式,写成增广矩阵[A|B]的形式。
(2) 对增广矩阵进行初等行变换,化简成上三角形矩阵[U|C]的形式,即上面的元素都为0。
(3) 从最后一行开始,按列主元所在的列进行回代求解,得到每个未知数的值。
2. 矩阵的逆和逆的应用矩阵的逆是解决线性方程组的另一种有效方法。
具体步骤如下:(1) 将线性方程组化为矩阵形式,即AX = B。
(2) 若矩阵A可逆,即存在逆矩阵A⁻¹,则方程组的解可以表示为X = A⁻¹B。
3. 克拉默法则克拉默法则是解决线性方程组的另一种方法,适用于方程组的系数矩阵为方阵的情况。
具体步骤如下:(1) 将方程组的系数矩阵记为A,常数项矩阵记为B。
(2) 分别计算方程组系数矩阵的行列式D和将常数项矩阵替换为方程组系数矩阵第i列后的新矩阵Di的行列式Di,并计算比值di = Di / D。
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;}}} 运⾏截图: ⾄此完毕。
列主元素消去法

列主元素消去法列主元素消去法(Gauss-Jordan 消元法)是一种线性代数中常用的消元方法,用于求解线性方程组的解。
这种方法的基本思想是,将线性方程组的增广矩阵通过一系列的初等变换,化为一个阶梯矩阵或行简化阶梯矩阵,从而得到线性方程组的解。
具体步骤如下:构造增广矩阵,即将系数矩阵和常数矩阵组合成一个矩阵。
将增广矩阵转化为一个上三角矩阵(也叫阶梯矩阵)。
反向消元,将阶梯矩阵转化为一个行简化阶梯矩阵。
根据简化矩阵求解方程组。
这种方法的优点是计算简单、容易理解,且可避免误差的积累。
但是,如果矩阵的规模较大,运算量会很大,计算时间较长。
此时可以使用更高效的算法,如LU分解、QR分解等。
假设有一个 $n$ 个未知量和 $n$ 个方程的线性方程组,可以写成矩阵形式如下:$Ax = b$其中,$A$ 是一个 $n \times n$ 的系数矩阵,$x$ 是一个 $n \times 1$ 的未知量向量,$b$ 是一个 $n \times 1$ 的常数向量。
为了求解 $x$,可以将方程组的增广矩阵表示如下:$\begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1n} & b_{1} \ a_{21} & a_{22} & a_{23} & \cdots & a_{2n} & b_{2} \ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \ a_{n1} & a_{n2} & a_{n3} & \cdots & a_{nn} & b_{n} \end{bmatrix}$ 其中,$a_{ij}$ 表示矩阵的第 $i$ 行第 $j$ 列的元素。
常见的线性代数求解方法

常见的线性代数求解方法
1.列主元消去法
列主元消去法是一种经典的求解线性方程组的方法。
它通过将
方程组转化为上三角矩阵的形式来求解。
这个方法的关键在于选取
主元的策略。
一种常见的选取主元的策略是选择当前列中绝对值最
大的元素作为主元,然后进行消去操作,直到将矩阵转化为上三角
矩阵。
2.高斯-约当消去法
高斯-约当消去法是另一种常见的线性方程组求解方法。
它通
过消去矩阵的下三角部分来将线性方程组转化为上三角矩阵的形式。
这个方法也需要选择主元,常见的选择策略是选取当前行中绝对值
最大的元素作为主元,然后进行消去操作。
3.LU分解法
LU分解法是将矩阵分解为一对矩阵的乘积的方法。
这个方法的思想是先将矩阵分解为一个下三角矩阵和一个上三角矩阵,然后通过求解上三角矩阵和下三角矩阵的两个方程组来求解原始的线性方程组。
4.Jacobi迭代法
Jacobi迭代法是一种迭代求解线性方程组的方法。
它通过将原始的线性方程组转化为一个对角矩阵和另一个矩阵的乘积的形式,然后通过迭代求解这个对角矩阵和另一个矩阵的方程组来逼近线性方程组的解。
5.Gauss-Seidel迭代法
Gauss-Seidel迭代法是另一种迭代求解线性方程组的方法。
它与Jacobi迭代法类似,但是在每一次迭代中,它使用前一次迭代得到的部分解来更新当前的解。
这个方法通常比Jacobi迭代法收敛得更快。
以上是一些常见的线性代数求解方法。
每种方法都有其特点和适用范围,我们可以根据具体情况选择合适的方法来求解线性方程组的问题。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一 列主元消去法
【实验内容】1. 掌握列主元消去法的基本思路和迭代步骤
2. 并能够利用列主元的高斯消去法解任意阶数的线性方程组;
【实验方法与步骤】列主元消去法编写程序
1.列主元消去法基本思路
设有线性方程组Ax b =,设A 是可逆矩阵。
列主元消去法的基本思想就是通过列主元的选取将初等行变换作用于方程组的增广矩阵[]|B A b =,将其中的A 变换成一个上三角矩阵,然后求解这个三角形方程组。
2.列主元高斯消去法算法描述
将方程组用增广矩阵[]()(1)|ij n n B A b a ⨯+==表示。
步骤1:消元过程,对1,2,,1k n =-
(1) 选主元,找{},1,,k i k k n ∈+使得
,max k i k ik k i n
a a ≤≤= (2) 如果,0k i k a =,则矩阵A 奇异,程序结束;否则执行(3);
(3) 如果k i k ≠,则交换第k 行与第k i 行对应元素位置,k kj i j a a ↔,
,,1j k n =+;
(4) 消元,对,,i k n =,计算/,ik ik kk l a a =对1,
,1j k n =++,计算
.ij ij ik kj a a l a =- 步骤 2:回代过程:
(1) 若0,nn a =则矩阵奇异,程序结束;否则执行(2);
(2) ,1/;n n n nn x a a +=对1,
,2,1i n =-,计算
,11/n i i n ij j ii j i x a a x a +=+⎛⎫=- ⎪⎝⎭∑
习题3第一题程序如下
#include <stdio.h>
#include <math.h>
#define N 3
int I;
float max_value(float a[N][N+1],int n,int k) { float max;
int i;
max=a[k][k];
for(i=k+1;i<n;i++)
if(max<a[i][k])
{
max=a[i][k];
I=i;
}
return(max);
}
void change(float *p,float *q)
{
float temp;
temp=*p; *p=*q; *q=temp;
return;
}
main()
{float a[N][N+1]={{2,2,3,3},{4,7,7,1},{-2,4,5,-7}}; float x[N],max,m,*c,*d;
int k=0,q=0,n=N,i,j;
for(k=0;k<n && q==0;k++)
{
max=max_value(a,n,k);
if(max==0) q=1;
else
{ if(I!=k)
{
for(j=k;j<n+1;j++)
{
c=&a[I][j];
d=&a[k][j];
change(c,d);
}
}
for(i=k+1;i<n;i++)
{
m=a[i][k]/a[k][k];
for(j=0;j<n+1;j++)
a[i][j]=a[i][j]-a[k][j]*m;
}
}
}
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
a[i][3]=a[i][3]-a[i][j]*x[j];
x[i]=a[i][3]/a[i][i];
}
printf("得到的结果如下:\n");
for(i=0;i<n;i++)
printf(" x[%d]=% 6.4f\n",i+1,x[i]); }
【实验结果】
经检验运行结果正确。