主题:为何计算结果不一样
lqmj
[专家分:40] 发布于 2011-05-27 17:15:00
以下是程序中的一段
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 楼
lqmj [专家分:40] 发布于 2011-06-02 23:09:00
采用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 楼
lqmj [专家分:40] 发布于 2011-06-02 23:14:00
需要的话我把程序传给你也可
13 楼
yeg001 [专家分:14390] 发布于 2011-06-02 23:49:00
如果不大的话可以发到我的邮箱.
yeg001@foxmail.com
14 楼
lqmj [专家分:40] 发布于 2011-06-03 10:19:00
谢谢你的帮助,程序已发到你邮箱,我估计是由于计算顺序不一样致使两种算法A的值有误差而导致最终结果不一样,不知我的想法是否合理
15 楼
yeg001 [专家分:14390] 发布于 2011-06-03 10:50:00
我也觉得有可能。 如果计算的数据非常多,而且有很多大小差异比较大的数据。这样就很可能由于误差积累而影响最后结果。但如果真的是这样,原来的程序计算出来的结果也不一定可靠了。
我现在暂时没时间, 可能晚些才能看邮箱。
16 楼
yeg001 [专家分:14390] 发布于 2011-06-03 13:18:00
我在那个位置分别让他计算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 楼
lqmj [专家分:40] 发布于 2011-06-03 13:40:00
多谢你的解答
我来回复