列主元素消去法的Matlab实现
一、Gauss消去法与列主元素消去法的联系与区别
Gauss消去法有以下两个主要缺陷:
1)如果某个主元akk=0,则消元无法进行;
2)在akk=0,但相对很小,当其作为除数时,会导致其他元素数量级的增长,容易造成严重的舍入误差。
而主元素消去法则是对Gauss消去法存在的两个主要问题的一种解决方法。
联系:主元素消去法本质上还是Gauss消去法,前者克服了后者存在的主要缺陷;两种方法都只适合于低维的计算。
区别:主元素消去法的鲁棒性更强,但计算量比Gauss相对来说要多出排序这一部分。
主元素消去法使用地比较多的是列主元素消去法,与Gauss消去法的主要区别是在进行第k次更新时,首先需要对第k列的第k行以及该列后续元素进行排序,并交换得到最大元素的行。由于消元过程与Gauss过程基本相同,回代过程完全一样,因此不再赘述,详细过程请参考《 Gauss消元法的Matlab实现 》
二、算法描述
1)消去过程
对k = 1,2,...,n-1,有:
(1)按列选主元,即:
(2)若,则停止计算(此时det(A)=0)
(3)若ik = k,则转向(4),否则换行,即:
(4)消元计算
对i = k+1, k+2, ..., n,
lik = aik/akk, (|lik |≤1),
对j = k+1, k+2, ..., n,
aij←aij - likakj,
bi←likbk
2)回代过程
1)若ann = 0,则停止计算,det(A) = 0,否则
bn←bn/ann
2)对i = n-1, n-2, ..., 1,
三、列主元素消去法的Matlab实现
实现代码如下:
主函数:
function [r_matrix,time_] = MainElementElimination(Coefficient_matrix,Load_matrix)
% 主元素消去法的matlab实现
% 2017-11-05 by xh_scu
% inputs:
% A_matrix:系数矩阵,维度为n*n
% B_matrix:载荷矩阵,维度为n*1
% outputs:
% result:未知量矩阵,维度n*1
% 计时开始
t1 = clock;
% 判断输入矩阵维度是否满足要求
[row_coeff,col_coeff] = size(Coefficient_matrix);
[row_load,~] = size(Load_matrix');
% 初始化r_matrix矩阵
r_matrix = zeros(row_load,1);
% 判断输入的维度是否满足要求
if (row_coeff ~= col_coeff) || (row_coeff ~= row_load) % if-1% 不满足则输出错误提示print('输入错误!');
else% 满足则进行下一步运算for k = 1:row_coeff-1 % for-1% 检查主对角元素第i行的第i个元素是否为0if Coefficient_matrix(k,k) == 0 % if-2print('主对角元素错误!');break;else% 找到第k列从第k行开始的最大元素% 获取第k列col_k = Coefficient_matrix(:,k);max_index = find_max(col_k,row_coeff,k); % 注:此处需要调用函数max_find()%如果最大值索引不是k,则交换第k行与max_index行if max_index ~= k % if-3for i_change = k:col_coeff % for-2temp = Coefficient_matrix(max_index,i_change);Coefficient_matrix(max_index,i_change) = Coefficient_matrix(k,i_change);Coefficient_matrix(k,i_change) = temp;end % for-2% 交换负荷矩阵temp_k = Load_matrix(k);Load_matrix(k) = Load_matrix(max_index);Load_matrix(max_index) = temp_k;end % if-3% 循环计算第k+1行到最后一行for i = k+1:row_coeff % for-3L_ik = Coefficient_matrix(i,k) / Coefficient_matrix(k,k); %更新L_ik% 更新每一行从第i个元素开始后的所有元素for j = k+1:col_coeff % for-4Coefficient_matrix(i,j) = Coefficient_matrix(i,j) - ...L_ik*Coefficient_matrix(k,j); % 更新a(i,j)end % for-4Load_matrix(i) = Load_matrix(i) - Load_matrix(k)*L_ik; % 更新b(i)Coefficient_matrix(i,1) = 0; end % for-3end % if-2end % for-1% 回代过程r_matrix(row_coeff) = Load_matrix(row_coeff)/Coefficient_matrix(row_coeff,col_coeff);for k = row_coeff-1:-1:1 % for-5sum_temp = 0;for j = k+1:col_coeff % for-6sum_temp = sum_temp + Coefficient_matrix(k,j)*r_matrix(j);end % for-6r_matrix(k) = (Load_matrix(k) - sum_temp)/Coefficient_matrix(k,k);end % for-6
end % if-1
% 计时结束
t2 = clock;
time_ = etime(t2,t1);
end % 函数结束
子函数:
%% 寻找第k列从第k行开始的最大元素
function [max_index] = find_max(input_k,row_,k)
% inputs:
% input_k:第k列的所有元素
% row_ :矩阵的总行数
% k :第k列序号
% outputs:
% max_index:第k列从第k行以后最大元素的行下标% 初始化参数
max_index = k;
max_val = input_k(k);
for i = k:row_ % for-1if max_val < input_k(i) % if-1max_val = input_k(i);max_index = i;end % if-1
end % for-1
end
四、测试与分析
设有如下方程组:
则矩阵A与B分别为:
调用代码:
a = [1,1,-5,1;1,-3,0,-6;0,2,-1,2;1,4,-7,6];
b = [8,9,-5,0];
[result,time] = MainElementElimination(a,b);
计算结果为:
与准确结果[-9,-10/3,-13/3,-3/4]'相等(存在计算舍入误差)。
有兴趣的小伙伴还可以测试一下代码的计算效率,从理论上来讲,主元素消去法比Gauss消去法计算量更大,计算时间更长。这里就不再做进一步分析了。
列主元素消去法的Matlab实现相关推荐
- 数值线性代数之列主元Gauss消去法(MATLAB)
1. 这是啥? 在使用Gauss变换的过程中,如果矩阵对角线的元素太小,会干扰计算结果,所以我们尽量把每列较大的元素通过行变换挪到对角线上. 2. 第二个红框只是普通的Guass变换,第一个红框就是选 ...
- 高斯主元素消去法c语言,列主元Gauss消去法(C++实现)
列主元Gauss消去法(C++) 目的:编写解n阶线性方程组AX=b的列主元三角分解法的通用程序: 原理:列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响 ...
- matlab之列主元素高斯消去法
技术小白的我第一次接触MATLAB这个软件,今早上课学习了高斯列主元素高斯消去法,不是很熟练,决定用matlab写一个可以完成这个算法的小程序以加深自己对这个算法的印象.借鉴了网上给的各种代码,基本大 ...
- 数值分析3-解线性方程组的高斯消去法、LU分解法及列主元消去法的matlab程序和调试方法
对于形如Ax=b的线性方程组,在线性代数中是通过求逆的方式求解的,即x=A-1b,而在数值分析中,解线性方程组的方法是通过直接法或者迭代法来实现的,今天写的三个程序都属于直接法,分别为高斯消去法.LU ...
- 数值分析-列主元消去法
列主元消去法 列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响,其基本思想是:在进行第 k(k=1,2,-,n-1)步消元时,从第k列的 akk及其以下的 ...
- matlab求解代数方程组,matlab求解代数方程组.doc
matlab求解代数方程组.doc 1第三讲Matlab求解代数方程组理论介绍:直接法+迭代法,简单介绍相关知识和应用条件及注意事项软件求解:各种求解程序讨论如下表示含有个未知数.由个方程构成的线性方 ...
- 列主元高斯消元法(Python实现)
列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响,其基本思想是:在进行第 k(k=1,2,...,n-1)步消元时,从第k列的 akk及其以下的各元素中选 ...
- C#,数值计算,高斯消元法与列主元消元法的源代码及数据动态可视化
高斯消元法! 一.高斯消元法 Gaussian Elimination 高斯消元法(或译:高斯消去法),是线性代数中的一个常用算法,常用于求解线性方程组和矩阵的逆. 本程序的运行效果: 1.高斯消元法 ...
- 高斯列主元消元法求解线性方程组
一.高斯消去法的基本思想 例1. 解方程组: 解 方程组矩阵形式为: AX=b ,其中: 第一步,消元过程:对增广矩阵进行消元 即 ...
最新文章
- 20155303 2016-2017-2 《Java程序设计》第二周学习总结
- python 柱状图-python 柱状图
- 利用javascript onclick实现网页跳转
- String Primitive和String Object
- Windows7下UEFI开发EDK2环境搭建(VS2013+UDK2015+IASL+patch+Openssl)
- 下载的ContentType设置
- Flash遮罩之溜光字制作二
- 2019字节跳动实习面试
- 推荐3个干净、资源多的看剧网站给大家
- 书架html特效代码,原生JS写的一个书架式的图片缩放滚动展示特效代码
- a4纸尺寸是多少厘米 a4纸是多少k2022
- 031:vue+openlayers加载GPX数据(代码示例)
- wwbizsrv.exe-应用程序错误
- vue-amap 实现定位+跑步路程+跑步时间计算功能
- Learn Computer Vision-计算机视觉学习
- php1.6t发动机机油选择,1.6t用什么机油选择啊!?
- 关于 pygame中,检测按键按下
- 部署DNS从服务失败,nslookup访问www.linuxprobe.com失败
- CIMPLICITY标签导入导出功能简单介绍
- 正则表达式:不匹配特定的字符串
热门文章
- 调用HINSTANCE hInst = AfxGetInstanceHandle();程序在ASSERT(afxCurrentInstanceHandle != NULL);崩溃
- 世界上排名前100的英文歌详细名单及介绍
- 面向接口编程的个人理解
- 74LS139改3―8线译码器_数字译码器
- 2022电大国家开放大学网上形考任务-建设项目管理非免费(非答案)
- MySQL之DML操作
- python编程语言可以做游戏吗_python合不合适用来写游戏
- 数据分析,如何挖掘业务机会
- WPF 从最底层源代码了解 AllowsTransparency 性能差的原因
- 超可爱的文字表情大全 (ーー゛) (--〆)zz~~~~