主题:求助:fortran90语法通过,但编译不通过
guosq09
[专家分:0] 发布于 2010-11-08 13:23:00
这是一个算三元二次函数最小值的程序,用的是最速下降法(程序中是function golden),假如去掉这个调用函数,程序能运行秉输出正确的梯度结果。假如要用function golden,而不用function f,和 function dt,而是直接给function golden x和A参量,同样也能运行。为什么一起用就不能通过编译(语法已通过了)??
拜托朋友们,希望能帮忙!
沙发
guosq09 [专家分:0] 发布于 2010-11-08 13:20:00
感谢兄弟姐妹的帮忙了!
源代码 如下:
program main
interface
function B(x,A)
implicit none
real::x(3),B(3)
real::A(3,3)
end function
function TD(x,A,bb)
implicit none
real::x(3),TD(3),bb(3)
real::A(3,3)
end function
end interface
real,dimension(:),allocatable::x,gradt,dir,bb
real::A(3,3)
real::x0
integer::iter,i,j
allocate (x(3),gradt(3),dir(3),bb(3))
x=(/0.0,0.0,1./) !初始值
DATA A/1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0/
!--------------------------------------------------------------------------
tol=0.001
iter=0
100 continue
bb=B(x,A)
f_result=0.0
do i=1,3
f_result=f_result+bb(i)*bb(i)
end do
print*,bb
gradt=TD(x,A,bb)
print*,gradt
daoshu2=dot_product(gradt,gradt) !梯度模的平方
mo=daoshu2**.5
dir=(-1)*gradt/mo
print*,dir !搜索方向(单位)
if(dot_product(gradt,gradt)<=tol)then
print*,'输出函数稳定点:',x
goto 101
else
x0=golden(x,dir)
x=x+x0*dir
iter=iter+1
if(iter>100)then
print*,"out"
goto 101
endif
goto 100
endif
contains
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 以下是精确线搜索0.618法子程序 ,返回步长;
function golden(x,d) result(golden_n)
real::golden_n
real::x0
real,dimension(:),intent(in)::x,d
real::x1,x2,a1,b1,f0,f1,f2,r,tol,dx
parameter(r=0.618)
tol=0.001
dx=0.1
x0=1
x1=x0+dx
f0=f(x+x0*d)
f1=f(x+x1*d)
if(f0<f1)then
4 dx=dx+dx
x2=x0-dx
f2=f(x+x2*d)
if(f2<f0)then
x1=x0
x0=x2
f1=f0
f0=f2
goto 4
else
a1=x2
b1=x1
endif
else
2 dx=dx+dx
x2=x1+dx
f2=f(x+x2*d)
if(f2>=f1)then
b1=x2
a1=x0
else
x0=x1
x1=x2
f0=f1
f1=f2
goto 2
endif
endif
x1=a1+(1-r)*(b1-a1)
x2=a1+r*(b1-a1)
f1=f(x+x1*d)
f2=f(x+x2*d)
3 if(abs(b1-a1)<=tol)then
x0=(a1+b1)/2
else
if(f1>f2)then
a1=x1
x1=x2
f1=f2
x2=a1+r*(b1-a1)
f2=f(x+x2*d)
goto 3
else
b1=x2
x2=x1
f2=f1
x1=a1+(1-r)*(b1-a1)
f1=f(x+x1*d)
goto 3
endif
endif
golden_n=x0
end function golden
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
101 end program main
function B(x,A)
real::x(3),B(3)
real::A(3,3)
integer::i,j
do i=1,3
B(i)=0.
do j=1,3
B(i)=B(i)+A(i,j)*x(j)
end do
end do
return
end function B
!!!!!!!!!!!!!!!!!!!!!!!!!!
function TD(x,A,bb)
implicit none
real::x(3),bb(3)
real::A(3,3)
real::TD(3)
integer::i,j
do i=1,3
TD(i)=0.
do j=1,3
TD(i)=TD(i)+2*(bb(j)*A(j,i))
end do
end do
return
end function TD