回 帖 发 新 帖 刷新版面

主题:如何找错误

我是初学者,尝试编写一个简单问题的程序,一种写法是没有用到SUBRUTINE编出,另一种写法是用到subroutine,call ,但是二者计算结果相差甚远,我估计可能是用了subroutine的程序出错了,但试了几次也不知错在哪,恳请高手指点

回复列表 (共20个回复)

沙发


不会Debug的话,关键中间结果打印出来,看哪里不对劲,自己编的程序自己应该清楚哪些地方可能出错。

自己不会看的话,请帖代码。

另设置断点,Debug运行也是必须会的。

板凳

program dinit
!one dimension
intrinsic atan
real*8  x,namda,f,s,a,b,phi,phiba,xtry,ftry,dff,gapploc,aphi,dfirst

x = 100.0d0
namda = 1.0d-4
shift = 1.39174521
F = atan(X-shift)
s = sqrt(x*x+f*f)
b = f/s-1
a = x/s-1
phi = x+F-s
phiba = b*phi
Xtry= x+namda*phiba
ftry = atan(xtry - shift)
dff =ftry-f
Gapploc = dff/namda
aphi = a*phi
Gapp = aphi+Gapploc
dfirst = -gapp
print *,'x=',x
print *,'F=',f
print *,'Xtry=',Xtry
print *,'ftry=',ftry
print *,'DFF=',dff
print *,'a=',a
print *,'b=',b
print *,'Gapploc=',Gapploc
print *,'aphi=',aphi
print *,'dfirst=',dfirst
print *,'namda=',namda

END 


另一个含有subroutine的程序为
program firststep
external initpoint,Gapproximate, direction

parameter n=1
real*8 x(n)
real*8 a,dfirst(n)
real*8 gapprox


parameter namda = 1.0d-4


call initpoint(N)
call Gapproximate(N,numf,namda,Gapprox,a)
call direction(N,dfirst,numf,namda)
print *,'dfirst=',dfirst
print *,'namda=',namda
print *,'numf=',numf
print *,'a=',a

end

subroutine initpoint(N)


real*8 x(n)

do I=1,N
X(I) = 100.0D0
endDO
END SUBROUTINE

subroutine Gapproximate(N,numf,namda,Gapprox,a)
 integer I,N,numf
 
 real*8 x(n),F(n),a(n),b(n),dff(n),phi(n),phiba(n),Gapprox(n),Gapproxloc(n),Xtry(n),Ftry(n)
 real*8 sqxf
 intrinsic SQRT
 external fcycle
 numf = 0
 call fcycle(n,x,f)
 numf = numf+1
 do I = 1,N
 sqxf = SQRT(X(I)*X(I)+F(I)*F(I))
 a(I) = X(I)/sqxf-1
 b(I) = F(I)/sqxf-1
 phi(I) = X(I)+F(I)-sqxf
 phiba(I) = b(I)*phi(I)
 Xtry(I) = X(I)+namda*phiba(I) 
 ENDDO

 call fcycle(N,Xtry,Ftry)
 !numf denote the times of function evaluation
 numf = numf+1
 DO I = 1,N
 Gapproxloc(I) = (Ftry(I)-F(I))/namda
 Gapprox(I) = a(I)*phi(I)+Gapproxloc(I)
 dff(I) = Ftry(I)-F(I)
 enddo
 end subroutine

subroutine direction(N,dfirst,numf,namda)

 integer I,N
 real*8 belta,theta,Gbefnorm
 real*8 Gnamda(n),Gbef(n),y(n),d(n),dfirst(n)
 external Gapproximate

 
 call Gapproximate(N,numf,namda,Gbef,a)
 
 
DO I = 1,N
dfirst(I) = -Gbef(I)
ENDDO

end subroutine

 subroutine fcycle(n,X,f)
!one dimension
intrinsic atan
real*8 F, X,shift
shift = 1.39174521
F = atan(X-shift)
RETURN
END 

3 楼

哪位高人知道错误在哪?我想应该不难的,是本人太菜

4 楼


你拿一个编译都不能通过的程序来干嘛?要别人帮你修改吗?!

5 楼


我原来能编译过的,可能是有些地方贴错了吧,我自己看看吧

6 楼

不包含implicit none的代码一般不看.

7 楼

[quote]不包含implicit none的代码一般不看.[/quote]
沒用足夠有效注釋的程序一般也不愛看——除非是本專業程序:)

8 楼

subroutine initpoint(N)
real*8 x(n)
do I=1,N
X(I) = 100.0D0
endDO
END SUBROUTINE

不说别的, 这个subroutine就完全没道理,要做什么?
估计下面你还是犯了同样的错误。

9 楼

还是把 教材上的子程序这一节研究透彻了再作尝试

10 楼


8楼:那个子程序没问题,那是赋初始值

我来回复

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