Fortran 跳下悬崖计算器总是返回终点速度
我的程序是用来计算我从悬崖上跳下来时落地的速度 我解了一个微分方程。(空气阻力与速度的平方成正比。) dv/dt=g(1-v^2/v_终端^2) 正v向下 现在使用技巧dv/dt=dv/dz-dz/dt=dv/dz*v(z=高度) 整合 积分v/(1-v^2/v_终端^2)dv=积分g dz 给你 (V_终端^2/2)*ln(1-V_终端^2/V_终端^2)=gH 所以 V_final=V_终端*(1-e^(-2gh/V_终端^2))^(1/2) 现在我把它放在一个程序中,但不管我放在什么高度,它都会作为终端速度出来 我做错了什么Fortran 跳下悬崖计算器总是返回终点速度,fortran,calculation,Fortran,Calculation,我的程序是用来计算我从悬崖上跳下来时落地的速度 我解了一个微分方程。(空气阻力与速度的平方成正比。) dv/dt=g(1-v^2/v_终端^2) 正v向下 现在使用技巧dv/dt=dv/dz-dz/dt=dv/dz*v(z=高度) 整合 积分v/(1-v^2/v_终端^2)dv=积分g dz 给你 (V_终端^2/2)*ln(1-V_终端^2/V_终端^2)=gH 所以 V_final=V_终端*(1-e^(-2gh/V_终端^2))^(1/2) 现在我把它放在一个程序中,但不管我放在什么高度,
PROGRAM JUMP
IMPLICIT NONE
REAL GETV
REAL V
REAL H
REAL HGAPING
C https://en.wikipedia.org/wiki/Gaping_Gill
PARAMETER (HGAPING=98.)
WRITE(6,*) 'EXAMPLE YOU JUMP ',HGAPING,' METRES'
WRITE(6,*) 'YOU HIT GROUND AT ',GETV(HGAPING),' MPH'
10 WRITE(6,*) 'HOW HIGH DO I JUMP FROM (METRES)?'
READ(5,*) H
WRITE(6,*) 'YOU JUMP FROM ',H,' METRES'
WRITE (6,*) 'YOU HIT GROUND AT ',GETV(H),' MPH'
GOTO 10
END
FUNCTION GETV(H)
REAL GETV
REAL H
REAL G
C https://en.wikipedia.org/wiki/Standard_gravity
PARAMETER (G=9.81)
REAL VTERMIN
C https://en.wikipedia.org/wiki/Free_fall
PARAMETER (VTERMIN=53.)
REAL METPS2MPH
PARAMETER (METPS2MPH=2.2369363)
GETV=VTERMIN*SQRT(1.-EXP(-2*G*H/(VTERMIN*VERMIN)))
1 *METPS2MPH
END
注意如果它工作正常,以下是您的预期。如果你输入一个大的数,那么你应该得到大约终端速度,但是如果你输入一个小的数,那么你应该得到大约SQRT(2*G*H)。通过程序中包含的比例系数,这两个值都转换为英里/小时
这是忽略空气阻力的程序的工作版本
(1/2) m V_final^2 = m g H (simple energy equation)
但是,包括空气阻力在内的计算在某些地方出了问题。这是一个延伸的评论,而不是答案,但这些小盒子太局限了。。。穿过阻力空气的代码包括计算
GETV=VTERMIN*SQRT(1.-EXP(-2*G*H/(VTERMIN*VERMIN)))*METPS2MPH
您需要非常仔细地检查这些变量名。您犯的错误是在程序作用域中包含了隐式无
,但不在程序外部的函数作用域中
现在,有一件事绝对是一个评论:为什么你要像1985年那样写Fortran?如果你支付的教育费,包括教你如何在FORTRAN编程,要求你的大部分钱回来的课程,也许考虑转换机构。如果你在自学,扔掉你爷爷的课本,给自己买一本在过去十年左右写的。考虑到我毕业已有几十年了,我现在换大学有点晚了。幸运的是,当时我不必为我的教育付费,因此,尽管剑桥大学只教授当时可用的Fortran版本(当然仍然支持该版本),而不是预测未来的发展,显示了他们的不足,但至少我不必为此付费。你所没有做的是为重新学习这一切提供一个令人信服的理由。PS我的两个祖父都死于20世纪60年代。不管怎样,答案似乎是修改了变量名(害虫!哦,天哪,谢谢你)。。。空气阻力造成的影响比想象的要小。在张开鳃的例子中,它是83.5英里/小时,而不是98.1英里/小时。好吧,动能减少了28%,但可能比新冠病毒更致命,除非你真的很老了,还在写COBOL。打赌它仍然可以编译…不幸的是,我无法复制hammer关闭的这个,我已经VTCed了,因为错误是由打字错误造成的。如果可以的话,我会把它作为复制品关闭。我真的不认为它继续存在会增加任何东西。也很难看到有
隐式none
缺失,因为函数没有从视觉上与程序体分离。
GETV=VTERMIN*SQRT(1.-EXP(-2*G*H/(VTERMIN*VERMIN)))*METPS2MPH