【问题标题】:Implementing Laplace expansion in Fortran在 Fortran 中实现拉普拉斯展开
【发布时间】:2015-06-26 12:56:12
【问题描述】:

我必须编写一个程序,用 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|)。

【问题讨论】:

  • 编译器在哪里抱怨?我还会注意到,您的示例中似乎缺少一些内容。
  • 到目前为止,您编写的似乎是名为prec 的模块的最后两行、名为lap 的模块和名为sistema 的程序的第一行。您需要更清楚您的代码是什么,并准确了解编译器发出的错误消息。以及在源代码的哪几行。

标签: arrays fortran fortran95


【解决方案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)

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

【讨论】:

  • @francescalus 我应该更清楚地说明应该删除该行。已编辑并感谢。
  • 他也在b(:,:) = a(:,2:n) 中执行此操作,其中第一个维度上的维度不匹配(n-1 与 n)。
猜你喜欢
  • 1970-01-01
  • 2020-06-11
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多