在Fortran中实现拉普拉斯扩展

时间:2015-06-26 12:56:13

标签: arrays fortran fortran95

我必须编写一个用Cramer方法求解线性方程的程序,并特别要求用拉普拉斯展开法找到行列式。

det A    = sum on i=1...N:(-1)**(i+1) a_i1 det ||A||_i1

其中||A||_i1A的辅助因素矩阵,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)。

1 个答案:

答案 0 :(得分:1)

很高兴看到代码中缺少的部分。但是,我认为我看到了问题:

对于尺寸a(n,n)b(n-1,n-1),您无法执行b(1:(i-1),:) = a(1:(i-1),:),因为第二维的尺寸不匹配。您应该检查辅助因子矩阵的定义 - 您应该删除以及。您应该尝试:

而不是设置b的三行
b(1:(i-1),:) = a(1:(i-1),2:n)
b(i:n,:) = a((i+1):n,2:n)

编辑:该死的,我总是混淆行和列。也许我的意思是删除而不是