跪求fortran的程序问题,全局和局部变量的问题,跪求大神解答,附上程序,坐等大神解答
if(Nls.eq.1)thencallinexls(n,x,f,g,d,0.01d0,0.1d0,alpha,ncalf,ncalg,iprint,*info)else...
if (Nls.eq.1) then
call inexls(n,x,f,g,d,0.01d0,0.1d0,alpha,ncalf,ncalg,iprint,
* info)
else
call inwfls(n,x,f,g,d,0.01d0,0.1d0,alpha,ncalf,ncalg,iprint,
* info)
end if
gg=ddot(n,g,1,g,1)
gnorm=dsqrt(gg)
if(gnorm.le.eps) go to 1000
if(info.gt.0) go to 1020
if((oldf-f)/(1.0d0+dabs(f)) .lt. 1.0d-16) go to 1030
gog=ddot(n,g,1,og,1)
ogod=ddot(n,og,1,d,1)
god=ddot(n,g,1,d,1)
odod=ddot(n,d,1,d,1)
call compbeta(alpha,gg,ogog,gog,ogod,god,odod,Nver,temp)
do 60 i=1,n
d(i)=-g(i)+temp*d(i)
60 continue
dgo=dg
dg=ddot(n,d,1,g,1)
if(dg.lt.0.0d0) go to 90
write(6,2160) iter
do 70 i=1,n
d(i)=-g(i)
70 continue
想让60上面的d(i)=-g(i)+temp*d(i)增加一个系数gk,使得原等式为d(i)=-gk*g(i)+temp*d(i),而gk的值的判断标准是子程序 call compbeta(alpha,gg,ogog,gog,ogod,god,odod,Nver,temp),中的temp取值。我所需要的是当temp=tempcd时gk为(dog-odog)/ogog,其他时候等于一,附上compbeta的程序
subroutine compbeta(alpha,gg,ogog,gog,ogod,god,odod,Nver,temp)
implicit double precision (a-h,o-z)
integer Nver
real*8 mpar
gy=gg-gog
dy=god-ogod
tempfr=gg/ogog
tempcd=-gg/ogod
tempdy=gg/dy
tempprp=gy/ogog
temphs=gy/dy
c
go to (10,20,30,40,50,60,70) Nver
c
10 temp=tempfr
return
20 temp=tempdy
return
30 temp=tempprp
return
40 temp=temphs
return
50 continue
temp=dmax1(0.0d0,dmin1(tempprp,tempfr))
return
60 temp=dmax1(0.0d0,dmin1(temphs,tempdy))
return
70 temp=tempcd
return
end
这个程序比较大,这个只是一小部分 展开
call inexls(n,x,f,g,d,0.01d0,0.1d0,alpha,ncalf,ncalg,iprint,
* info)
else
call inwfls(n,x,f,g,d,0.01d0,0.1d0,alpha,ncalf,ncalg,iprint,
* info)
end if
gg=ddot(n,g,1,g,1)
gnorm=dsqrt(gg)
if(gnorm.le.eps) go to 1000
if(info.gt.0) go to 1020
if((oldf-f)/(1.0d0+dabs(f)) .lt. 1.0d-16) go to 1030
gog=ddot(n,g,1,og,1)
ogod=ddot(n,og,1,d,1)
god=ddot(n,g,1,d,1)
odod=ddot(n,d,1,d,1)
call compbeta(alpha,gg,ogog,gog,ogod,god,odod,Nver,temp)
do 60 i=1,n
d(i)=-g(i)+temp*d(i)
60 continue
dgo=dg
dg=ddot(n,d,1,g,1)
if(dg.lt.0.0d0) go to 90
write(6,2160) iter
do 70 i=1,n
d(i)=-g(i)
70 continue
想让60上面的d(i)=-g(i)+temp*d(i)增加一个系数gk,使得原等式为d(i)=-gk*g(i)+temp*d(i),而gk的值的判断标准是子程序 call compbeta(alpha,gg,ogog,gog,ogod,god,odod,Nver,temp),中的temp取值。我所需要的是当temp=tempcd时gk为(dog-odog)/ogog,其他时候等于一,附上compbeta的程序
subroutine compbeta(alpha,gg,ogog,gog,ogod,god,odod,Nver,temp)
implicit double precision (a-h,o-z)
integer Nver
real*8 mpar
gy=gg-gog
dy=god-ogod
tempfr=gg/ogog
tempcd=-gg/ogod
tempdy=gg/dy
tempprp=gy/ogog
temphs=gy/dy
c
go to (10,20,30,40,50,60,70) Nver
c
10 temp=tempfr
return
20 temp=tempdy
return
30 temp=tempprp
return
40 temp=temphs
return
50 continue
temp=dmax1(0.0d0,dmin1(tempprp,tempfr))
return
60 temp=dmax1(0.0d0,dmin1(temphs,tempdy))
return
70 temp=tempcd
return
end
这个程序比较大,这个只是一小部分 展开
1个回答
展开全部
不太理解问题与全局和局部变量有什么关系,如想实现,直接在 call compbeta(...)中返回tempcd的值,在下面插入赋值gk的语句就可以。
call compbeta(.....,temp,tempcd)
gk=1
if(temp==tempcd) gk=(dog-odog)/ogog
......
call compbeta(.....,temp,tempcd)
gk=1
if(temp==tempcd) gk=(dog-odog)/ogog
......
更多追问追答
追问
无法实现,追踪gk总是显示1,能不能给个联系方式,想具体问问
追答
Nver=7时呢?temp=tempcd也不执行吗
无法显示联系方式(被屏蔽)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询