Matlab | Lab4——用LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代 解线性病态方程组(系数矩阵为Hilbert矩阵)

1.要求

考虑线性方程组Hx=b,其中H为n阶Hilbert矩阵,即H=(h_{ij})_{n\times n},h_{ij}=\frac{1}{i+j-1},i,j=1,2,...,n

通过先给定解(例如取x的各个分量为1),再计算出右端向量b的办法给出一个精确解已知的问题.

(1)分别编写Doolittle LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代的一般程序;

(2)取阶数n=6,分别用 LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代去求解上述的病态方程组Hx = b;分别报告它们的数值结果(包括数值解、迭代步数)以及它们在1-范数下的计算误差。迭代法的停止条件均取为\left \| x^{(k+1)}-x^{(k)} \right \|_{1}< \varepsilon =10^{-5}

2.Matlab实现(取迭代初值为0)

2.1.1 LU分解函数

function [L,U,y,x] = LU(A, b) 
% LU矩阵分解
% inputs:
%        A:输入的系数矩阵,大小为[n,n]
%        B:输入的乘积向量,大小为n
% outputs:
%        L:下三角阵,大小为[n,n]
%        U:上三角阵,大小为[n,n]
%        y:中间矩阵,大小为n
%        x:结果矩阵,大小为n

%% 第一步:初始化
% 获取n值
[arow, acol] = size(A);

%% 计算L,U矩阵
for i=1:arow
    L(i,i)=1; %L对角线是1
end
for j=1:acol  %U第一行
    U(1,j)=A(1,j);
end
for k=2:arow  %L第一列
    L(k,1)=A(k,1)/U(1,1);
end
for m=2:(arow-1)
    for j=m:arow %m右下角缺少
        s1=0;
        for k=1:(m-1)
            s1=s1+L(m,k)*U(k,j);
        end
        U(m,j)=A(m,j)-s1;
    end
    for i=(m+1):arow
        s2=0;
        for k=1:m-1
            s2=s2+L(i,k)*U(k,m);
        end
        L(i,m)=(A(i,m)-s2)/U(m,m);
    end
end
s1=0;
for k=1:(arow-1)
    s1=s1+L(arow,k)*U(k,acol);
end
U(arow,acol)=A(arow,acol)-s1; %补上U的右下

%% 计算y
n=arow;
y(1)=b(1);
for i=2:n 
    s=0;
    for k=1:(i-1)
        s=s+L(i,k)*y(k);
    end
    y(i)=b(i)-s;
end

%% 计算x
x(n)=y(n)/U(n,n);

for i=1:(n-1)
    s=0;
    for k=0:(i-1)
        s=s+U(n-i,n-k)*x(n-k);
    end
    x(n-i)=(y(n-i)-s)/U(n-i,n-i);
end
end

2.1.2 LU分解

%% n=6
for i=1:6
    for j=1:6
        a(i,j)=1/(i+j-1);
    end
end


for i=1:6
    s=0;
    for j=1:6
        s=s+a(i,j);
    end
    b(i)=s;
end


[L1,U1,Y1,X1] = LU(a,b);
X1
Y1
L1
U1

2.2.1 Jacobi迭代函数

function [x2] = Jacobi(x1,a,b)
%输入要迭代的一组x记作x1,输出迭代后的x记作x2
n=length(x1);
s=0;
for k=2:n
    s=s+a(1,k)*x1(k);
end
x2(1)=(b(1)-s)/a(1,1);
for i=2:(n-1)
    s1=0;
    s2=0;
    for j=1:(i-1)
        s1=s1+a(i,j)*x1(j);
    end
    for j=(i+1):n
        s1=s1+a(i,j)*x1(j);
    end
    x2(i)=(b(i)-s1-s2)/a(i,i);
end
s=0;
for j=1:(n-1)
    s=s+a(n,j)*x1(j);
end
x2(n)=(b(n)-s)/a(n,n);
end

2.2.2 Jacobi迭代(结果为inf)

%% n=6
for i=1:6
    for j=1:6
        a(i,j)=1/(i+j-1);
    end
end
b=[];
for i=1:6
    s=0;
    for j=1:6
        s=s+a(i,j);
    end
    b(i)=s;
end
x1=[0,0,0,0,0,0];
x0=[1,1,1,1,1,1];
for p=0:1000000
    [x2]=Jacobi(x1,a,b);
    p=p+1;
    if norm(x2-x1,1)<0.00001
        break
    end
    x1=x2;

end
x1
p
error=norm(x1-x0,1)

2.3.1 GS迭代函数

function [x] = Guass(x,a,b)
%输入要迭代的一组x记作x1,输出迭代后的x记作x2
n=length(x);
s=0;
for k=2:n
    s=s+a(1,k)*x(k);
end
x(1)=(b(1)-s)/a(1,1);
for i=2:(n-1)
    s1=0;
    s2=0;
    for j=1:(i-1)
        s1=s1+a(i,j)*x(j);
    end
    for j=(i+1):n
        s1=s1+a(i,j)*x(j);
    end
    x(i)=(b(i)-s1-s2)/a(i,i);
end
s=0;
for j=1:(n-1)
    s=s+a(n,j)*x(j);
end
x(n)=(b(n)-s)/a(n,n);
end

2.3.2 GS迭代

%% n=6
for i=1:6
    for j=1:6
        a(i,j)=1/(i+j-1);
    end
end
b=[];
for i=1:6
    s=0;
    for j=1:6
        s=s+a(i,j);
    end
    b(i)=s;
end
x31=[0,0,0,0,0,0];
x0=[1,1,1,1,1,1];
for p=0:100000
    [x32]=Guass(x31,a,b);
     p=p+1;
    if norm(x32-x31,1)<0.00001
        break
    end
    x31=x32;
 
end
x31
p
error=norm(x31-x0,1)

  • 7
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值