高斯列主元消去法(matlab两种实现方法)

function x=LGauss(A,b)
%高斯列主元消去法
%A:系数矩阵
%b:非齐次项
[n,m]=size(A);
x=zeros(n,1);
for k=1:n-1%选定列主元
    max=0;
    for i=k:n
        if abs(A(i,k))>max
            max=abs(A(i,k));
            r=i;
        end
    end
    if max<1e-10
        return 
    end
    if r>k%交换两行位置
        for j=k:n
            z=A(k,j);
            A(k,j)=A(r,j);
            A(r,j)=z;
        end
        z=b(k);
        b(k)=b(r);
        b(r)=z;
    end
%消元
for i=k+1:n
    m1=A(i,k)/A(k,k);
    for j=k+1:n
        A(i,j)=A(i,j)-m1*A(k,j);
    end
    b(i)=b(i)-m1*b(k);
end
end
for k=n:-1:1
    for j=k+1:n
        b(k)=b(k)-A(k,j)*x(j);
    end
    x(k)=b(k)/A(k,k);
end

end


function [X,det]=LGauss_new(A,b)
%input
%A:nxn非奇异系数矩阵,b是列向量
%output:
%X:AX=b的解
%det:A的行列式
[n,n]=size(A);
det=1;
for k=1:n-1
    %寻找列主元
    [T,i]=max(abs(A(k:n,k)));ik=i+k-1;
    %判断矩阵的奇异性
    if T<=1e-6
        det=0;
        return;
    end
    if ik~=k
        lk=A(k,k:n);
        A(k,k:n)=A(ik,k:n);
        A(ik,k:n)=lk;
        m=b(k);
        b(k)=b(ik);
        b(ik)=m;
        det=-det;
    end
    %消元过程
    for i=k+1:n
        A(i,k)=A(i,k)/A(k,k);%A(k,k)!=0
        A(i,k+1:n)=A(i,k+1:n)-A(i,k)*A(k,k+1:n);
        b(i)=b(i)-A(i,k)*b(k);
    end
    det=A(k,k)*det;
end
%回代过程
if abs(A(n,n))<=1e-6
    det=0;
    return;
end
b(n)=b(n)/A(n,n);
for i=n-1:-1:1
    b(i)=(b(i)-A(i,i+1:n)*b(i+1:n))/A(i,i);
end
det=A(n,n)*det;
X=b;
end

主函数:

%% 1)

clc;clear

A=[-1 2 -2;3 -1 4;2 -3 -2];

b=[-1;7;0];

disp('第一个函数得到的解:')

x=LGauss(A,b)

disp('第二个函数得到的解:')

x=LGauss_new(A,b)

%% 2)

clc;clear

x=[14.38,11.38,7.42,6.38,8.81]';

y=[3.94,2.79,3.07,5.11,2.59]';

k=ones(5,1);

for i=1:5

xx(i)=x(i)*x(i);

xy(i)=x(i)*y(i);

yy(i)=y(i)*y(i);

end

A=[xy' yy' x y k];

b=-xx';

coef=LGauss(A,b)

运行结果:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值