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=(ajj−∑k=1j−1ljk2)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=(aij−∑k=1j−1likljk)/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=(bi−∑k=1i−1likyk)/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=(bi−∑k=i+1nlkixk)/lii,i=n,n−1,⋯,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站搜索头号庄稼进行观看。