Bootstrap

数值分析上机实验(一)——基于matlab的平方根法

1、题目

在这里插入图片描述
在这里插入图片描述

2、平方根法

对于对称正定矩阵 A,存在唯一的下三角矩阵 L,其主对角线元素均为正,使得 A = L L T A=LL^{T} A=LLT。将线性方程组 A x = b Ax = b Ax=b 中的 A 用 L L T LL^{T} LLT 替换,得到 L L T x = b LL^{T}x=b LLTx=b。令 y = L T x y=L^{T}x y=LTx,则原方程组可转化为两个三角方程组: L y = b Ly = b Ly=b L T x = y L^{T}x=y LTx=y

3、代码原理

这部分为原理讲解,代码被拆开讲解。需要完整代码请下翻至4、代码处。
此部分代码:
清除缓存与输入所需要的矩阵
clear为清除matlab窗口右侧的工作区(运行代码产出的变量所在位置)
clc为清除matlab窗口下方的命令行窗口
A、B为题目矩阵,x0是matlab内嵌算法的计算解(可以称为精确解)

%平方根法
clear
clc
%线性方程组
A=[4,2,-4,0,2,4,0,0;
  2,2,-1,-2,1,3,2,0;
  -4,-1,14,1,-8,-3,5,6;
  0,-2,1,6,-1,-4,-3,3;
  2,1,-8,-1,22,4,-10,-3;
  4,3,-3,-4,4,11,1,-4;
  0,2,5,-3,-10,1,14,2;
  0,0,6,3,-3,-4,2,19];
B=[0;-6;6;23;11;-22;-15;45];
x0=A^(-1)*B;%精确解

此部分代码:
初始化变量
size(A,1)是A矩阵的第一个维度(行),n代表A矩阵有几行
x是最终要求的解,y是中间解。 L L T x = b LL^{T}x=b LLTx=b y = L T x y=L^{T}x y=LTx。这里把B赋值给x与y仅仅是为了初始化x与y,为了它们的矩阵维度与B一样(这题就是B、x、y都是8行1列矩阵)
zeros(n,n)是生成一个全是0元素的n行n列矩阵,L是A的分解矩阵

%主程序
n=size(A,1);
y=B;
x=B;
L=zeros(n,n);%A的分解矩阵L

此部分代码:
求解出A的分解矩阵L,由公式 A = L L T A=LL^{T} A=LLT得出
当 j=1,2,…,n 时:
l j j = ( a j j − ∑ k = 1 j − 1 l j k 2 ) 1 2 l_{jj}=\left(a_{jj}-\sum_{k=1}^{j-1}l_{jk}^{2}\right)^{\frac{1}{2}} ljj=(ajjk=1j1ljk2)21
l i j = ( a i j − ∑ k = 1 j − 1 l i k l j k ) / l j j , i = j + 1 , ⋯   , n l_{ij}=\left(a_{ij}-\sum_{k=1}^{j-1}l_{ik}l_{jk}\right)/l_{jj},i=j+1,\cdots,n lij=(aijk=1j1likljk)/ljj,i=j+1,,n

%求解L矩阵的值
for j=1:n
    L(j,j)=sqrt(A(j,j)-sum(L(j,1:j-1).^2));
    for i=j+1:n
        L(i,j)=(A(i,j)-sum(L(i,1:j-1).*L(j,1:j-1)))/L(j,j);
    end
end

此部分代码:
L y = b Ly = b Ly=b求y
y i = ( b i − ∑ k = 1 i − 1 l i k y k ) / l i i , i = 1 , 2 , ⋯   , n y_{i}=\left(b_{i}-\sum_{k=1}^{i-1}l_{ik}y_{k}\right)/l_{ii},i=1,2,\cdots,n yi=(bik=1i1likyk)/lii,i=1,2,,n

%求解Ly=B
for i=1:n
    y(i,1)=(B(i,1)-sum(L(i,1:i-1)*y(1:i-1,1)))/L(i,i);
end

此部分代码:
L T x = b L^{T}x=b LTx=b求x
x i = ( b i − ∑ k = i + 1 n l k i x k ) / l i i , i = n , n − 1 , ⋯   , 1 x_{i}=\left(b_{i}-\sum_{k=i+1}^{n}l_{ki}x_{k}\right)/l_{ii},i=n,n-1,\cdots,1 xi=(bik=i+1nlkixk)/lii,i=n,n1,,1

%求解L'x=y
L=L';
for i=n:-1:1
    x(i,1)=(y(i,1)-sum(L(i,i+1:n)*x(i+1:n,1)))/L(i,i);
end

4、代码

%平方根法
clear
clc
%线性方程组
A=[4,2,-4,0,2,4,0,0;
  2,2,-1,-2,1,3,2,0;
  -4,-1,14,1,-8,-3,5,6;
  0,-2,1,6,-1,-4,-3,3;
  2,1,-8,-1,22,4,-10,-3;
  4,3,-3,-4,4,11,1,-4;
  0,2,5,-3,-10,1,14,2;
  0,0,6,3,-3,-4,2,19];
B=[0;-6;6;23;11;-22;-15;45];
x0=A^(-1)*B;%精确解

%主程序
n=size(A,1);
y=B;
x=B;
L=zeros(n,n);%A的分解矩阵L
%求解L矩阵的值
for j=1:n
    L(j,j)=sqrt(A(j,j)-sum(L(j,1:j-1).^2));
    for i=j+1:n
        L(i,j)=(A(i,j)-sum(L(i,1:j-1).*L(j,1:j-1)))/L(j,j);
    end
end
%求解Ly=B
for i=1:n
    y(i,1)=(B(i,1)-sum(L(i,1:i-1)*y(1:i-1,1)))/L(i,i);
end
%求解L'x=y
L=L';
for i=n:-1:1
    x(i,1)=(y(i,1)-sum(L(i,i+1:n)*x(i+1:n,1)))/L(i,i);
end

5、结果

精确解:x=(1,-1,0,2,1,-1,0,2)
近似解:x=(1,-1,0,2,1,-1,0,2)

本人刚刚开始学习matlab,才疏学浅,不对之处请大家指正。
需要代码详细讲解的小伙伴可以点此链接:数值分析上机实验(一)——基于matlab的平方根法,或者去B站搜索头号庄稼进行观看。

;