【发布时间】:2017-07-16 13:59:04
【问题描述】:
我正在尝试将我的函数 f 设置为一个数组,但出现以下错误:
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x6f8b36e3
#1 0x6f8a2722
#2 0x402752
#3 0x747bd411
我必须为M 的每个值求解开普勒方程:f=psi-e*sin(psi)-M。所以,如果我有一个维度为 8 的数组 M,我的程序将计算 8 个零。问题是,如果我写 f=psi-e*sin(psi)-M(1) 我将计算第一个零,如果我写 f=psi-e*sin(psi)-M(8) 我将计算最后一个零。但是,我的问题是,如果我想一次计算所有零,我会必须写f=psi-e*sin(psi)-M(1:8),我的程序应该输入全零,但是,这并没有发生,我得到了我前面提到的错误。这里是代码:
子程序(我在外部使用):这个子程序是二分法(取零):
subroutine bisecc(f,xl,xr,kmax,tol,k,xm)
implicit real*8 (a-h,o-z)
real*8 f
fl=f(xl)
fr=f(xr)
if(fl*fr .gt. 0.0D0) goto 100
do k=1,kmax
xm=(xr+xl)/2.0D0
fm=f(xm)
dif=abs((xr-xl)/xm)
if(dif .lt. tol) goto 200
write(*,*) k,xm!,dif
if (fm*fr .le. 0.0D0) then
xl=xm
fl=fm
else
xr=xm
fr=fm
end if
end do
return
200 write(*,*) 'WISHED PRECISION REACHED'
return
100 write(*,*) 'BAD CHOICE OF DATA'
return
end
主程序:
include 'bisecc.f'
implicit real*8 (a-h,o-z)
external f
real*8 f
! I WRITE THE INTERVAL OF MY 8 ZEROS(left and right point)
b=0.1D0
xl1=-0.5D0
xr1=0.D0
xl2=xr1+b
xr2=1.D0
xl3=xr2+b
xr3=2.D0
xl4=xr3+b
xr4=3.D0
xl5=xr4+b
xr5=4.D0
xl6=xr5+b
xr6=5.D0
xl7=xr6+b
xr7=6.D0
xl8=xr7+b
xr8=7.D0
kmax=100
tol=0.0001D0
call bisecc(f,xl1,xr1,kmax,tol,k,xm1)
call bisecc(f,xl2,xr2,kmax,tol,k,xm2)
call bisecc(f,xl3,xr3,kmax,tol,k,xm3)
call bisecc(f,xl4,xr4,kmax,tol,k,xm4)
call bisecc(f,xl5,xr5,kmax,tol,k,xm5)
call bisecc(f,xl6,xr6,kmax,tol,k,xm6)
call bisecc(f,xl7,xr7,kmax,tol,k,xm7)
call bisecc(f,xl8,xr8,kmax,tol,k,xm8)
write(*,*) 'Program ended'
stop
end program
real*8 function f(psi)
implicit real*8 (a-h,o-z)
real*8 M(8)
dimension f(8)
e=0.2056D0
pi=acos(-1.0D0)
M=(/pi/4.D0,pi/2.D0,3.D0/4.D0*pi,pi,5.D0/4.D0*pi,3.D0*
& pi/2.D0,7.D0/4.D0*pi,2.D0*pi/)
c=sqrt((1.0D0-e)/(1.0D0+e))
f=psi-e*sin(psi)-M(1:8) !KEPLER EQUATION
return
end function
示例:
这里我想计算 M 的第一个值 M(1)=pi/4 的 psi 值。
在http://imgur.com/a/Xdsgf 中,您可以看到psi=0.95303344726562489。所以我刚刚计算了第一个零。但是,您也可以看到这条消息 7 次 datos mal elegidos。这意味着程序只能向我显示那个零(对于M(1)),而其他7 个零没有计算出来,因为我写了f=psi-e*sin(psi)-M(1)。
我应该写什么才能得到 all 零而不是 1 的结果,就像在这个例子中一样?
【问题讨论】:
-
您必须展示编写代码的代码。请使用
-g -fbacktrace -fcheck=all -Wall或等效代码编译您的代码,然后重试并报告输出。 -
我没有得到编译错误或构建错误,当我执行程序时得到它并显示在 cmd 中。
-
如果你想检查代码,你可以给我你的电子邮件地址,我会把两个文件都发给你。f所以你在你自己的电脑上运行它,只有你想要的时候
-
我提交了一个新问题,如果你知道答案,它可能是解决这个问题的绝佳选择:"stackoverflow.com/questions/42460615/…"
-
可以将 f() 更改为返回数组的函数,但如果它用于二等分,那么保持它只是一个标量函数并调用二等分例程不是更好吗?输入数组的每个元素...?
标签: arrays function fortran dimension geany