转自改进的平方根法
做了一些注释和修改了函数
适用于A为对称正定矩阵:A=LDL^T(L为单位下三角矩阵,D为对角矩阵,D的对角元素di>0)
function [L,D,x,y]=improvedSqareRoot(A,b)
n=length(A(:,1)); %求A矩阵第一列的长度,即矩阵维数
%% 判断输入的矩阵是不是符合要求
for k=1:n
if (det(A(1:k,1:k)))<=0 %由于对称正定矩阵A,必有det(A)>0
disp('A矩阵不是对称正定矩阵,请重新运行程序')
end
end
%分解A,使A=L*D*L'
%% 初始化L(i,i)
for i=1:n
L(i,i)=1;
end
%% 初始化d(i) 和L(i,k)
for k=1:n
temp_sum1=0;
for j=1:k-1
temp_sum1=temp_sum1+L(k,j)^2*d(j);
end
d(k)=A(k,k)-temp_sum1;
for i=k+1:n
temp_sum2=0;
for j=1:k-1
temp_sum2=temp_sum2+L(i,j)*d(j)*L(k,j);
end
L(i,k)=(A(i,k)-temp_sum2)/d(k);
end
end
%% 初始化t(i,j)
for k=1:n
for i=k+1:n
t(i,k)=L(i,k)*d(k);
end
end
%% 转换
for k=2:n
temp_sum3=0;
for j=1:k-1
temp_sum3=temp_sum3+t(k,j)*L(k,j);
end
d(k)=A(k,k)-temp_sum3;
for i=k:n
temp_sum4=0;
for j=1:k-1
temp_sum4=temp_sum4+t(i,j)*L(k,j);
end
t(i,k)=A(i,k)-temp_sum4;
end
L(i,k)=t(i,k)/d(k);
end
%% 分解Ax=b 为 Ly=b L'x=inv(D)*y
%% 求y
for k=1:n
temp_sum5=0;
for j=1:k-1
temp_sum5=temp_sum5+L(k,j)*y(j);
end
y(k)=b(k)-temp_sum5;
end
%% 求x
for k=n:-1:1
temp_sum6=0;
for j=k+1:n
temp_sum6=temp_sum6+L(j,k)*x(j);
end
x(k)=y(k)/d(k)-temp_sum6;
end
D=diag(d)
end
测试数据:
A =[ 1.0000 -1.0000 1.0000
-1.0000 3.0000 -2.0000
1.0000 -2.0000 4.5000];
b =[ 4 -8 12];