1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
program Cholesky_decomposition
implicit none
integer::i,j,k real(kind=8)::summ real(kind=8)::S(3,3)=(/ 1.0,1.0,1.0,1.0,5.0,3.0,1.0,3.0,11.0 /) real(kind=8)::L(3,3),L_inv(3,3),L_inv_T(3,3),S_inv(3,3) real(kind=8),intrinsic::sqrt,transpose,matmul write(*,*),"S matrix" write(*,"(3(f12.6,2x))"),S do i=1,3 do j=1,3 if(i>j)then summ=0.0 do k=1,j-1 summ=summ+L(i,k)*L(j,k) end do L(i,j)=(S(i,j)-summ)/L(j,j) elseif(i==j)then summ=0.0 do k=1,i-1 summ=summ+L(i,k)**2 end do L(i,j)=sqrt(S(i,j)-summ) else L(i,j)=0.0 end if end do end do write(*,*)"L matrix" write(*,"(3(f12.6,2x))"),((L(j,i),i=1,3),j=1,3) do i=1,3 do j=1,3 if(i==j)then L_inv(i,j)=1/L(i,j) elseif(i>j)then summ=0.0 do k=1,i-1 summ=summ+L(i,k)*L_inv(k,j) end do L_inv(i,j)=-1*summ/L(i,i) else L_inv(i,j)=0.0 end if end do end do write(*,*)"L_inv matrix" write(*,"(3(f12.6,2x))"),((L_inv(j,i),i=1,3),j=1,3) L_inv_T=transpose(L_inv) S_inv=matmul(L_inv_T,L_inv) write(*,*)"S_inv matrix" write(*,"(3(f12.6,2x))"),((S_inv(j,i),i=1,3),j=1,3) end program Cholesky_decomposition
|