我必须编写一个用Cramer方法求解线性方程的程序,并特别要求用拉普拉斯展开法找到行列式。
det A = sum on i=1...N:(-1)**(i+1) a_i1 det ||A||_i1
其中||A||_i1
是A
的辅助因素矩阵,n-1 X n-1
矩阵,通过消除i
行和1列创建。
那就是我被困的地方。
这是我到目前为止所写的
integer, parameter :: rk= selected_real_kind(6)
end module prec
module lap
use prec
implicit none
contains
recursive function det(a,n) result (d)
real(kind=rk), intent(in), dimension(n,n) :: a
real(kind=rk), dimension(n-1,n-1) :: b
real(kind=rk) :: d
integer ::i
integer, intent(in)::n
if (size(a) > 4) then
do i=1,n
b(1:(i-1),:) = a(1:(i-1),:)
b(i:n,:) = a((i+1):n,:)
b(:,:) = a(:,2:n)
d= ((-1)**(i+1))*a(i,1)*det(b,n)
end do
else
d = a(1,1)*a(2,2)-a(1,2)*a(2,1)
end if
end function det
end module lap
program sistema
它一直告诉我,我有不符合要求的数组,即使我使用了子集(我的教授说它很容易获得| A | with subsets)。
答案 0 :(得分:1)
很高兴看到代码中缺少的部分。但是,我认为我看到了问题:
对于尺寸a(n,n)
和b(n-1,n-1)
,您无法执行b(1:(i-1),:) = a(1:(i-1),:)
,因为第二维的尺寸不匹配。您应该检查辅助因子矩阵的定义 - 您应该删除列以及行。您应该尝试:
b(1:(i-1),:) = a(1:(i-1),2:n)
b(i:n,:) = a((i+1):n,2:n)
编辑:该死的,我总是混淆行和列。也许我的意思是删除行而不是列?