一、求解对称正定方程组的平方根
代码:
%% 0.平方根法解线性方程组,输出L矩阵和根
%% 1.对称正定矩阵的Cholesky分解
%对称正定矩阵A存在唯一的对角元素均为正数的下三角矩阵L,使得A=L*L(转置)
%这种分解叫做Cholesky分解
A=[3,3,5;3,5,9;5,9,17];
b=[0;-2;-4];
%判断矩阵A是否对称正定,对称+所有顺序主子式为正
L=zeros(3);
%求下三角矩阵L
L(1,1)=sqrt(A(1,1));%L11
L(2,1)=A(2,1)/L(1,1);%L21
L(3,1)=A(3,1)/L(1,1);%L31
L(2,2)=sqrt(A(2,2)-L(2,1)*L(2,1));%L22
L(3,2)=(A(3,2)-L(3,1)*L(2,1))/L(2,2);%L32
L(3,3)=sqrt(A(3,3)-L(3,1)*L(3,1)-L(3,2)*L(3,2));%L33
L%输出L矩阵
%% 2.由Ly=b得到y
y=L\b;
%% 3.由L_转置*x=y得到方程组的解x
x=L'\y%输出线性方程组的根
运行结果:
二、高斯赛德尔迭代法求解线性方程组
代码:
clear;clc
format compact
%% 输入线性方程组矩阵,A为系数矩阵,C为常数列向量。
A = [7 2 1 -2 ;
9 15 3 -2 ;
-2 -2 11 5
1 3 2 13];% 相关系数矩阵
C = [4;7;-1;0];% 常数列向量
n=length(A);
X = ones(n,1);
Error_eval = ones(n,1);
%% 检查矩阵是否是完全严格对角占优矩阵,如果不是则无解。
for i = 1:n
j = 1:n;
j(i) = [];
B = abs(A(i,j));
Check(i) = abs(A(i,i)) - sum(B);
if Check(i) < 0
fprintf('矩阵在第%3i行上不是严格的对角线\n\n',i)
end
end
%% 迭代过程如下
k = 0;
while max(Error_eval) > 0.001
k = k + 1;
Z = X;
for i = 1:n
j = 1:n;
j(i) = [];
Xtemp = X;
Xtemp(i) = [];
X(i) = (C(i) - sum(A(i,j) * Xtemp)) / A(i,i);
end
Xsolution(:,k) = X;
Error_eval = sqrt((X - Z).^2);
end
%% 结果
GaussSeidelTable = [1:k;Xsolution]' %输出迭代过程
Solution = [A X C] %输出迭代结果
运行结果:
以上为在Maltab中实现C++的基本运算。