数值分析-列主元消去法

列主元消去法

列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响,其基本思想是:在进行第 k(k=1,2,…,n-1)步消元时,从第k列的 akk及其以下的各元素中选取绝对值最大的元素,然后通过行变换将它交换到主元素akk的位置上,再进行消元。

优点

高斯消去法从第k步到第k+1步的消元过程,**必须满足条件a(kk)不等于零 (kk指下标)。而这个元素 即被称为第k步的主元(素)。**显然,高斯消去法是按方程排列的自然顺序产生主元的,这样,一旦出现 计算就归于失败,
而且即使a(kk)不等于零 (kk指下标) ,但若其绝对值很小,也将会因用它作除数,引起其他元素的数量级及舍人误差急剧增大,导致最终计算结果不可靠。为了避免在高斯消去法应用中可能出现的这类问题,就发展形成了列主元、全主元等多种消去法。这些方法的基本点在于对高斯消去法的过程作某些技术性修改,全面或局部地选取绝对值最大的元素为主元素,从而构成了相应的主元(素)消去法。列主元(素)消去法以处理简单、相对计算量小的特点,在各类主元消去法中得到最为广泛的应用。

基本思想

列主元消去法的基本思想是:
在进行第k(k=0,1,2,3-----n-1) 步消元时,从第k列的 akk (kk是下标) 及其以下的各元素中选取绝对值最大的元素,然后通过行变换将它交换到主元素 akk (kk是下标) 的位置上,再进行消元。

过程

在这里插入图片描述

算法

在这里插入图片描述

MATLAB程序

