【问题标题】:Why do I get run time error Reference at undefined variable?为什么在未定义的变量处出现运行时错误参考?
【发布时间】:2020-05-11 17:43:52
【问题描述】:

我正在使用 Runge-Kutta 4 阶方法来整合像卫星这样的点的运动。程序的编译是OK的。但是当我尝试运行它时运行时错误 112

Reference at undefined variable,array element or function result (/UNDEF)

显示在第 19 行。我已经多次更改循环条件,但没有任何变化。我很确定我已经声明了第 19 行中出现的每个数量(我在这里写了 K1 的方程)。我使用的代码是 Fortran 95。

代码:

program SatelliteMonopoleNoDrag

implicit none

real, external :: F1,F2,F3,F4

real :: t,x,y,u,v,K0,K1,K2,K3,M0,M1,M2,M3,N0,N1,N2,N3,P0,P1,P2,P3,h

print*, " Insert t0 "

read*, t

print*, " Insert x0 "

read*, x

print*, " Insert y0 "

read*, y

print*, " Insert u0 "

read*, u

print*, " Insert v0 "

read*, v

print*, " Insert h "

read*, h

do while (t<=86400)

  K0=h*F1(t,x,y,u,v)

  K1=h*F1(t+h/2.,x+K0/2.,y+M0/2.,u+N0/2.,v+P0/2.)

  K2=h*F1(t+h/2.,x+K1/2.,y+M1/2.,u+N1/2.,v+P1/2.)

  K3=h*F1(t+h,x+K2,y+M2,u+N2,v+P2)

  M0=h*F2(t,x,y,u,v)

  M1=h*F2(t+h/2.,x+K0/2.,y+M0/2.,u+N0/2.,v+P0/2.)

  M2=h*F2(t+h/2.,x+K1/2.,y+M1/2.,u+N1/2.,v+P1/2.)

  M3=h*F2(t+h,x+K2,y+M2,u+N2,v+P2)

  N0=h*F3(t,x,y,u,v)

  N1=h*F3(t+h/2.,x+K0/2.,y+M0/2.,u+N0/2.,v+P0/2.)

  N2=h*F3(t+h/2.,x+K1/2.,y+M1/2.,u+N1/2.,v+P1/2.)

  N3=h*F3(t+h,x+K2,y+M2,u+N2,v+P2)

  P0=h*F4(t,x,y,u,v)

  P1=h*F4(t+h/2.,x+K0/2.,y+M0/2.,u+N0/2.,v+P0/2.)

  P2=h*F4(t+h/2.,x+K1/2.,y+M1/2.,u+N1/2.,v+P1/2.)

  P3=h*F4(t+h,x+K2,y+M2,u+N2,v+P2)

  x=x+(1/6.)*(K0+2*K1+2*K2+K3)

  y=y+(1/6.)*(M0+2*M1+2*M2+M3)

  u=u+(1/6.)*(N0+2*N1+2*N2+N3)

  v=v+(1/6.)*(P0+2*P1+2*P2+P3)

  t=t+h

  print*, " The values of t,x,y,u,v are " ,t,x,y,u,v

end do

print*, " The values of t,x,y,u,v are " , t,x,y,u,v

end



real function F1(t,x,y,u,v)

real :: t,x,y,u,v

F1=u

end



real function F2(t,x,y,u,v)

real :: t,x,y,u,v

F2=v

end



real function F3(t,x,y,u,v)

real, parameter :: G=6.674*(10.)**(-11)

real, parameter :: M=5.9722*10**(24)

real :: t,x,y,u,v

F3=-G*M*x/(sqrt(x**2+y**2))**3

end



real function F4(t,x,y,u,v)

real, parameter :: G=6.674*(10.)**(-11)

real, parameter :: M=5.9722*10**(24)

real :: t,x,y,u,v

F4=-G*M*y/(sqrt(x**2+y**2))**3

end

【问题讨论】:

  • 欢迎您,请拨打tour。为您的代码使用正确的格式。你需要给我们你开始的价值观。或者只是将它们作为固定值放入您的代码中。使用edit。此外,为您的功能使用模块,以避免多种类型的问题。
  • 还要注意说“错误 112”是没有意义的。例如,我的编译器不会为错误消息发出任何数字。

标签: fortran runge-kutta orbital-mechanics


【解决方案1】:

M0、M1、M2、N0、N1、N2 和 P0、P1、P2 在您的第一次迭代中未初始化,但您使用它们的值来计算 Ks

【讨论】:

  • 你是对的。非常感谢你。我想我应该改变K's,M's,N's和P's的顺序。你的回答很有帮助
猜你喜欢
  • 2021-12-16
  • 2021-08-26
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多