使用FORTRAN中的平方根函数自动区分

时间:2016-07-17 11:19:54

标签: fortran automatic-differentiation

我在这个计算f(x)= sqrt(x)的fortran90函数上执行自动差分(使用Tapenade:https://www-sop.inria.fr/tropics/tapenade/refman.html)。

SUBROUTINE FFUN(X,RES)
    implicit none
    real(8), intent(in)  :: X
    real(8), intent(out) :: RES

    RES = DSQRT(X)
    RETURN
END 

我收到此错误消息:

  

(TC19)对实际的平等测试不可靠

并且文档提供了此解决方案:

  

REAL之间没有很好地定义平等和不平等,因为   它们仅被定义为给定的“机器精度”。平等测试   可以在不同的机器上产生不同的结果。

     

你为什么要关心?就AD而言,平等测试   REAL有时被用作某些迭代的停止标准   处理。然后它涉及一个众所周知的问题:做衍生物   当函数执行时会收敛,如果是,它们会收敛于   同样的速度?

     

你能做什么?检查这不会影响差异化。采取   小心对计算机进行通常的验证测试   衍生物。

但是,我不明白这个问题是如何不可避免的,因为他们要求我们检查“这不会影响差异化”。我可能认为这是一个糟糕的实现,我可以避免这个问题。

以下是Tapenade生成的代码:

SUBROUTINE FFUN_D(x, xd, res, resd) 
IMPLICIT NONE REAL*8, INTENT(IN) :: x 
REAL*8, INTENT(IN) :: xd 
REAL*8, INTENT(OUT) :: res 
REAL*8, INTENT(OUT) :: resd 
INTRINSIC DSQRT 
IF (x .EQ. 0.0) THEN 
    resd = 0.0_8 
ELSE 
    resd = xd/(2.D0*DSQRT(x)) 
END IF res = DSQRT(x) 
RETURN 
END SUBROUTINE FFUN_D

0 个答案:

没有答案