列主元消去法matlab代码_列主元消去法例题详解

列主元消去法matlab代码_列主元消去法例题详解本文分析了主元素消去法与Gauss消去的区别,并摘录了列主元素消去法算法实现步骤

一、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)按列选主元列主元消去法matlab代码_列主元消去法例题详解,即:

                          列主元消去法matlab代码_列主元消去法例题详解

   (2)若列主元消去法matlab代码_列主元消去法例题详解,则停止计算(此时det(A)=0)

   (3)若ik = k,则转向(4),否则换行,即:

        列主元消去法matlab代码_列主元消去法例题详解

   (4)消元计算

        对i = k+1, k+2, …, n,

        lik = aik/akk, (|lik |≤1),

        对j = k+1, k+2, …, n,

        aijaijlikakj,

        bilikbk

   2)回代过程

     1)若ann = 0,则停止计算,det(A) = 0,否则

        bnbn/ann

     2)对i = n-1, n-2, …, 1,

        列主元消去法matlab代码_列主元消去法例题详解

三、列主元素消去法的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个元素是否为0
        if Coefficient_matrix(k,k) == 0 % if-2
            print('主对角元素错误!');
            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-3
                for i_change = k:col_coeff % for-2
                    temp = 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-3
               L_ik = Coefficient_matrix(i,k) / Coefficient_matrix(k,k); %更新L_ik
               % 更新每一行从第i个元素开始后的所有元素
               for j = k+1:col_coeff % for-4
                   Coefficient_matrix(i,j) = Coefficient_matrix(i,j) - ...
                       L_ik*Coefficient_matrix(k,j); % 更新a(i,j)
               end % for-4
               Load_matrix(i) = Load_matrix(i) - Load_matrix(k)*L_ik; % 更新b(i)
               Coefficient_matrix(i,1) = 0; 
            end % for-3
        end % if-2
    end % for-1
    % 回代过程
    r_matrix(row_coeff) = Load_matrix(row_coeff)/Coefficient_matrix(row_coeff,col_coeff);
    for k = row_coeff-1:-1:1 % for-5
        sum_temp = 0;
        for j = k+1:col_coeff % for-6
            sum_temp = sum_temp + Coefficient_matrix(k,j)*r_matrix(j);
        end % for-6
        r_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-1
    if max_val < input_k(i)  % if-1
        max_val = input_k(i);
        max_index = i;
    end % if-1
end % for-1
end

四、测试与分析

    设有如下方程组:

                   列主元消去法matlab代码_列主元消去法例题详解

    则矩阵A与B分别为:

                   列主元消去法matlab代码_列主元消去法例题详解

    调用代码:

   

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);

    计算结果为:

        列主元消去法matlab代码_列主元消去法例题详解

    与准确结果[-9,-10/3,-13/3,-3/4]’相等(存在计算舍入误差)。

    有兴趣的小伙伴还可以测试一下代码的计算效率,从理论上来讲,主元素消去法比Gauss消去法计算量更大,计算时间更长。这里就不再做进一步分析了。


今天的文章列主元消去法matlab代码_列主元消去法例题详解分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/88185.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注