计算方法总体选主元素消去法求线性方程组的解

 function x=zongti(A,b)
% 用总体选主元素消去法求线性方程组的解
% A为系数矩阵(要求解惟一,则必须为满秩方阵 n*n),b为右值 n*1
% x为所求的根 n*1

% 作者:野渡无人
% 最后修改日期:2008.3.27

% 如:
%   A=[2 4 -2 -2;1 2 4 -3;-3 -3 8 -2;-1 1 6 -3],b=[-4 5 7 7]'
%   x=zongti(A,b)
% 结果为:

% AA =
%
%     2     4    -2    -2    -4
%     1     2     4    -3     5
%    -3    -3     8    -2     7
%    -1     1     6    -3     7


% AA =
%
%    8.0000   -3.0000   -3.0000   -2.0000    7.0000
%         0    3.5000    2.5000   -2.0000    1.5000
%         0         0   -1.0714   -0.6429   -3.6429
%         0         0         0    1.0000    4.0000

%  x =
%
%      1
%      2
%      3
%      4

[m,n]=size(A);
if m~=n
    error('请输入方阵!');
end
rankA=rank(A);
if rankA~=m
    error('输入的矩阵不是满秩矩阵,请重新输入!');
end

AA=[A,b]
I=eye(m);   %单位矩阵,在选取总体最大元素中,要进行列变换时将用到
n=n+1;
for i=1:m-1
    % 在系数矩阵中选取绝对值最大的元素以及相应的下标号(flag1,flag2)
    max=abs(AA(i,i));
    flag1=i;
    flag2=i;
    for j=i+1:m
        for k=i+1:m
            if max < abs(AA(j,k))
                flag1=j;
                flag2=k;
                max=abs(AA(j,k));
            end
        end
    end
   
    if max==0
        error('本列主元素已为零,不能继续!');
    end
   
     % 交换第i行与第flag1行的元素
    if flag1~=i
        temp=AA(i,:);
        AA(i,:)=AA(flag1,:);
        AA(flag1,:)=temp;
    end
   
    % 交换第i列与第flag2列的元素
    if flag2~=i
        temp=AA(:,i);
        AA(:,i)=AA(:,flag2);
        AA(:,flag2)=temp;
  
    % 由于有列变换,所以所求的根x向量也应有相应的列变换,使得与用户预期结果的一致
    % 解决方法是左乘以相应的初等矩阵
        Itemp=I(:,i);
        I(:,i)=I(:,flag2);
        I(:,flag2)=Itemp;
    end
       
    % 以下的算法类同Guass-Jordan 法
    for k=i+1:m
        AA(k,i:n)=AA(k,i:n)-(AA(k,i)/AA(i,i))*AA(i,i:n);
    end
end
disp(AA);

% 求根
x=zeros(m,1);
x(m)=AA(m,n)/AA(m,m);
for i=m-1:-1:1
    x(i)=(AA(i,n)-AA(i,i+1:m)*x(i+1:m,1))/AA(i,i);
end
% 纠正最后结果
x=I*x;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值