Matlab DGESV给出了错误的解决方案?
全部。我试图通过从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代码: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
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