Matlab DGESV给出了错误的解决方案?

Matlab DGESV给出了错误的解决方案?,matlab,fortran,linear-algebra,Matlab,Fortran,Linear Algebra,全部。我试图通过从lapack调用DGESV来解决fortran中的Ax=B系统。 在哪里, A=[ B=[ 0 0 2. 6. 0 0 0] 可以在Matlab中通过x=A\B简单地计算x,从而得出 x= -0.5000 -0.2500 0.5000 0.2500 0 0 0 当我用Fortran做同样的事情时,它给了我完全不同的值。我的代码有什么问题吗?或者我只是在调用DGESV时出错了? 以下是我的fortran代码: program GG implicit none inte

全部。我试图通过从lapack调用DGESV来解决fortran中的Ax=B系统。 在哪里,

A=[

B=[ 0 0 2. 6. 0 0 0]

可以在Matlab中通过x=A\B简单地计算x,从而得出 x=

-0.5000 -0.2500 0.5000 0.2500 0 0 0

当我用Fortran做同样的事情时,它给了我完全不同的值。我的代码有什么问题吗?或者我只是在调用DGESV时出错了? 以下是我的fortran代码:

  program GG
  implicit none
  integer, parameter :: N=7
  integer :: i,j,ipiv(N),ok
  real(8), dimension(1:N,1:N) :: M
  real(8), dimension(1,1:N) :: b


  M(:,1)=(/1.,0.,1.,0.,1.,0.,1./)*1.d0
  M(:,2)=(/0.,1.,0.,1.,0.,1.,0./)*1.d0
  M(:,3)=(/0.,0.,2.**3/2,0.,4.**3/2,0.,6.**3/2/)*1.d0
  M(:,4)=(/0.,0.,0.,3.*(3.**2-1.),0.,5.*(5.**2-1.),0./)*1.d0
  M(:,5)=(/0.,0.,0.,0.,4.*(4.**2-2.**2),0.,6.*(6.**2-2.**2)/)*1.d0
  M(:,6)=(/0.,0.,0.,0.,0.,5.*(5.**2-3.**2),0./)*1.d0
  M(:,7)=(/0.,0.,0.,0.,0.,0.,6.*(6.**2-4.**2)/)*1.d0

  b=reshape((/0,0,2,6,0,0,0/)*1.d0,shape(b))


  call DGESV(N,1,M,N,ipiv,b,N,ok)
  write(*,*), b

  end program GG
本规范给出的结果为:

0.0000000000000000 0.0000000000000000 0.50000000000000000.2500000000000000-0.33333337-0.375000000000000008.3333315E-002


衷心感谢。

您在Fortran中创建的矩阵似乎是您在MATLAB中定义的矩阵的转置(行和列翻转)。注意(在MATLAB中):


换句话说,在Fortran中执行
M(:,1)=…
将填充第一个列,而不是第一个行。如果将它们翻转到
M(1,:)=…
等等,我想应该与MATLAB的结果相匹配。

哇,我没有注意到。非常感谢
  program GG
  implicit none
  integer, parameter :: N=7
  integer :: i,j,ipiv(N),ok
  real(8), dimension(1:N,1:N) :: M
  real(8), dimension(1,1:N) :: b


  M(:,1)=(/1.,0.,1.,0.,1.,0.,1./)*1.d0
  M(:,2)=(/0.,1.,0.,1.,0.,1.,0./)*1.d0
  M(:,3)=(/0.,0.,2.**3/2,0.,4.**3/2,0.,6.**3/2/)*1.d0
  M(:,4)=(/0.,0.,0.,3.*(3.**2-1.),0.,5.*(5.**2-1.),0./)*1.d0
  M(:,5)=(/0.,0.,0.,0.,4.*(4.**2-2.**2),0.,6.*(6.**2-2.**2)/)*1.d0
  M(:,6)=(/0.,0.,0.,0.,0.,5.*(5.**2-3.**2),0./)*1.d0
  M(:,7)=(/0.,0.,0.,0.,0.,0.,6.*(6.**2-4.**2)/)*1.d0

  b=reshape((/0,0,2,6,0,0,0/)*1.d0,shape(b))


  call DGESV(N,1,M,N,ipiv,b,N,ok)
  write(*,*), b

  end program GG
>> A = [1     0     1     0     1     0     1
        0     1     0     1     0     1     0
        0     0     4     0    32     0   108
        0     0     0    24     0   120     0
        0     0     0     0    48     0   192
        0     0     0     0     0    80     0
        0     0     0     0     0     0   120];
>> B = [0 0 2 6 0 0 0];
>> x = A\B.'
x =
   -0.5000
   -0.2500
    0.5000
    0.2500
         0
         0
         0
>> x = (A.')\B.'  % A is transposed, and you get your Fortran result
x =
         0
         0
    0.5000
    0.2500
   -0.3333
   -0.3750
    0.0833