数值分析算法 MATLAB 实践 线性方程组 Gauss消去法

数值分析算法 MATLAB 实践 线性方程组 Gauss消去法

Gauss消去法

function solution =Gauss(A,b)
%高斯消去法function solution =Gauss(A,b)
% A为方程组的系数矩阵 b为方程组的右端项;
    n = length(b);
    for k=1:n-1
        for i=k+1:n
            mik=A(i,k)/A(k,k);%消元因子
            for j=k+1:n
                A(i,j)=A(i,j)-mik*A(k,j);
            end
         b(i)=b(i)-mik*b(k);
        end
    end
    solution(n)=b(n)/A(n,n);
    for i=n-1:-1:1 
        for j=i+1:n
            solution(i)=solution(i)+A(i,j)*solution(j);
        end
        solution(i)=(b(i)-solution(i))/A(i,i);
    end
end

function solution=GaussFunmethod(gauss, Presion) 
% gauss为用户输入的增广矩阵
 % Precision为用户所输入的精度要求
    if nargin==2
      try
         digits(Precision);
      cath
         disp('你输入的精度有误');
         digits(10);
      end
    else
      digits(10);
    end     
    
    Ab=vpa(gauss)%显示输入的增广矩阵
    row=size(Ab,1);
    col=size(Ab,2);
    if ndims(Ab)~=2|(col-row)~=1
        disp('矩阵的大小有误');
        return
    end
    if det(gauss(:,1:row))==0
        disp('该方程的系数矩阵行列式为零');
        return
    end
   % 消元法
        for i=1:row
          j=i;
          while Ab(j,i)==0
                  j=j+1;
          end
          temp=Ab(i,:);
          Ab(i,:)=Ab(j,:);
          Ab(j,:)=temp;
          for k=i+1:row
              Ab(k,:)=vpa(Ab(k,:)-Ab(i,:)*Ab(k,i)/Ab(i,i));
          end
        end               
      %% 回代过程
        for i=row:-1:1
           temp=Ab(i,col);
           for k=i+1:row
                temp=vpa(temp-solution(k)*Ab(i,k));
           end
           solution(i)=vpa(temp/Ab(i,i));
        end
end

Gauss主元素消去法

function X=Gauss_Mainmethod(A,b)
%列主元方法 计算线性方程组
%A为方程组的系数矩阵 b为方程组的右端项;
    zengguang=[A b];
    Ab = [A,b]
    n=length(b);
    ra=rank(A);
    rz=rank(zengguang);
    temp1=rz-ra;
    if temp1>0
        disp('方程组无一般意义下的解,系数矩阵与增广矩阵秩不同.')
        return
    end
    if (ra==rz)
        if (ra==n)
            X=zeros(n,1); C=zeros(1,n+1);
        for p= 1:n-1
            [Y,j]=max(abs(zengguang(p:n,p))); C=zengguang(p,:);
            zengguang(p,:)= zengguang(j+p-1,:); zengguang(j+p-1,:)=C;
            for k=p+1:n
                m= zengguang(k,p)/ zengguang(p,p);
                zengguang(k,p:n+1)= zengguang(k,p:n+1)-m* zengguang(p,p:n+1);
            end
        end
        b=zengguang(1:n,n+1);A=zengguang(1:n,1:n); X(n)=b(n)/A(n,n);
        for q=n-1:-1:1
                X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);
        end
    else
            disp('方程组为欠定方程组')
        end
    X = X';
end

function x=principal_element(A,b)
%列主元方法 计算线性方程组
%A为方程组的系数矩阵 b为方程组的右端项;
[rows,~]=size(A);
aug_mat=[A,b];Ab= [A,b]
for i=1:rows
    temp_list=aug_mat(:,i);
    temp_list(1:max(1,i-1))=0;
    [~,exchange_pos]=max(abs(temp_list));
    aug_mat([i,exchange_pos],:)=aug_mat([exchange_pos,i],:);
    coefficient=aug_mat(:,i);
    coefficient=-coefficient./coefficient(i);
    coefficient(i)=0;
    aug_mat=coefficient*aug_mat(i,:)+aug_mat;
end
divisor=aug_mat((1:rows)+(0:rows:(rows*(rows-1))))';
aug_mat=aug_mat./divisor;
x=aug_mat(:,rows+1:end);
x =x';
end

Gauss-Jordan消去法

function x = GaussJordan(A, b)
%function x = GaussJordan(A, b)
%GaussJordan消去法
%A为方程组的系数矩阵 b为方程组的右端项;
n = length(b);
if size(A, 1) ~= n || size(A, 2) ~= n
    error('Matrix-vector size mismatch.');
end
Ab = [A, b]
% Perform Gauss-Jordan elimination
% augmented matrix
A = [A, b];
for k = 1 : n
    A(k, :) = A(k, :) / A(k, k);
    for i = k + 1 : n
        m = A(i, k) / A(k, k);
        A(i, :) = A(i, :) - m * A(k, :);
    end
end
for k = n : -1 : 1
    for i = k - 1 : -1 : 1
        m = A(i, k) / A(k, k);
        A(i, :) = A(i, :) - m * A(k, :);
    end
end
    x = A(:, n + 1);
    x =x';
end

你可能感兴趣的:(学习笔记总结,Matlab,算法,matlab,数学建模)