为什么我的程序返回的结果不正确?

阿博阿马尔

在最初在MATLAB中编写(并优化)它之后,我在Fortran中编写了著名的频谱范数算法天真转换为Fortran后的加速速度至少为18倍,但问题是Fortran程序的输出不准确。正确的输出应该是1.274224153我的Fortran程序输出1.273722712但是我在Fortran中做错了什么?

program perf_spectralnorm
implicit none
integer, parameter :: n = 5500, dp = kind(0.d0) 
real(dp) :: u(n) = 1, v(n), w(n), vBv, vv, res
integer  :: i, j, nvec(n)

nvec = [(i, i=1,n)]
do i = 1,10
   call Au(w, u)   ! change w
   call Atu(v, w)  ! change v
   call Au(w, v)   ! change w
   call Atu(u, w)  ! change u
end do
vBv = dot_product(u, v) 
vv  = dot_product(v, v)
res = sqrt(vBv/vv)

print '(f12.9)', res

contains 

elemental real(dp) function A(i, j)
   integer, intent(in) :: i, j
   A = 1.0_dp / ((i+j) * (i+j+1.0_dP)/2 + i + 1)
end

subroutine Au(w, u)
   real(dp) :: w(:), u(:)  
   do i = 1,n 
      w(i) = dot_product(A(i-1,nvec-1) , u)  
   end do
end

subroutine Atu(v, w)
   real(dp) :: v(:), w(:)     
   do i = 1,n  
      v(i) = dot_product(A(nvec-1,i-1) , w)       
   end do
end

end program perf_spectralnorm

我在MATLAB中的原始实现具有正确的输出如下:

n = 5500; 
fprintf("%.9f\n", perf_spectralnorm(n))

function res = A(i,j) 
    res = 1 ./ ((i+j) .* (i+j+1)/2 + i + 1);
end

function w = Au(u,w)
    n = length(u);
    j = 1:n;
    for i = 1:n         
        w(i) = dot( A(i-1,j-1), u );
    end
end

function v = Atu(w,v)
    n = length(w);
    j = 1:n;
    for i = 1:n         
        v(i) = dot( A(j-1,i-1), w );
    end
end

function res = perf_spectralnorm(n)
    u = ones(n,1);
    v = zeros(n,1);
    w = zeros(n,1);
    for i = 1:10
        w = Au(u,w);
        v = Atu(w,v);
        w = Au(v,w);
        u = Atu(w,u);
    end
    vBv = dot(u,v);
    vv  = dot(v,v);
    res = sqrt(vBv/vv);
end
evets

子例程,Au通过主机关联Atu将变量i用于do循环。这修改了i主程序中的do-loop变量,该变量无效。要解决此问题,您需要iAu中将其声明为局部变量Atu例如,

subroutine Au(w, u)
     real(dp), intent(out) :: w(:)
     real(dp), intent(in)  :: u(:)
     integer i
     do i = 1, n 
        w(i) = dot_product(A(nvec-1,i-1), u)  
     end do
  end

注意,我已经自由地也包含INTENT了哑元参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

isAbstract()返回修改不正确的结果 - 为什么?

为什么我对象的ArrayList循环的结果是不正确的?

为什么我对象的ArrayList循环的结果是不正确的?

为什么总和的平均结果不正确?

无法弄清楚为什么我的输出对于该程序不正确

为什么Date.parse给出不正确的结果?

为什么在某些情况下我的程序输出不正确?

为什么从OpenMP程序得到不正确的结果?

为什么检查多个条件会返回不正确的结果

为什么我的光标返回一些不正确的信息?

为什么此哈希表产生不正确的结果?

为什么我的Hovertool(来自bokeh)显示不正确的结果?

libc hypot函数似乎为double类型返回不正确的结果...为什么?

为什么我会收到“单变量”警告和不正确的结果?

为什么我的代码获得平均结果似乎不正确?

为什么我的通知小程序显示不正确?

为什么我的图像不正确?

程序返回不正确

为什么我的代码对大数给出的结果不正确?

为什么我的数学不正确

为什么返回类型不正确

小程序输出不正确。为什么这个 String 变量没有做我想要的?

为什么循环中函数的结果不正确?

为什么我的测验结果显示不正确?

为什么我的 Rust StackDFS 实现会产生不正确的结果?

为什么在 C 中使用这个按位宏时我的结果不正确

为什么 persistenceEnabled: true 会导致我的查询给出不正确的结果?

为什么我的应用程序图标在 Apple App Store 上显示不正确?

为什么 VPMOVMSKB 似乎产生了不正确的结果?