改進的平方根法

clear

clc

A=input('請輸入對稱正定矩陣A=')

b=input('請輸入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'

for i=1:n

    L(i,i)=1;

end

for k=1:n

    t1=0;

    for j=1:k-1

        t1=t1+L(k,j)^2*d(j);

    end

    d(k)=A(k,k)-t1;

    for i=k+1:n

        t2=0;

        for j=1:k-1

            t2=t2+L(i,j)*d(j)*L(k,j);

        end

        L(i,k)=(A(i,k)-t2)/d(k);

    end

end

for k=1:n

    for i=k+1:n

        U(i,k)=L(i,k)*d(k);

    end

end

for k=2:n

    t3=0;

    for j=1:k-1

        t3=t3+U(k,j)*L(k,j);

    end

    d(k)=A(k,k)-t3;

    for i=k:n

        t4=0;

        for j=1:k-1

            t4=t4+U(i,j)*L(k,j);

        end

        U(i,k)=A(i,k)-t4;

    end

    L(i,k)=U(i,k)/d(k);

end

%分解Ax=b Ly=b  L'x=inv(D)*y

%y

for k=1:n

    t5=0;

    for j=1:k-1

        t5=t5+L(k,j)*y(j);

    end

    y(k)=b(k)-t5;

end

%x

for k=n:-1:1

    t6=0;

    for j=k+1:n

        t6=t6+L(j,k)*x(j);

    end

    x(k)=y(k)/d(k)-t6;

end

x

y

D=diag(d)

L

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章