《矩阵分析》代码Ⅱ——gauss消元法,列主元素法,总体主元素法matlab实现

《矩阵分析》代码Ⅱ

(一)gauss消元法

1.1 算法思想
(1)算法大体思想:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)算法具体实现:

在这里插入图片描述

1.2 matlab代码实现
function X=Gauss(A,B)
%%%此函数用于通过Gauss法,计算方程组的解;
%%%输入系数矩阵A和列向量B;
%%%输出方程组的解。
[n,~]=size(A);
AB=[A,B];
for k=1:n
    for i=k+1:n
        L=-AB(i,k)/AB(k,k);
        AB(i,k)=0;
        for j=k+1:n+1
            AB(i,j)=AB(i,j)+L*AB(k,j);
        end
    end
end
a=AB(:,1:n);                 %%矩阵a为上三角矩阵
b=AB(:,n+1);
X=a_Back_subtitution(a,b);   %%调用上三角矩阵的回代法计算。

:关于第二步的回代法,直接调用了自定义的a_Back_subtitution(A,B)函数,关于该函数可以参考上一篇文章
https://blog.csdn.net/m0_46498899/article/details/109223781。最后小声说一句,没有a_Back_subtitution(A,B)函数是会报错的哟,所以记得把她也一起带走哟~~后面两种算法中也会用到滴

1.3 代码调用

在这里插入图片描述

(二)列主元素法

2.1 算法思想

在gauss消元法中,我们会发现:每进行一步都要用该步的主元素(即i步中的第i行第i列的元素)作为除数,如果某一步的主元素为0就无法进行,并且如果主元素是一个绝对值很小的数,在进行计算时就会造成截断误差过大,即产生“大数吃小数”的情况。因此我们需要对高斯消元法进行改进,于是列主元素法应运而生了。下面是关于列数元素法的算法思想:

在这里插入图片描述

2.2 matlab代码实现

在代码的实现之前小编有必要说明一下,gauss消元法的本质:将方程组变换为解相同的等价方程组。在系数矩阵上表现出来的是系数矩阵的上三角化。而列主元素法只是保证每一步计算是保证主元素是该列的最大元,从而在计算机计算过程中减小误差。
下面是具体的代码实现


function X=Column(A,B)
%%%此函数用于通过列主元素法,计算方程组的解;
%%%输入系数矩阵A和列向量B;
%%%输出方程组的解X。
[n,~]=size(A);
AB=[A,B];
for k=1:n
    LK=abs(AB(k:n,k));    %%%提取第k列中的第k行到第n行的元素并取绝对值;
    M=max(LK);
    if M==0
        disp('error!!!输入的矩阵可能为奇异矩阵,请仔细检查。');
        return 
    end
    q=find(LK==M);     %%%找出最大元素在所提取的列向量中的位置;
    Rk=k+q(1)-1;
    for j=k:n+1        %%%for循环用于互换第k行和第k列主元素所在的第Rk行;
        temp=AB(k,j);
        AB(k,j)=AB(Rk,j);     
        AB(Rk,j)=temp;
    end
    for i=k+1:n        %%%for循环用于将第k列中第k行及以下元素化为0;;    
        L=-AB(i,k)/AB(k,k);
        AB(i,k)=0;
        for j=k+1:n+1
            AB(i,j)=AB(i,j)+L*AB(k,j);
        end
    end
end
a=AB(:,1:n);                    %%%提取变换后的上三角矩阵;
b=AB(:,n+1);                    %%%提取方程右端的常数项(变换后)
X=(a_Back_subtitution(a,b));    %%%利用回代法将方程的解按顺序按行输出。

2.3代码调用

在这里插入图片描述

(三)总体主元素法

3.1算法思想

在这里插入图片描述

3.2 matlab代码实现
function X=Population(A,B)
%%%此函数用于通过总体主元素法,计算方程组的解;
%%%输入系数矩阵A和列向量B;
%%%输出方程组的解X。
[n,~]=size(A);
AB=[A,B];
for k=1:n
    LK=abs(AB(k:n,k:n));    %%%提取第k列到第n列中的第k行到第n行的元素并取绝对值;
    M=max(LK);
    if M==0
        disp('error!!!输入的矩阵可能为奇异矩阵,请仔细检查。');
        return 
    end
    [p,q]=find(LK==M);     %%%找出最大元素在所提取的列向量中的位置;
    p=k+p(1)-1;
    q=k+q(1)-1;
    X_temp=1:n;
    temp0=X_temp(k);
    X_temp(k)=X_temp(q);
    X_temp(q)=temp0;
    for j=k:n+1           %%%for循环用于互换第k行和第p行;注意:
        temp1=AB(k,j);    ...由于此两行的第1到第k-1列元素为零,所以互换此两行的第k列到第n+1列;
        AB(k,j)=AB(p,j);     
        AB(p,j)=temp1;
    end
    for i=1:n          %%%for循环用于互换第kL列和第q列;
        temp2=AB(i,k);
        AB(i,k)=AB(i,q);     
        AB(i,q)=temp2;
    end
    
    for i=k+1:n        %%%for循环用于将第k列中第k行及以下元素化为0;    
        L=-AB(i,k)/AB(k,k);
        A(i,k)=0;
        for j=k+1:n+1
            AB(i,j)=AB(i,j)+L*AB(k,j);
        end
    end
end
a=AB(:,1:n);                    %%%提取变换后的上三角矩阵;
b=AB(:,n+1);                    %%%提取方程右端的常数项(变换后)
XX=(a_Back_subtitution(a,b));    %%%将方程的解按顺序按行输出。
X=zeros(n,1);
for m=1:n
    k=X_temp==m;
    X(m)=XX(k);
end

3.3 代码调用

在这里插入图片描述

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篱落~~成殇~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值