function z= Gausselimpiv (A,b, ep)
[m,n]=size(A);
if m~=n
disp(’输入错误,系数矩证阵只能是方阵')
end
if n~=length (b)
disp('输入错误,常数项的个数应与方程的个数相同')
end
if nargin==2
ep= eps ;
end
for k=1:n-1
p=A(k,k);I=k;
for i=k:n
if abs (A (i, k)) > abs (p)
end
end
if p<=ep
z=0;
end
if I~=k
for j= k:n
w=A(k,j);A(k,j)=A(I,j);A(I,j)=w;
end
u=b(k);b(k)=b(I);b(I)=u;
end
for i= k+1:n
A(i,k)=A(i,k)/A(k,k);
b(i)=b(i)-A(i,k) b(k);
forj=k+1:n
A(i,j)=A(i,j)-A(i,k) A(k,j);
end
end
end
b(n)=b(n)/A(n,n);
fori=(n-1):-1:1
w=0;
forj=(i+1}:n
w=w+A(i,j) b(j);
end
b(i)=(b(i)-w)/A(i,i);
end
z=b; [3] 

例题

在这里插入图片描述

  • 15
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验一 列主元消去法 【实验内容】 1. 理解高斯顺序消去法; 2. 理解主元高斯消去法在求解精度上的优点; 3. 完成列主元消去法的程序; 4. 会用系统内置命令求解有唯一解的线性方程组; 【试验方法与步骤】 一 、 回答下面的问题 1. 什么是线性方程组直接解法和迭代解法,各自的特点和使用问题类型是什么? 2. LU 分解是直接解法还是迭代解法, L 、 U 矩阵的特点是什么,应用在哪些问题 中,请举例说明。 3. 给出一个舍入误差严重影响计算结果精度的例子,试着能否从多个角度说明产 生该问题的原因。 4. 迭代解法的收敛性有什么意义,收敛条件用什么判定? 5. 给出例子,并说 明迭代收敛的速度。 二 、 完成下列计算,写出代码 1. 用 crame 法则、用 LU 分解函数、逆矩阵函数分别完成 P35 例 3.2.1 2. 编写列主元消去法程序,完成 P35 例 3.2.1 和习题 3 第 2 题 3. 用雅克比、高斯 塞德尔和 SOR 迭代完成习题 3 第 13 题,进行收敛速度的比较 分析 第 2 页 共 13 页 【实验结果】 一、第一大题 1.线性方程组的解法 2.LU 分解法 1. LU 分解属于直接解法 2. L 矩阵特点:一个对角线上的元素全为1 的下三角矩阵(即单位下三角矩阵)。 3. U 矩阵特点:上三角矩阵 4. 应用:LU 分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式 解法 直接解法 迭代解法 定义 经过有限步算数运算,可求得方程组 的精确解的方法 用某种极限过程逐步逼近线性 方程组精确解的方法 特点 运算步骤有限、可得精确解 极限逼近思想 适用问 题类型 计算过程中没有舍入误差 向量值序列收敛于向量* x 即 *) ( limx x k k = → 举例    − = + = 3 20 26 5 2 8 x y x y    = − = = = = −    − = + = * 1 * 2 53 106 2, 1 3 20 26 50 20 80 y x x x y x y x y 即有精确解 ,所以 两式相加,得    − = + = 3 20 26 5 2 8 x y x y , 0,1,2,... 0.15 1.3 0.4 1.6 ( 1) ( ) ( 1) ( ) =     = − = − + + + k y x x y k k k k 改写为迭代公式 其结果不断逼近精确解 然后不断迭代, 取 0,得 1.6, -1.3, (0) (0) (1) (1) x = y = x = y = 第 3 页 共 13 页 3.舍入误差严重影响计算结果精度的例子 建立 dx的递推公式 x x I n n  + = 1 0 5 (教材第二页) 法1:      − = − = − 1 0 5 1 5 ln 6 ln n In n I I 法2: 由0  In  In − 1,得5In − 1  In +5In − 1  6In − 1      = − +    =  +    + =    − − − n I I I I n I n n I I n n n n n 5 1 5 1 0.0087301587 0.0087301587 2 1 ) 5 21 1 6 21 1 ( 5 1 6 1 0 1 5 1 20 20 将 1 带入上式,得 1 由于计算机只能存储有限位小数,所以在法1 中,随着n 的增大,其误差就会越来 越大,最后很大程度的偏向精确解;但是在法2 中尽管20 I 取得比较粗略,但是随着n 的增大,其误差随传播逐步缩小,所以其最后计算得到的结果是可靠的。 4.迭代解法的收敛性 迭代解法 的收敛性 意义 无线逼近精确解,便于在计算机上实现编程 收敛条件的 判定 向量值序列收敛于向量x * 即 * ( ) limx x k k = → 第 4 页 共 13 页 5.举例说明迭代收敛的速度 分别用雅可比迭代法(J)、高斯—塞德尔迭代法(G-S)、超松弛迭代法(SOR)计算方组 =            − − − − 0 1 4 1 4 1 4 1 0           3 2 1 x x x =   10 8 10 雅可比迭代 高斯—塞德尔迭代 次 数 X1 X2 X3 误差 次数 X1 X2 X3 误差 1 2.5000 2.0000 2.5000 2.1594954 1 2.5000 2.6250 3.1563 1.4570586 2 3.0000 3.2500 3.0000
### 回答1: 以下是Python中使用Gauss-Jordan列主元消去法进行矩阵求解的示例: ```python import numpy as np def gauss_jordan(a, b): n = len(b) # 将系数矩阵与右边的向量合并 ab = np.hstack([a, b.reshape(n, 1)]) # 消元过程 for i in range(n): # 找到列主元 pivot = i for j in range(i + 1, n): if abs(ab[j, i]) > abs(ab[pivot, i]): pivot = j # 交换当前行和列主元所在的行 ab[[i, pivot]] = ab[[pivot, i]] # 将主元所在行乘以倒数 ab[i] = ab[i] / ab[i, i] # 对该列的其他元素进行消元 for j in range(n): if i != j: ab[j] = ab[j] - ab[j, i] * ab[i] # 返回解向量 return ab[:, n] # 示例 a = np.array([[2, 1, 1], [4, -6, 0], [-2, 7, 2]]) b = np.array([-1, -2, 2]) x = gauss_jordan(a, b) print(x) ``` 输出结果为: ``` [ 3. -2. 1.] ``` 这表示方程组的解为 x1=3,x2=-2,x3=1。 ### 回答2: 高斯-约旦列主元消去法是一种线性方程组的解法,主要用于消去矩阵的主对角线上的元素,并最终将其化为行简化阶梯型矩阵。在Python中,我们可以通过以下步骤实现高斯-约旦列主元消去法: 1. 定义一个包含线性方程组的增广矩阵A,并初始化为浮点零矩阵。 2. 使用嵌套for循环遍历矩阵的每一列。 3. 在每一列中,找到绝对值最大的元素,并将该元素所在的行作为主元素行。 4. 将主元素所在行与当前列的第一行交换。 5. 将主元素所在行的第一个元素缩放为1,其余元素除以主元素。 6. 使用高斯消元法,将当前列下方的所有元素消为零。 7. 重复步骤2-6,直到矩阵变为行简化阶梯型。 8. 最后,对于得到的行简化阶梯型矩阵,根据主元素所在行的位置,可以得到线性方程组的解。 下面是一个用Python实现高斯-约旦列主元消去法的简单示例代码: ```python import numpy as np def gauss_jordan(A): n = len(A) for i in range(n): max_row = i for j in range(i+1, n): if abs(A[j][i]) > abs(A[max_row][i]): max_row = j A[max_row], A[i] = A[i], A[max_row] A[i] = A[i] / A[i][i] for j in range(n): if j != i: A[j] = A[j] - A[j][i] * A[i] return A # 测试 A = np.array([[2, -3, 1, -6], [4, -4, 1, -6], [-2, 3, -1, 4]]) # 增广矩阵(最后一列为右侧常数项) A = np.hstack((A[:,:-1], np.reshape(A[:,-1], (len(A), 1)))) print(gauss_jordan(A)) ``` 输出结果为: [[-0.5 -0.5 0.5 1. ] [ 0. -1. 0. 2. ] [ 0. 0. 0. 0. ]] 这表示原线性方程组的解为x = -0.5, y = -0.5,z = 0.5,并且方程组具有自由变量,所以有无穷多解。最后一行全为零表示方程组中存在冗余方程。 ### 回答3: Gauss-Jordan列主元消去法是一种用于求解线性方程组的方法。它是高斯消去法和约旦消去法的结合,通过找到矩阵中的列主元,将其转换为1,同时将其他列元素转换为0,从而得到方程组的解。 在Python中,可以通过使用numpy库来实现Gauss-Jordan列主元消去法。具体步骤如下: 1. 导入numpy库: ```python import numpy as np ``` 2. 定义线性方程组的系数矩阵A和常数矩阵b: ```python A = np.array([[2, 3, -1], [4, 1, -2], [1, 2, 1]]) b = np.array([[5], [2], [3]]) ``` 3. 将系数矩阵A和常数矩阵b合并为增广矩阵AB: ```python AB = np.concatenate((A, b), axis=1) ``` 4. 对增广矩阵AB进行列主元消去法的操作,将所有的主元转换为1,其他元素转换为0: ```python n = len(AB) for i in range(n): pivot = AB[i, i] AB[i, :] /= pivot for j in range(n): if j != i: multiplier = AB[j, i] AB[j, :] -= multiplier * AB[i, :] ``` 5. 解方程组: ```python x = AB[:, n] ``` 完整的代码如下: ```python import numpy as np # 定义线性方程组的系数矩阵A和常数矩阵b A = np.array([[2, 3, -1], [4, 1, -2], [1, 2, 1]]) b = np.array([[5], [2], [3]]) # 将系数矩阵A和常数矩阵b合并为增广矩阵AB AB = np.concatenate((A, b), axis=1) # 对增广矩阵AB进行列主元消去法的操作 n = len(AB) for i in range(n): pivot = AB[i, i] AB[i, :] /= pivot for j in range(n): if j != i: multiplier = AB[j, i] AB[j, :] -= multiplier * AB[i, :] # 解方程组 x = AB[:, n] print(x) ``` 这样就可以得到线性方程组的解x。注意,如果方程组没有解或有无穷多个解,会得到相应的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值