回 帖 发 新 帖 刷新版面

主题:为何计算结果不一样

以下是程序中的一段
            sty = 0.0d0
             gty = 0.d0
             gts = 0.d0
           do i = 1,n
              s(i) = xnew(i) - x(i)
              y(i) = gnew(i) - g(i)
              sts  = sts + s(i) ** 2
              sty  = sty + s(i) * y(i)
                gty  = gty  + gnew(i)*y(i)
                gts  = gts  + gnew(i)*s(i)
              x(i) = xnew(i)
              g(i) = gnew(i)
           end do

* ---------------------------------  Theta Computation (spectral) 
           if ( sty .le. 0.0d0 ) then
              theta = 1.0d+10
          else
              theta = min( 1.0d+10, max( 1.0d-10, sts / sty ) )
          end if 

 * ---------------------------------  beta Computation 
           a = 0.0d0
             do i = 1,n
                  a = a + ( theta * y(i) - s(i) ) * g(i)
             end do

              b = sty              
                if ( b .ne. 0.0d0 ) then
                  beta = a / b
                els
                  beta = 0.0d0
                end if
*----------------------- 
我的问题是:奇怪的是我把如下一段程序: 
             a = 0.0d0
             do i = 1,n
                  a = a + ( theta * y(i) - s(i) ) * g(i)
             end do

 改为        a = theta*gty-gts时,计算结果竟然不一样,真不知为啥,感谢各位高手能给予指点

回复列表 (共17个回复)

11 楼

采用a = theta*gty-gts计算时记,输入值同上问题同上,结果如下:
     1    SCG Algorithm:Extended Freudenstein & Roth       Function

 theta spectral.  betatype =  1  (Scaled Perry  -  Birgin & Martinez)

     n   iter   irs  fgcnt lscnt   time(c)        fxnew              gnorm
 ------------------------------------------------------------------------------------
  1000     13     1     26    12         1 0.2449212683962E+05 0.6580017410113E-06
  2000    124     2   3303   122        57 0.4898425367924E+05 0.7171595285111E-06
  3000    846    40  23682   840       590 0.7347638051886E+05 0.7709711995705E-06
  4000    624    33  17388   620       583 0.9796850735848E+05 0.8787408238148E-06
  5000     12     1     27    12         2 0.1224606341981E+06 0.1617668841831E-07
  6000    757    30  22346   756      1120 0.1469527610377E+06 0.9344952789620E-06
  7000     12     1     27    12         1 0.1714448878773E+06 0.1925897327399E-07
  8000   1194    47  35396  1187      2371 0.1959370147170E+06 0.9864784577684E-06
  9000    746    25  21788   745      1636 0.2204291415566E+06 0.9536979676497E-06
 10000    226    11   6147   225       517 0.2449212683962E+06 0.9336351560362E-06
 ------------------------------------------------------------------------------------
 TOTAL   4554   191 130130  4531     68.78 (seconds)    proc=  4.19%

12 楼

需要的话我把程序传给你也可

13 楼

如果不大的话可以发到我的邮箱.
yeg001@foxmail.com

14 楼

谢谢你的帮助,程序已发到你邮箱,我估计是由于计算顺序不一样致使两种算法A的值有误差而导致最终结果不一样,不知我的想法是否合理

15 楼

我也觉得有可能。 如果计算的数据非常多,而且有很多大小差异比较大的数据。这样就很可能由于误差积累而影响最后结果。但如果真的是这样,原来的程序计算出来的结果也不一定可靠了。

我现在暂时没时间, 可能晚些才能看邮箱。

16 楼

我在那个位置分别让他计算a值.
            a = 0.0d0
             do i = 1,n
                 a = a + ( theta * y(i) - s(i) ) * g(i)
             end do
           pause  85151 
           write(*, *) a
           pause 200
           
           a = theta*gty-gts
           !write(*, *) a
           pause 700
结果:

      1    SCG Algorithm:Extended Freudenstein & Roth       Function

  theta spectral  betatype= 1  stoptest= 3
Fortran Pause - 85151

   48.3611366990519
Fortran Pause - 200

   48.3611366983969
Fortran Pause - 700

Fortran Pause - 85151

   37.6277948033525
Fortran Pause - 200

   37.6277948033663
Fortran Pause - 700
...

每组数值都是一样的(最后几位不准主要是浮点数运算的截断误差). 

不过奇怪的是, 分别计算两种的时候, 输出的东西不同
TOTAL    551    15  12176   543      5.56 (seconds)    proc=  2.72%
TOTAL   4554   191 130130  4531     66.41 (seconds)    proc=  4.19%

我对这个算法不熟悉,不知道期间他做了什么比较之类的, 用a = theta*gty-gts明显慢了. 可能是这个程序对数据敏感或者什么的, 我就不清楚了.

17 楼

多谢你的解答

我来回复

您尚未登录,请登录后再回复。点此登录或注册